Aidez-moi! J'ai oublié mon mot de passe!

24

Aidez-moi! Je viens de me connecter à Stack Exchange, mais j'ai oublié mon mot de passe! J'ai besoin d'un moyen de le résoudre avant de me déconnecter.

Heureusement, je suis un excellent hacker. Non seulement j'ai pu trouver le hachage de mon mot de passe, mais j'ai également trouvé l'algorithme de hachage de Stack Exchange! Il prend la valeur ASCII de chaque chiffre multipliée par la place de ce chiffre, puis additionne toutes ces valeurs ensemble. Par exemple:

"135" -> 1*49 + 2*51 + 3*53 = 310

Je me souviens que mon mot de passe comporte 3 chiffres et que chaque caractère est un nombre compris entre 0 et 5 inclus (de telle sorte qu'il correspondra à l'expression régulière:) ^[0-5]{3}$, mais c'est encore trop de possibilités à deviner. J'ai besoin d'un programme qui peut reconvertir un hachage en mots de passe potentiels, mais en dépit d'être un pirate expert, je ne peux pas coder pour me sauver la vie! J'ai cependant pu écrire ces tests à la main:

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

Est-ce que l'un de vous peut écrire un programme pour moi qui comprendra un hachage et imprimera tous les mots de passe possibles que j'aurais pu utiliser?

L'entrée pourra toujours produire au moins un mot de passe valide. Tout format de sortie est autorisé, tant que les chaînes peuvent être clairement identifiées. Je ne m'inquiète pas non plus des zéros non significatifs, donc si un mot de passe potentiel est 001, j'accepte 01ou1 .

Aidez-moi à ne pas être bloqué sur Stack Exchange!

Notation

C'est le , donc la réponse la plus courte dans chaque langue gagne!

Lord Farquaad
la source
N'est-ce pas 1la valeur Ascii 49de 48?
LiefdeWen
1
Les cas de test de @LordFarquaad semblent bons mais l'exemple devrait être"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen
1
doit être délimité par une virgule (une virgule suivie d'un ou plusieurs espaces est également acceptable) Pourquoi le format de sortie restrictif? Nous autorisons généralement les formats flexibles
Luis Mendo
1
Ici, l'habituel est de dire quelque chose comme "tout format de sortie est autorisé, tant que les chaînes peuvent être clairement identifiées". Ou peut-être autoriser tout séparateur non numérique. Si vous le changez, informez les répondeurs actuels avec un commentaire dans leur réponse
Luis Mendo
1
@FelipeNardiBatista Oui, les zéros non significatifs sont facultatifs. Je me souviens avoir utilisé 3 chiffres, donc si je vois juste, 54je peux travailler les zéros devant.
Lord Farquaad

Réponses:

10

05AB1E , 9 octets

5Ý3ãʒÇƶOQ

Essayez-le en ligne!

Renvoie la liste des listes de chiffres.

Erik le Outgolfer
la source
3
Cela fait un mot de passe assez décent.
Veedrac
9

C , 113 108 octets

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);}

Il est unique de voir ce qui est destiné à la sortie, la sortie est au format: 200010

Tous les mots de passe sont écrits en 3 chiffres sans délimiteur.

xanoetux
la source
2
Hé, le code que je peux lire! Joli contraste avec Jelly et autres. +1 pour l'utilisation d'une langue classique. :)
Wildcard
8

Gelée , 16 octets

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

Un lien monadique renvoyant une liste de listes de chiffres.

Essayez-le en ligne!

Comment?

Ṿ€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
la source
5

Python 2 , 126 75 octets

-2 grâce à @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]

Essayez-le en ligne!

Felipe Nardi Batista
la source
Si vous remplacez les deux P/6/6par P/36, vous économisez 2 octets
Arnold Palmer
C'est exactement ce que j'allais écrire, +1
musicman523
@Felipe Nardi Batista, je ne sais pas pourquoi ce serait le cas
Arnold Palmer
4

MATL , 20 octets

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

Essayez-le en ligne!

Explication

'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
la source
3

Python 2 , 81 octets

lambda h:[(a,b,c)for a in r for b in r for c in r if a+2*b+3*c+288==h]
r=range(6)

Essayez-le en ligne!

musicman523
la source
2

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

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},");}

Essayez-le en ligne!

jkelm
la source
J'ai donné des conseils plus approfondis auparavant, mais je ne l'ai pas fait fonctionner correctement. Pour l'instant, mon optimisation simple consiste à utiliser Console.Write($"{i%48}{j%48}{k%48},");pour la sortie plutôt que de créer une valeur de retour et de supprimer les crochets inutiles autour de l'instruction if pour économiser 8 octets.
Kamil Drakari
J'ai essayé cette option précédemment, mais la Lambda nécessite une valeur de retour. La suppression des supports fonctionnera cependant. Merci :)
jkelm
Le lambda requiert une valeur de retour si vous le définissez comme Func<int,string>, mais si vous le définissez comme Action<int>alors il ne s'attend pas à une valeur de retour.
Kamil Drakari
Je ne m'en suis pas rendu compte! Je suis nouveau dans le c # et le golf, mais j'ai décidé de l'essayer quand je n'ai rien d'autre à faire au travail. Merci encore pour les astuces. Je les apprécie beaucoup.
jkelm
1
Si vous jouez avec l'ambiguïté entre charet inten C #, vous pouvez déclarer vos variables d'itération comme chardans la première boucle et toujours faire le calcul de hachage exactement comme vous le faites tout en simplifiant la Console.Write()phrase. Ainsi, vous pouvez obtenir une solution appropriée de 119 octets. Essayez-le en ligne!
Charlie
2

Fusain , 33 octets

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

Essayez-le en ligne!

Une approche similaire à d'autres réponses: boucle trois fois de 0 à 5, calcule le hachage et affiche l'état des variables d'itération s'il coïncide avec le hachage d'entrée.

Lien vers la version détaillée .

Charlie
la source
2

CJam , 26 25 octets

-1 octet grâce à Challenger5

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

Bloc anonyme attend le hachage sur la pile (sous forme d'entier) et laisse le résultat sur la pile (sous forme de liste de chaînes).

Essayez-le en ligne!

Explication

: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.
Chat d'affaires
la source
@LordFarquaad Oh, euh ... Je n'ai même pas vu ça en premier lieu donc je suppose que c'est une chance
Business Cat
{:H;6Zm*{s:i3,:).*:+H=},}est 1 octet plus court. Il utilise des chaînes de chiffres dans le filtre plutôt que des nombres pour utiliser m*la plage automatique de.
Esolanging Fruit
@ Challenger5 Nice, merci!
Business Cat
2

Java, 162 octets

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
la source
2

JavaScript (Firefox 30-57), 72 octets

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
la source
1

Pyth, 18 octets

fqQs*VS3CMT^jkU6 3
isaacg
la source
1

QBIC , 40 octets

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

Explication

[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
la source
1

R , 67 62 61 octets

-5 octets grâce à Jarko Dubbeldam

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

Essayez-le en ligne!

lit le nombre de stdin ; renvoie une matrice où les lignes sont les caractères.

Il génère tous les trios possibles de chiffres dans un format matriciel ( b), calcule le produit matriciel b * [1,2,3], prend les lignes bqui correspondent (en soustrayant 288de l'entrée qui est 1*48+2*28+3*48) et les renvoie.

Giuseppe
la source
1
t(t(m))est un raccourci pouras.matrix(m)
JAD