Generar algunos PIN seguros

17

Inspirado por esta publicación migrada mal recibida .

El jefe de seguridad de su empresa está preocupado por su sistema generador de PIN después de que se lo dio 12345. Tampoco apreciaba realmente la broma de Spaceballs que hiciste a su costa, por lo que se te ha delegado para volver a escribir el generador de PIN. Como tiene que caber en un hardware especial, debe hacerlo lo más pequeño posible.

Tu tarea

  • Toma dos entradas: número de PIN y tamaño de PIN en dígitos.
  • Genere al azar el número especificado de PIN del tamaño especificado e imprímalo.
  • Todos los PIN válidos del tamaño deben poder imprimirse, incluso si no son uniformemente probables.
  • Sin embargo, existen algunas restricciones en los PIN: aquí están los inválidos:

    1. Si todos los pares son del mismo dígito: 114422(Nota: obviamente, esto incluirá todos los PIN de los mismos dígitos).
    2. PINs Cada vez más lineales (mod 10): 246802.
    3. Todos los grupos de 3 líneas físicas en el teclado de 1 2 3;4 5 6;7 8 9;bksp 0 enter;: 147369.
    4. El PIN se puede dividir por completo en grupos de la regla 1 y la regla 3.


  • Este es el , por lo que gana el código más corto en bytes .
Maltysen
fuente
¿La regla uno también incluye un solo par doble (como 55123)?
mınxomaτ
@minxomat buen punto, modificando las reglas para incluir a ambos grupos. Esa será desde la segunda mitad 123, pero 55432estaría bien.
Maltysen
¿La regla 3 incluye diagonales?
Martin Ender
66
¡La ironía es que esta definición de un pin llamado "seguro" solo reduce el número de pines que los atacantes podrían tener para forzar la fuerza!
DankMemes
1
¿Cuál es la longitud más corta para la regla 2?
Dennis

Respuestas:

1

Pyth, 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

Pensé que debería agregar una implementación real entonces. Genera números aleatorios hasta encontrar uno que cumpla con todos los requisitos. ¡Probablemente se puede mejorar mucho!

Versión en línea


fuente
1
He cambiado las reglas para incluir el requisito de que los PIN deben ser aleatorios, y todos los PIN deben ser posibles.
Maltysen
Pensé que podrías :)
0

Perl 5, 244

Comienza generando números aleatorios para el tamaño dado.
Y solo imprime aquellos que no cumplen con las restricciones.

Encontrar una solución para las líneas del teclado (sin combinaciones de codificación) fue un poco 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$_.$/}}

Prueba

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