Jump to content
Umbus

Auto for

Recommended Posts

Umbus

Boas alguem sabe como posso fazer isto que tenho para x caracteres?

for($i = 0; $i < SIZE; $i++){
for($j[0] = 0; $j[0] < 255; $j[0]++){
	$char[0] = chr($j[0]);

	for($j[1] = 0; $j[1] < 255; $j[1]++){
		$char[1] = chr($j[1]);

		for($j[2] = 0; $j[2] < 255; $j[2]++){
			$char[2] = chr($j[2]);

			for($j[3] = 0; $j[3] < 255; $j[3]++){
				$char[3] = chr($j[3]);

			}
		}
	}
}
}


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

Share this post


Link to post
Share on other sites
KTachyon

Bem... Qual é o objectivo mesmo? É que esse código... é terrível e não serve para nada xD


“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

O objectivo é gerar palavras ate encontrar a palavra certa, sabe-se que a palavra inicial tem x caracteres, depois tenho de encontrar sequencialmente a palavra letra a letra ate achar a correcta ou seja:

a a a a

a a a b

a a a c

....

a a b a

a a b b

a a b c

....

a a c b

....

a b a a

...

b a a a

etc etc etc

A unica coisa que sei e o tamanho da primeira palavra

Este codigo que referi, servia caso o numero da palavra fosse sempre 4, mas visto nao ser nao sei como fazer ;)


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

Share this post


Link to post
Share on other sites
KTachyon

Bem... se vais testar desde 0 até 255, vais encontrar muitos caracteres que nem sequer vais conseguir ver. E a tabela ASCII só tem caracteres até 127.

A gama de caracteres visíveis (incluindo o espaço), vai de 32 até 126.

Se só queres as letras minúsculas, a gama é de 97 até 122.


“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

No caso quero todas as letras, numeros, simbulos e caracteres especiais :P . Mas a questão não é essa, mas sim como fazer isto de modo automatico lol ;)


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

Share this post


Link to post
Share on other sites
KTachyon

Bem, podes utilizar um algoritmo recursivo com o loop de mudança de caracter iterativo, mas é garantido que isto vai demorar mesmo muito tempo:

function gen($char, $position, $max) {

if ($position == $max) {
	for ($i = 0; $i < $max; $i++) {
		echo $char[$i];
	}

	echo '<br/>';
}
else {
	for ($i = 97; $i < 123; $i++) {
		$char[$position] = chr($i);

		gen($char, $position + 1, $max);
	}
}

}

gen($char, 0, 4);

Coloquei de 97 a 123 só para imprimir as minúsculas.


“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 está ai um problema, é que eu tenho uma palavra inicial e o servidor tem de verificar sempre (em cada palavra criada) se é igual à inicial.

O que fizeste foi criar uma função que numa palavra de 4 letras, ele so usa o for 4 vezes, ja que é chamada novamente a mesma função para a posição seguinte, e não faz comparações. Pelo que percebi basicamente o que fizeste foi isso:

Palavra inicial = OLAMU

a

aa

aaa

aaaa

aaaaa (mostra esta string)

E o que eu quero é:

OLAMU

a a a a

a a a b

a a a c

....

a a b a

a a b b

a a b c

....

a a c b

....

a b a a

...

b a a a

...

OLAMU

Posso estar enganado mas é o que me parece


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

Share this post


Link to post
Share on other sites
KTachyon

Não sei se estou a perceber. A função chama-se a si própria até atingir o limite. Nesse limite imprime os chars para o output, ou seja, se o max for, por exemplo, 5, ele vai começar a imprimir:

aaaaa

aaaab

aaaac

...

Se é para estabelecer uma comparação, podes fazê-lo na condição que define o limite da recursividade (quando position == max).

Se o que pretendes é comparar todas as possíveis combinações desde 1 char até max chars, podes fazer a comparação directamente no loop que muda os chars:

function gen2($char, $position, $max) {

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

	// comparações aqui

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

}

gen2($char, 0, 4);

Isto vai permitir gerar qualquer coisa como:

a

aa

aaa

aaaa

aaab

aaac

aaad

...

aaaz

aab

aaba

aabb

aabc

...

aazx

aazy

aazz

ab

aba

abaa

...

Alternativamente, se queres ordenado pelo número de chars, podes fazer um for para o max:

for ($max = 1;;$max++) {
gen($char, 0, $max);
}

PS: Repara que dei 2 nomes diferentes às funções que postei nos dois posts: gen() e gen2()

EDIT: Sinceramente continuo sem perceber a utilidade de tal coisa, principalmente em PHP que é altamente ineficiente para coisas deste género ;)


“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
mAiN_iNfEcTiOn

ehehe ;) isto é uma pergunta interessante....

