dúvida de lógica !!!

Delphi

05/10/2003

Olá,

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

Balceiro

Curtidas 0

Respostas

Echoesofpinkfloyd

Echoesofpinkfloyd

05/10/2003

Olá, 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:d277e5ea0b]1 - 2 - 3 [/color:d277e5ea0b]- 7 - 10 - 12 - 13 - 20 - 23 - 28 Nunca poderá existir uma sequência com mais de 3 dezenas exemplo: 10 - 15 - [color=red:d277e5ea0b]17 - 18 - 19 - 20 [/color:d277e5ea0b]- 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


existe alguma logica de formação da senha ?


GOSTEI 0
Balceiro

Balceiro

05/10/2003

A lógica é a descrita acima....


GOSTEI 0
Echoesofpinkfloyd

Echoesofpinkfloyd

05/10/2003

A lógica é a descrita acima....


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
Adilsond

Adilsond

05/10/2003

Caro balceiro,

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
Balceiro

Balceiro

05/10/2003

O que acontece é o seguinte...

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
Balceiro

Balceiro

05/10/2003

estou com muita dúvida a respeito disso, será que alguém pode me ajudar???


soda limonada
balceiro@bol.com.br


GOSTEI 0
Ariovaldo Ferreira

Ariovaldo Ferreira

05/10/2003

Já vi algo assim, más a forma era a seguinte, gera uma string do tipo
0,1,2,3,4,5,6,7,8,9 e manda randomizar


GOSTEI 0
Balceiro

Balceiro

05/10/2003

SOBE


GOSTEI 0
Rafaelgm

Rafaelgm

05/10/2003

Fiz aqui uma função que faz o que você quer. Como fiz ele meio rápido, podem existir bugs. Nos meus testes a função funcionou normalmente, só quando passei valores ABSURDOS que ela travou (por exemplo, uma senha com 99 números e com apenas UMA sequencia permitida, mas aí também já é demais né...).

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
Beppe

Beppe

05/10/2003

... repeat Aux := Random(99) + 1; Existe := False; ...


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
Beppe

Beppe

05/10/2003

Gostei do desafio!

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
Balceiro

Balceiro

05/10/2003

Quero agradecer aos amigos que responderam ou pelo menos os que tentaram, é por isso que este fórum é um sucesso.


GOSTEI 0
Balceiro

Balceiro

05/10/2003

sobe


GOSTEI 0
POSTAR