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 .

¿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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.