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!


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:



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.


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?


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



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!


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 .


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.

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

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]


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)

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.


1
t(t(m))est un raccourci pouras.matrix(m)
JAD
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.