Gere alguns PINs seguros

17

Inspirado por esta postagem migrada mal recebida .

O chefe de segurança da sua empresa está preocupado com o seu sistema de geração de PIN depois que ele o forneceu 12345. Ele também não gostou da piada de Spaceballs que você fez às custas dele, então você foi delegado a reescrever o gerador de PIN. Como ele precisa se encaixar em algum hardware especial, você deve torná-lo o menor possível.

Sua tarefa

  • Você pega duas entradas - número de PINs e tamanho do PIN em dígitos.
  • Gere o número especificado de PINs do tamanho especificado aleatoriamente e imprima-o.
  • Todos os PINs válidos do tamanho devem poder ser impressos, mesmo que não sejam uniformemente prováveis.
  • No entanto, existem algumas restrições nos PINs - eis os inválidos:

    1. Se todos os pares tiverem o mesmo dígito: 114422(Nota: isso obviamente incluirá todos os PINs do mesmo dígito).
    2. PINs cada vez mais lineares (10): modificação 246802.
    3. Todos os grupos de 3 são linhas físicas no teclado de 1 2 3;4 5 6;7 8 9;bksp 0 enter;:147369 .
    4. O PIN pode ser totalmente dividido em grupos da regra 1 e 3.


  • Isso é , então o código mais curto em bytes vence!
Maltysen
fonte
A regra 1 também inclui um único par duplo (como 55123)?
mınxomaτ 12/12/2015
@minxomat, que altera as regras para incluir os dois grupos. Essa será desde a segunda metade 123, mas 55432seria bom.
Maltysen
A regra 3 inclui diagonais?
Martin Ender
6
A ironia é que essa definição de um pino chamado "seguro" reduz apenas o número de pinos que os atacantes podem ter à força bruta!
DankMemes
11
Qual é o menor comprimento para a regra 2?
Dennis

Respostas:

1

Pitão, 120 bytes

Arz7VGJ1WJK%"%0*d",HO-^TH1=J|q1l{m%-F_vMcd1T.:K2u|GHmu|GHm?qlk2:k"(.)\\1"0?qlk3}k+++=bcS"123456789"3_Mb.Tb_M.TbZdZ./K0)K

Achei que eu deveria adicionar uma implementação real então. Gera números aleatórios até encontrar um que atenda a todos os requisitos. Provavelmente pode ser melhorado muito!

Versão online


fonte
11
Alterei as regras para incluir o requisito de que os PINs devem ser aleatórios e todos os PINs devem ser possíveis.
Maltysen
Achei que você talvez :)
0

Perl 5, 244

Começa com a geração de números aleatórios para o tamanho especificado.
E apenas imprime aqueles que não atendem às restrições.

Encontrar uma solução para as linhas do teclado (sem combinações codificadas) foi meio divertido.

($k,$l)=@ARGV;$m=10**$l-1;while($n<$k){$_=sprintf("%0".$l."d",int(rand($m)));@N=split//,$_;pop@N;$i=$d=0;while(++$i<@N&&$d<1){$d=$N[$i-1]<=>$N[$i]}$b=$_;$b=~s|\d|@A=split//,$';2*$A[0]-$&-$A[1]==0|eg;if((!m/(\d)\1/)&$b>0&$d>=0){$n++;print$_.$/}}

Teste

$ perl gen_pins.pl 10 5
98121
15931
69042
93730
83458
25312
24601
49468
49490
67012
LukStorms
fonte