¡Ayuda! ¡Acabo de iniciar sesión en Stack Exchange, pero olvidé cuál es mi contraseña! Necesito una forma de resolverlo antes de cerrar sesión.
Afortunadamente, soy un excelente hacker. ¡No solo pude encontrar el hash de mi contraseña, sino que también encontré el algoritmo de hash de Stack Exchange! Toma el valor ASCII de cada dígito multiplicado por el lugar de ese dígito, luego suma todos esos valores juntos. Por ejemplo:
"135" -> 1*49 + 2*51 + 3*53 = 310
Recuerdo que mi contraseña tiene 3 dígitos y que cada carácter es un número entre 0 y 5 inclusive (de modo que coincida con la expresión regular:) ^[0-5]{3}$
, pero todavía hay muchas posibilidades de adivinar. Necesito un programa que pueda convertir un hash en contraseñas potenciales, pero a pesar de ser un hacker experto, ¡no puedo codificar para salvar mi vida! Sin embargo, pude escribir estas pruebas a mano:
input -> output
288 -> 000 // lowest possible hash
290 -> 200, 010
298 -> 022, 050, 103, 131, 212, 240, 321, 402, 430, 511
318 -> 555 // highest possible hash
¿Puede uno de ustedes escribir un programa para mí que tome un hash e imprima todas las contraseñas posibles que podría haber usado?
La entrada siempre podrá generar al menos una contraseña válida. Se permite cualquier formato de salida, siempre que las cadenas se puedan identificar claramente. Tampoco me preocupan los ceros a la izquierda, por lo que si existe una contraseña potencial 001
, también aceptaré 01
o 1
.
¡Por favor, ayúdame a no ser bloqueado de Stack Exchange!
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en cada idioma.
1
es el valor Ascii en49
lugar de48
?"135" -> 1*49 + 2*51 + 3*53 = 310
54
puedo resolver los ceros al frente.Respuestas:
05AB1E , 9 bytes
Pruébalo en línea!
Devuelve la lista de listas de dígitos.
fuente
C ,
113108bytesEs único ver lo que se entiende por salida, la salida tiene el formato: 200010
Todas las contraseñas se escriben como 3 dígitos sin delimitador.
fuente
Jalea , 16 bytes
Un enlace monádico que devuelve una lista de listas de dígitos.
Pruébalo en línea!
¿Cómo?
fuente
Python 2 ,
12675 bytes-2 gracias a @ArnoldPalmer
Pruébalo en línea!
fuente
P/6/6
conP/36
, ahorrará 2 bytesMATL , 20 bytes
Pruébalo en línea!
Explicación
fuente
Python 2 , 81 bytes
Pruébalo en línea!
fuente
Haskell,
71706461 bytesPruébalo en línea!
fuente
C # (.NET Core) ,
133 131 125123 bytesPruébalo en línea!
fuente
Console.Write($"{i%48}{j%48}{k%48},");
salida en lugar de crear un valor de retorno y eliminar los corchetes innecesarios alrededor de la instrucción if para guardar 8 bytes.Func<int,string>
, pero si lo define comoAction<int>
entonces no espera un valor de retorno.char
yint
en C #, puedes declarar tus variables de iteración comochar
en el primer bucle y aún hacer el cálculo hash exactamente como lo haces mientras simplificas laConsole.Write()
oración. Por lo tanto, puede obtener una solución adecuada de 119 bytes. Pruébalo en línea!Carbón , 33 bytes
Pruébalo en línea!
Un enfoque similar a otras respuestas: repita tres veces de 0 a 5, calcule el hash e imprima el estado de las variables de iteración si coincide con el hash de entrada.
Enlace a la versión detallada .
fuente
CJam ,
2625 bytes-1 byte gracias a Challenger5
Bloque anónimo que espera el hash en la pila (como un entero) y deja el resultado en la pila (como una lista de cadenas).
Pruébalo en línea!
Explicación
fuente
{:H;6Zm*{s:i3,:).*:+H=},}
es 1 byte más corto. Utiliza cadenas de dígitos en el filtro en lugar de números para usarm*
el rango automático.Java, 162 bytes
fuente
JavaScript (Firefox 30-57), 72 bytes
fuente
Pyth, 18 bytes
fuente
QBIC , 40 bytes
Explicación
fuente
R ,
676261 bytes-5 bytes gracias a Jarko Dubbeldam
Pruébalo en línea!
lee el número de
stdin
; devuelve una matriz donde las filas son los caracteres.Genera todos los tríos posibles de dígitos en un formato matricial (
b
), calcula el producto matricialb * [1,2,3]
, toma las filas de lasb
cuales coinciden (restando288
de la entrada que es1*48+2*28+3*48
) y las devuelve.fuente
t(t(m))
es una abreviatura paraas.matrix(m)