Eu explico porquê... Primeiro, porque isto é um sistema - arcaico - de descoberta de uma password fraca.

A lógica é eu inserir uma palavra, exemplo: "OTORRINOLARINGOLOGISTA" ... Nahh tou a brincar...! Vá uma mais pequena como por exemplo "PAP" e o programa determinar a palavra através de testes:

"AAA" == "PAP" ? ---> FALSE

"AAB" == "PAP" ? ---> FALSE .... e assim sucessivamente até descobrir...

Mas para letras, por exemplo, "A" e "a" são letras diferentes, em termos ASCII está claro. E em termos de comparação de strings também visto ser Case-Sensitive.

Assim, as combinações são imensas mesmo só para 4 letras :P

Para já ainda não pensei em nenhum algoritmo para tal, mas está engraçada a pergunta... parece inofensiva, mas só se for sequencial e case-insensitive (ou case-sensitive mas assumirmos que todos os caracteres estão com o mesmo tipo de case).

Abraço

Share this post


Link to post
Share on other sites
KTachyon

Pois, mas se é preciso gerá-las todas... então é, de facto, preciso gerá-las todas. Logo o algoritmo não será muito diferente do indicado, excepto na parte da gama de chars utilizada.

Só que é um sistema arcaico em PHP, o que torna a utilidade bastante mais estranha ;)


“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

Sim o mAiN_iNfEcTiOn, tem toda a razão este código pode ser feito para descobrir passes com ou sem hash, no meu caso e um trabalho para sistemas distribuídos, que le um ficheiro e terá de encontrar as palavras que estão dentro desse ficheiro com ajuda de vários servidores. Eu ate agora tenho tudo feito menos esta parte que pedia ajuda e a parte de distribuir para outros servidores, que não sei ainda como fazer. Se fizesse isto por random era simplicíssimo, mas o prof diz que me cortava valores porque repetiria varias vezes a mesma palavra, e nessa logica mesmo que fizesse um catalogador para saber quais as palavras que ja tinham sido geradas, lixava-me na mesma ja que noutros servidores podia repetir, assim tenho de fazer desta forma ;).

Quanto ao codigo que me tens ajudado não deve estar a funcar bem, eu tenho-o assim:

<?
function gen($char, $position, $max) {
       
        for ($i = 97; $i < 123; $i++) {
                $char[$position] = chr($i);

			for ($i = 0; $i < $max; $i++) {
                        echo $char[$i];
                }
                       
                // comparações aqui

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

gen($char, 0, 4);
?>

Quanto ao resultado esta assim:

resultz.png

Em php cli (em linux) stá a dar erro, com Undefined offset. Estou mesmo as aranhas com esta parte que sena :P

Antes que perguntem porque nao faço em C, respondo já, inicialmente este codigo era para ser feito em C, mas o professor disse que podiamos usar outras linguagens, entao como gosto de php, aproveitei para aprender um pouco mais de php, e ao mesmo tempo perceber como distribuir trabalhos por varios servidores :)


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

Share this post


Link to post
Share on other sites
KTachyon

PHP com sistemas distribuídos? Não me parece uma boa combinação. Menor performance por máquina, baixa performance de comunicação... Não me parece escalável.

No código estás a cometer um erro. Para utilizares essa versão tens que imprimir até à $position e não até ao $max.

for ($i = 0; $i <= $position; $i++) {
    echo $char[$i];
}

Senão é normal que esteja a ir para uma "undefined position", visto que o array ainda não foi preenchido até a $max-1.

E, para imprimires, convém adicionares um separador entre palavras a seguir ao for:

echo '<br/>';


“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

Quanto ao codigo, agora aparece isto:

a
a
a
a
a
a
a
a
a
a
a
a
a

a
a
a

a
a
a

a
a
a

a
a
a

a
a
a

Quanto aos sistemas distribuidos, o meu professor disse que dava para fazer, e pelo qeu sei existe forma de varios servidores fazerem o mesmo não? ISto não é para ficar bom, e 100% funcional, até porque para o que estou a fazer tem de ser feito em localhost, é so para ter o codigo que funcione de modo a passar a cadeira ;)


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

Share this post


Link to post
Share on other sites
KTachyon

Hmm... pois. Estás a utilizar a mesma variável para os dois ciclos. Não pode ser ;)

Muda um dos ciclos de $i para $j:

function gen($char, $position, $max) {
       
        for ($i = 97; $i < 123; $i++) {
                $char[$position] = chr($i);
                
                for ($j = 0; $j <= $position; $j++) {
                        echo $char[$j];
                }

                echo '<br/>';

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

gen($char, 0, 4);

Isso de fazer para passar é má política. Penso que o objectivo de uma cadeira dessas é ficares com conhecimentos de RMI, CORBA, Web Services,...


“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

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

×
×
  • 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.