¡Ayuda! ¡Olvidé mi contraseña!

24

¡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é 01o 1.

¡Por favor, ayúdame a no ser bloqueado de Stack Exchange!

Tanteo

Este es el , por lo que gana la respuesta más corta en cada idioma.

Lord Farquaad
fuente
¿No 1es el valor Ascii en 49lugar de 48?
LiefdeWen
1
Los casos de prueba de @LordFarquaad se ven bien, pero el ejemplo debería ser"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen
1
debe estar delimitado por una coma (una coma seguida de uno o más espacios también está bien) ¿Por qué el formato de salida restrictivo? Usualmente permitimos formatos flexibles
Luis Mendo
1
Lo habitual aquí es decir algo como "se permite cualquier formato de salida, siempre que las cadenas se puedan identificar claramente". O tal vez permita cualquier separador no numérico. Si lo cambia, notifique a los respondedores actuales con un comentario en su respuesta
Luis Mendo
1
@FelipeNardiBatista Sí, los ceros a la izquierda son opcionales. Recuerdo que usé 3 dígitos, así que si solo veo 54puedo resolver los ceros al frente.
Lord Farquaad

Respuestas:

10

05AB1E , 9 bytes

5Ý3ãʒÇƶOQ

Pruébalo en línea!

Devuelve la lista de listas de dígitos.

Erik el Outgolfer
fuente
3
Eso lo convierte en una contraseña bastante decente.
Veedrac
9

C , 113108 bytes

f(int h){int i=47,j,k;while(++i<54)for(j=47;++j<54)for(k=47;++k<54;)if(h==i+j+j+k*3)printf("%c%c%c",i,j,k);}

Es ú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.

xanoetux
fuente
2
¡Hola, código que puedo leer! Buen contraste con Jelly y tal. +1 por usar un lenguaje clásico. :)
Comodín
8

Jalea , 16 bytes

Ṿ€Oæ.J
6Ḷṗ3Ç⁼¥Ðf

Un enlace monádico que devuelve una lista de listas de dígitos.

Pruébalo en línea!

¿Cómo?

Ṿ€Oæ.J - Link 1, hash: list of integers (the digits of a password)
Ṿ€     - unevaluate €ach (giving a list of characters)
  O    - cast to ordinals (Ṿ€O could actually be replaced with +48 too)
     J - range of length (i.e. [1,2,3] in all use-cases)
   æ.  - dot product

6Ḷṗ3Ç⁼¥Ðf - Main link: number, n
6Ḷ        - lowered range of 6 = [0,1,2,3,4,5]
  ṗ3      - Cartesian power with 3 = [[0,0,0],[0,0,1],...,[5,5,5]] (all passwords)
       Ðf - filter keep if:
      ¥   -   last two links as a dyad (right implicitly n):
    Ç     -     call last link (1) as a monad
     ⁼    -     equals right?
Jonathan Allan
fuente
5

Python 2 , 126 75 bytes

-2 gracias a @ArnoldPalmer

lambda h:[(P/36,P%36/6,P%6)for P in range(216)if P/36+P%36/6*2+P%6*3==h&31]

Pruébalo en línea!

Felipe Nardi Batista
fuente
Si reemplaza ambos P/6/6con P/36, ahorrará 2 bytes
Arnold Palmer
Esto es exactamente lo que estaba a punto de escribir, +1
musicman523
@Felipe Nardi Batista, no sé por qué ese sería el caso
Arnold Palmer
4

MATL , 20 bytes

'0':'5'3Z^t3:*!si=Y)

Pruébalo en línea!

Explicación

'0':'5'   % Push inclusive range from '0' to '5', that is, '012345'
3Z^       % Cartesian power with exponent 3. Each Cartesian tuple is a row
t         % Duplicate
3:        % Push [1 2 3]
*         % Multiply element-wise with broadcast
!s        % Sum of each row
i         % Input number
=         % Logical mask of values that equal the input
Y)        % Use as logical index into the rows of the matrix. Implicit display
Luis Mendo
fuente
2

C # (.NET Core) , 133 131 125 123 bytes

