Jump to content
Sign in to follow this  
Umbus

Gerador de palavras sequencial

Recommended Posts

Umbus

Boas, eu ja tenho este codigo mas queria separar isto por partes e não estou a ver como faço, preciso de ajuda.

O meu codigo é:

function generar($palavra, $char, $position, $max) 
{

        for ($i = 97; $i < 123; $i++) {
	$palavraf = "";
                $char[$position] = chr($i);

			for ($j = 0; $j <= $position; $j++) {
				$palavraf .= $char[$j];
			}
			    echo "O servidor verificou: ".$palavraf." não é este o texto<br />";
			if ( sha1($palavraf) == $palavra)
			{
				echo "O servidor encontrou o texto<br />O texto é ".$palavraf;
				break;
			}

                if (!($position == $max))
                        generar($palavra, $char, $position + 1, $max);
        }
}               

switch($_GET['action'])
	{
		case 'generar':
        	generar($_GET['palavra'], $char ="", 0, $_GET['caracteres']-1);
        	break;
                
	}

Com isto tenho o output:

aaaaa

aaaab

aaaac

aaaad

...

aaaba

aaabb

aaabc

aaabd

...

etc

O que quero agora e dividir isto por partes ou seja, o utilizador da um valor e a a primeira letra vai de x a x por exemplo:

O utilizador quer que ele so pesquise a primeira letra de a a d entao

aaaaa

aaaab

...

dzzzzz

E acaba

Se o utilzador prefere antes uma pesquisa de f a z entao:

faaaa

faaab

...

zzzzzz

E acaba

Como faço isto?


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
faianca

Uma coisa que nao entendi,

faaaa

faaab

...

zzzzzz

queres acabar em fzzzz ou zzzzzz neste caso?

se sim(fzzz), podes usar sempre a $position como flag, e como sabes que incrementas + 1 na $position em cada loop, podes saber o valor ASCII da letra

$start = ord($_GET['palavra'][$position]);

for ($i = $start; $i < 123; $i++)

<?php
echo '<pre>';
// define max de letras / se nao tivermos o get usa-se o 3 por default
$max = (isset($_GET['palavra']))?strlen($_GET['palavra']):3;

function generar($palavra, $char, $position, $max) {

    // Calcula quantas letras temos
    $numLetras = (isset($_GET['letras']))?strlen($_GET['letras']):0;

    if($numLetras > 0 && $position != $numLetras + 1):
        $start = ord($_GET['letras'][$position]);
    else:
        $start = 97;
    endif;

    for ($i = $start; $i < 123; $i++):
       
        // palavra: casa, letras: cbsa , script para no cb
        if(ord($_GET['palavra'][$position]) < ord($_GET['letras'][$position])):
            echo "o servidor nao encontrou";
            exit;
        endif;

        $palavraf = "";
        $char[$position] = chr($i);

        for ($j = 0; $j <= $position; $j++):
            $palavraf .= $char[$j];
        endfor;

        echo $palavraf."<br />";

        if ($palavraf == $palavra):
            echo "O servidor encontrou o texto<br />O texto e " . $palavraf;
            exit;
        endif;
       
        // $max - 1 , porque se max for igual a 2, equivale a 3 porque começamos do 0, 1 , 2 
        if ($position != $max - 1):
            generar($palavra, $char, $position + 1, $max);
        endif;
        
    endfor;
}

if(isset($_GET['palavra'])):
        generar($_GET['palavra'], $char = "", 0, $max);
else:
    echo 'insira uma palavra';
endif;


Share this post


Link to post
Share on other sites
KTachyon

Repara. Tu ao dizeres que o utilizador vai inserir um char, estás a dizer que o teu $i da primeira função vai começar nesse char, ou seja, crias outra função que recebe um mais um char como parametro e em vez de fazeres:

for ($i = 97; $i < 123; $i++) {

fazes:

for ($i = $user_char; $i < 123; $i++) {

A partir daí, chamas a função 'generar' normal, com os restantes paramteros (com $position + 1, óbviamente).

(convém confirmar que o char que o utilizador envia é menor que 123, caso contrário, és capaz de ter resultados indesejados)

Se o utilizador pode introduzir uma série de chars, nesse caso vais ter que tirar os chars 1 a 1, recursivamente nessa função até não restar nenhum char no input do utilizador. Como só indicaste a primeira letra, será mais ou menos isto:

function generar_user($palavra, $char, $position, $max, $user_input) {
for ($i = $user_input; $i < 123; $i++) {
	$palavraf = "";
	$char[$position] = chr($i);
                                
	for ($j = 0; $j <= $position; $j++) {
		$palavraf .= $char[$j];
        }
                                
	echo "O servidor verificou: ".$palavraf." não é este o texto<br />";
                                
	if ( sha1($palavraf) == $palavra) {
        	echo "O servidor encontrou o texto<br />O texto é ".$palavraf;
        	break;
	}
                                
	if (!($position == $max))
		generar($palavra, $char, $position + 1, $max);
}
}

function generar($palavra, $char, $position, $max) {
for ($i = 97; $i < 123; $i++) {
	$palavraf = "";
	$char[$position] = chr($i);
                                
	for ($j = 0; $j <= $position; $j++) {
		$palavraf .= $char[$j];
        }
                                
	echo "O servidor verificou: ".$palavraf." não é este o texto<br />";
                                
	if ( sha1($palavraf) == $palavra) {
        	echo "O servidor encontrou o texto<br />O texto é ".$palavraf;
        	break;
	}
                                
	if (!($position == $max))
		generar($palavra, $char, $position + 1, $max);
}
}

Só mais uma coisa:

if (!($position == $max))

é o mesmo que

if ($position != $max)

Só que a segunda versão é mais limpa.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Umbus

Não em expliquei bem, entao é assim, esta função ira ser usada em x vezes, e não quero que ela se repita x vezes, mas quero que partilhe x das x vezes que vai ser usada, ou seja. Imagina que é usada 5 vezes entao quero que: (x caracteres)/5 e é entao em vezes de a primeira letra rodar de 97 a 123, passa a rodar de 97 a 100 por exemplo (mas apenas a primeira letra). E quero que a minah funcao esteja preparada para isto por link :) apenas isso assim o meu link poderia ser

olamundo.php?action=generar&palavra=$palavra&char=$char&posisao=$position&max=$max&limite=XXX


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
KTachyon

EDIT: Acho que percebi

É exactamente a mesma coisa que a função que coloquei, mas com mais uma variável que define o último char:

function generar_user($palavra, $char, $position, $max, $user_input1, $user_input2) {
        for ($i = $user_input1; $i < $user_input2; $i++) {


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Umbus

Mas assim tenho de pedir 2 em vez de um eu queria fazer isto de maneira automática, para quando enviasse ele soubesse o que tinha a fazer, nao da para fazer assim?


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
KTachyon

Mas pedir uma vez, como? Pedir os dois caracteres em simultâneo no mesmo input? É igual. Basta separares os chars. Tanto faz que seja dentro ou fora da função.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Umbus

Olha eu fiz como dissete mas estou com um problema o meu codigo é este:

<?
function generar($palavra, $char, $position, $max, $in, $fin) 
{
	for ($a = $in; $a <  $fin; $a++) {

		$valor = chr($a);

		for ($i = 97; $i < 123; $i++) {
				$palavraf = "";
				$char[$position] = chr($i);



				for ($j = 0; $j <= $position; $j++) {
					$palavraf .= $char[$j];
				}
				$palavrafin = $valor.$palavraf;

					echo "O servidor verificou: ".$palavrafin." não é este o texto<br />";
				if ( $palavrafin == $palavra)
				{
					echo "O servidor encontrou o texto<br />O texto é ".$palavrafin;
					break;
				}

				if (!($position == $max))
						generar($sha, $char, $position + 1, $max, $in, $fin);
		}
	}	
}               

switch($_GET['action'])
	{
		case 'generar':
        	generar($_GET['palavra'], $char ="", 0, $_GET['caracteres']-2, $_GET['inicial'], $_GET['final']);
        	break;
                
	}
?>

Mas nao sei porque mas a primeira letra repete-se, por exemplo abc abc em veaz de acabar assim que atinge o final da letra c


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
KTachyon

Neps, não podes juntar as duas funções numa só. A função que é efectivamente recursiva tem que ser a que precorre todos os chars. Não podes continuar a chamar a nova porque senão ele vai limitar todos os chars a $in e $fin.

Para além disso, convém confirmares que $in < $fin.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Umbus

Nem me lembrei disso lol, mas como e que faço isto entao?


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
KTachyon

Como eu coloquei, 2 funções:

function generar_user($palavra, $char, $position, $max, $in, $fin) {

function generar($palavra, $char, $position, $max) {


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Umbus

E como junto-as? A questao e essa :S


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites
KTachyon

A primeira chama a segunda, e a segunda chama-se a si própria. Tal como coloquei.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Umbus

Pah mas nao funciona mesmo, tentei de varias formas dessa forma, e ate consegui uma maneira um pouco melhor que essa tambem com duas funcoes mas nao funciona tambem :S. Alguma ajuda vou recapitular:

Tenho por exemplo 5 ou mais servidores (os servidores sao os que tiverem activos), e tenho de dividilos por 256 caracteres. Como faço para o generador ter a primeira letra dividida do resto das letras?


Eu sou eu e eu sou aquele que sou eu...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.