Fórum dúvida de lógica !!! #186270
05/10/2003
0
Estou desenvolvendo uma aplicação que deverá gerar uma senha automaticamente para o usuário. A senha terá 20 digitos (10 dezenas) em ordem crescente e somente poderá existir 3 números sequenciais.
Exemplo: [color=red:721bf9b130]1 - 2 - 3 [/color:721bf9b130]- 7 - 10 - 12 - 13 - 20 - 23 - 28
Nunca poderá existir uma sequência com mais de 3 dezenas
exemplo: 10 - 15 - [color=red:721bf9b130]17 - 18 - 19 - 20 [/color:721bf9b130]- 28 - 30 - 31 - 35
Estou tentando resolver este problema a semanas e não consigo, será que você poderia me ajudar???
Soda Limonada
balceiro@bol.com.br
Balceiro
Curtir tópico
+ 0Posts
05/10/2003
Echoesofpinkfloyd
existe alguma logica de formação da senha ?
Gostei + 0
05/10/2003
Balceiro
Gostei + 0
05/10/2003
Echoesofpinkfloyd
a formação dos numero é aleatoria ? sendo que a sequencia tem ser em ordem crescente é isso ? e no maximo tres numeros sequenciais isso ?/??????????
Gostei + 0
05/10/2003
Adilsond
Acho que o que o EchoesOfPinkFloyd lhe perguntou é:
1 - Como voce entrará com os dados: Em vários Edits ou em apenas uma String?
2 - Caso seja uma String, os números serão sempre em ordem crescente?
N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 TN1D TN2D LT 1 - 2 - 3 - 5 - 6 - 8 - 9 - 11 - 12 - 14 -> 7 - 3 - 13 1 - 2 - 3 - 5 - 6 - 8 - 10 - 11 - 13 - 14 -> 6 - 4 - 14 1 - 2 - 3 - 5 - 6 - 10 - 11 - 13 - 14 - 16 -> 5 - 5 - 15 1 - 2 - 3 - 5 - 10 - 11 - 13 - 14 - 16 - 17 -> 4 - 6 - 16 1 - 2 - 3 - 10 - 11 - 13 - 14 - 16 - 17 - 19 -> 3 - 7 - 17 1 - 2 - 10 - 11 - 12 - 14 - 15 - 17 - 18 - 20 -> 2 - 8 - 18 1 - 10 - 11 - 12 - 14 - 15 - 17 - 18 - 20 - 21 -> 1 - 9 - 19 10 - 11 - 12 - 14 - 15 - 17 - 18 - 20 - 21 - 23 -> 0 - 10 - 20
Onde Nx são os numeros informados
TN1D é a quantidade total de dígitos simples
TN2D é a quantidade total de dígitos compostos
LT é o tamanho total da string.
Veja o exemplo de acima. É isto?????
Gostei + 0
05/10/2003
Balceiro
Pra gerar os números eu estou usando o seguinte:
while dig1 < 5 do
begin
while dig2 < 8 do
begin
while dig3 < 10 do
begin
while dig4 < 13 do
begin
while dig5 < 15 do
begin
while dig6 < 20 do
begin
while dig7 < 23 do
begin
while dig8 < 25 do
begin
while dig9 < 28 do
begin
while dig10 < 30 do
begin
senha = (dig1 + dig2 + dig3 + dig4 + dig5 + dig6 + dig7 + dig8 + dig8 + dig9 + dig10)
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;[/code]
Gostei + 0
05/10/2003
Balceiro
soda limonada
balceiro@bol.com.br
Gostei + 0
05/10/2003
Ariovaldo Ferreira
0,1,2,3,4,5,6,7,8,9 e manda randomizar
Gostei + 0
05/10/2003
Balceiro
Gostei + 0
06/10/2003
Rafaelgm
function GeraSenha(MaxSequenciasPermitidas, TamanhoSenha: Integer): String; procedure OrdenaVetor(var Senha: array of Integer; Tamanho: Integer); var i, j, Aux: Integer; begin for i := 0 to Tamanho - 2 do for j := i + 1 to Tamanho - 1 do if Senha[i] > Senha[j] then begin Aux := Senha[i]; Senha[i] := Senha[j]; Senha[j] := Aux; end; end; function ContaSequenciais(Senha: array of Integer; Tamanho: Integer): Integer; var i: Integer; begin OrdenaVetor(Senha, Tamanho); Result := 0; for i := 0 to Tamanho - 2 do if Senha[i] = Senha[i + 1] - 1 then Inc(Result); end; var i, j, Aux: Integer; Existe: Boolean; Senha: array of Integer; begin Randomize; SetLength(Senha, TamanhoSenha); for i := 0 to TamanhoSenha - 1 do begin repeat repeat Aux := Random(99) + 1; Existe := False; for j := 0 to i do if Senha[j] = Aux then Existe := True; until not Existe; Senha[i] := Aux; until ContaSequenciais(Senha, i + 1) <= MaxSequenciasPermitidas; end; OrdenaVetor(Senha, 10); Result := ´´; for i := 0 to TamanhoSenha - 1 do Result := Result + FormatFloat(´00´, Senha[i]); end;
Pra chamar, basta adicionar, por exemplo:
procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text := GeraSenha(3, 10); end;
´Seus pobremas si acabaraum-si!´ (by Seu Creysson)
Abraços,
Rafael Monteiro
Gostei + 0
06/10/2003
Beppe
Se 0(zero) for válido, então seu Random está errado, deveria ser Random(100);
Random(99) + 1 : retorna na faixa de 1..99
Random(100) + 1 : retorna na faixa de 0..99
Gostei + 0
06/10/2003
Beppe
Aqui segue a listagem do algoritmo.
function GeraSenha(MaxSequenciasPermitidas, TamanhoSenha: Integer; var Senha: array of Byte): Boolean; const MaiorDezena = 99; var I, Count, Dezena, Seq: Integer; Usado: set of 0..MaiorDezena; begin // testa se existe combinação possível Result := Succ(MaiorDezena) - TamanhoSenha >= Succ(MaiorDezena) mod MaxSequenciasPermitidas ; if not Result then Exit; // gera dezenas fora de ordem Count := TamanhoSenha; Usado := []; repeat // não pode repetir repeat Dezena := Random(MaiorDezena + 1); until not (Dezena in Usado); // conta a largura da sequência, para trás e para frente Seq := 1; for I := Dezena - 1 downto 0 do if I in Usado then Inc(Seq) else Break; for I := Dezena + 1 to MaiorDezena do if I in Usado then Inc(Seq) else Break; if Seq <= MaxSequenciasPermitidas then begin Dec(Count); Include(Usado, Dezena); end; until Count = 0; // agora coloca as dezenas num array for I := 0 to MaiorDezena do begin if I in Usado then begin Senha[Count] := I; Inc(Count); end; end; end; procedure TForm1.Button1Click(Sender: TObject); const TamanhoSenha = 10; var Senha: array[0..TamanhoSenha - 1] of Byte; begin if GeraSenha(3, TamanhoSenha, Senha) then // use como quiser... end;
Faça bom uso...
Ataliba.
Gostei + 0
06/10/2003
Balceiro
Gostei + 0
06/10/2003
Balceiro
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)