n=>{int i,j,k;for(i=48;i<54;++i)for(j=48;j<54;++j)for(k=48;k<54;++k)if(i+j*2+k*3==n)Console.Write($"{i%48}{j%48}{k%48},");}

Pruébalo en línea!

jkelm
fuente
Di consejos más detallados anteriormente, pero no conseguí que funcionara bien. Por ahora, mi optimización simple es usar la 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.
Kamil Drakari
Intenté esa opción anteriormente, pero el Lambda requiere un valor de retorno. Sin embargo, quitar los soportes funcionará. Gracias :)
jkelm
El lambda requiere un valor de retorno si lo define como Func<int,string>, pero si lo define como Action<int>entonces no espera un valor de retorno.
Kamil Drakari
¡No me di cuenta de eso! Soy nuevo en c # y en el golf, pero decidí probarlo cuando no tengo nada más que hacer en el trabajo. Gracias de nuevo por los consejos. Los aprecio mucho.
jkelm
1
Si juegas con la ambigüedad entre chary inten C #, puedes declarar tus variables de iteración como charen el primer bucle y aún hacer el cálculo hash exactamente como lo haces mientras simplificas la Console.Write()oración. Por lo tanto, puede obtener una solución adecuada de 119 bytes. Pruébalo en línea!
Charlie
2

Carbón , 33 bytes

F⁶F⁶F⁶¿⁼⁺℅Iι⁺×℅Iκ²×℅Iλ³Iθ«IιIκIλ⸿

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 .

Charlie
fuente
2

CJam , 26 25 bytes

-1 byte gracias a Challenger5

{:H;6Zm*{s:i3,:).*:+H=},}

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

:H;    e# Store the hash in H.
6Zm*   e# 3rd Cartesian power of [0 1 2 3 4 5].
{      e# For each tuple in the power:
 s     e#  Stringify the tuple.
 :i    e#  Get the code point of each digit.
 3,:)  e#  Push [1 2 3].
 .*    e#  Element-wise multiplication of the two lists.
 :+    e#  Sum the result.
 H=    e#  Check if it's equal to the hash.
},     e# Filter the tuples to only ones for which this block gave a truthy result.
Gato de negocios
fuente
@ LordFarquaad Oh, eh ... Ni siquiera vi eso en primer lugar, así que supongo que es una suerte
Business Cat
{: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 usar m*el rango automático.
Esolanging Fruit
@ Challenger5 Bien, gracias!
Business Cat
2

Java, 162 bytes

static void f(int n){for(int i=48;i<54;i++){for(int j=48;j<54;j++){for(int k=48;k<54;k++){if(i+j*2+k*3==n)System.out.println((char)i+""+(char)j+""+(char)k);}}}}
0x45
fuente
2

JavaScript (Firefox 30-57), 72 bytes

n=>[for(i of s="012345")for(j of s)for(k of s)if(n-i-j*2-k*3==288)i+j+k]
Neil
fuente
1

Pyth, 18 bytes

fqQs*VS3CMT^jkU6 3
isaacg
fuente
1

QBIC , 40 bytes

[0,5|[0,5|[0,5|~a+b+b+c+c+c+288=:\?a,b,c

Explicación

[0,5|                Make a FOR loop run through the possible digits for pos 1, called a
[0,5|                Loop for #2, b
[0,5|                Loop for #3, c
                     Calculate the hash by taking a once, b twice and c thrice, 
                     and raising all to their ASCII codepoints
 a+b+b+c+c+c+288       
~               =:   IF thta is euqal to the given hash (read from cmd line)
\?a,b,c              THEN print the digits
                     (the IF and the FOR loops are auto-closed by QBIC)
Steenbergh
fuente
1

R , 67 62 61 bytes

-5 bytes gracias a Jarko Dubbeldam

b=t(t(expand.grid(rep(list(0:5),3))));b[b%*%1:3==scan()-288,]

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 matricial b * [1,2,3], toma las filas de las bcuales coinciden (restando 288de la entrada que es 1*48+2*28+3*48) y las devuelve.

Giuseppe
fuente
1
t(t(m))es una abreviatura paraas.matrix(m)
JAD