Hilfe! Ich habe mein Passwort vergessen!

24

Hilfe! Ich habe mich gerade bei Stack Exchange angemeldet, aber mein Passwort vergessen! Ich brauche einen Weg, um das herauszufinden, bevor ich mich abmelde.

Zum Glück bin ich ein ausgezeichneter Hacker. Ich konnte nicht nur den Hash meines Passworts finden, sondern auch den Hashing-Algorithmus von Stack Exchange! Es nimmt den ASCII-Wert jeder Ziffer, multipliziert mit der Stelle dieser Ziffer, und summiert dann alle diese Werte zusammen. Beispielsweise:

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

Ich erinnere mich, dass mein Passwort 3-stellig ist und dass jedes Zeichen eine Zahl zwischen 0 und einschließlich 5 ist (so dass es dem regulären Ausdruck entspricht:) ^[0-5]{3}$, aber das sind immer noch zu viele Möglichkeiten, um es zu erraten. Ich benötige ein Programm, das einen Hash zurück in potenzielle Passwörter konvertieren kann, aber obwohl ich ein erfahrener Hacker bin, kann ich nicht codieren, um mein Leben zu retten! Diese Tests konnte ich allerdings von Hand ausschreiben:

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

Kann einer von Ihnen ein Programm für mich schreiben, das einen Hashwert aufnimmt und alle möglichen Passwörter ausgibt, die ich hätte verwenden können?

Die Eingabe kann immer mindestens ein gültiges Passwort erzeugen. Jedes Ausgabeformat ist zulässig, solange die Zeichenfolgen eindeutig identifiziert werden können. Ich mache mir auch keine Sorgen um führende Nullen. Wenn also ein potenzielles Passwort vorhanden ist 001, akzeptiere ich auch 01oder 1.

Bitte helfen Sie mir, nicht aus Stack Exchange ausgesperrt zu werden!

Wertung

Das ist , also gewinnt die kürzeste Antwort in jeder Sprache!

Lord Farquaad
quelle
Ist das nicht 1Ascii Wert 49statt 48?
LiefdeWen
1
@ LordFarquaad Testfälle sehen gut aus, aber Beispiel sollte sein"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen
1
muss durch ein Komma getrennt werden (ein Komma gefolgt von einem oder mehreren Leerzeichen ist auch in Ordnung) Warum das restriktive Ausgabeformat? Wir erlauben normalerweise flexible Formate
Luis Mendo
1
Das Übliche hier ist, so etwas wie "Jedes Ausgabeformat ist zulässig, solange die Zeichenfolgen eindeutig identifiziert werden können". Oder erlauben Sie vielleicht ein nicht-numerisches Trennzeichen. Wenn Sie es ändern, benachrichtigen Sie die aktuellen Antwortenden mit einem Kommentar in ihrer Antwort
Luis Mendo
1
@FelipeNardiBatista Ja, führende Nullen sind optional. Ich erinnere mich, dass ich drei Ziffern verwendet habe. Wenn ich also nur sehe, 54kann ich die Nullen vor mir herausfinden.
Lord Farquaad

Antworten:

10

05AB1E , 9 Bytes

5Ý3ãʒÇƶOQ

Probieren Sie es online!

Gibt eine Liste mit Ziffernlisten zurück.

Erik der Outgolfer
quelle
3
Das macht ein ziemlich anständiges Passwort.
Veedrac
9

C , 113 108 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 ist einzigartig zu sehen, was für die Ausgabe gedacht ist. Die Ausgabe hat das Format: 200010

Alle Passwörter werden dreistellig ohne Trennzeichen geschrieben.

Xanoetux
quelle
2
Hey, Code kann ich lesen! Schöner Kontrast zu Jelly und so. +1 für die Verwendung einer klassischen Sprache. :)
Wildcard
8

Gelee , 16 Bytes

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

Ein monadischer Link, der eine Liste mit Ziffernlisten zurückgibt.

Probieren Sie es online!

Wie?

Ṿ€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
quelle
5

Python 2 , 126 75 Bytes

-2 dank @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]

Probieren Sie es online!

Felipe Nardi Batista
quelle
Wenn Sie beide ersetzen P/6/6‚s mit P/36, speichern Sie 2 Bytes
Arnold Palmer
Genau das wollte ich schreiben, +1
musicman523
@ Felipe Nardi Batista, ich weiß nicht, warum das der Fall wäre
Arnold Palmer
4

MATL , 20 Bytes

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

Probieren Sie es online!

Erläuterung

'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
quelle
3

Python 2 , 81 Bytes

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)

Probieren Sie es online!

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

Probieren Sie es online!

jkelm
quelle
Ich habe vorher gründlichere Ratschläge gegeben, aber ich habe es nicht richtig zum Laufen gebracht. Im Moment besteht meine einfache Optimierung darin, Console.Write($"{i%48}{j%48}{k%48},");für die Ausgabe zu verwenden, anstatt einen Rückgabewert zu erstellen, und die unnötigen Klammern um die if-Anweisung zu entfernen, um 8 Bytes zu sparen.
Kamil Drakari
Ich habe diese Option zuvor versucht, aber der Lambda benötigt einen Rückgabewert. Das Entfernen der Klammern funktioniert jedoch. Danke :)
jkelm
Das Lambda erfordert einen Rückgabewert, wenn Sie es als definieren Func<int,string>, aber wenn Sie es als definieren, Action<int>erwartet es keinen Rückgabewert.
Kamil Drakari
Hab das nicht gemerkt! Ich bin neu in C # und Golf, aber ich habe beschlossen, es auszuprobieren, wenn ich bei der Arbeit nichts anderes zu tun habe. Nochmals vielen Dank für die Tipps. Ich schätze sie sehr.
Jkelm
1
Wenn Sie mit der Mehrdeutigkeit zwischen charund intin C # spielen, können Sie Ihre Iterationsvariablen wie charin der ersten Schleife deklarieren und trotzdem die Hash-Berechnung genauso durchführen, wie Sie es tun, während Sie den Console.Write()Satz vereinfachen . Auf diese Weise erhalten Sie eine richtige 119-Byte-Lösung. Probieren Sie es online!
Charlie
2

Holzkohle , 33 Bytes

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

Probieren Sie es online!

Ein ähnlicher Ansatz für andere Antworten: Dreimaliges Schleifen von 0 bis 5, Berechnen des Hashs und Drucken des Status der Iterationsvariablen, wenn er mit dem Eingabe-Hash übereinstimmt.

Link zur ausführlichen Version .

Charlie
quelle
2

CJam , 26 25 Bytes

-1 Byte dank Challenger5

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

Anonymer Block, der den Hash auf dem Stapel erwartet (als Ganzzahl) und das Ergebnis auf dem Stapel belässt (als Liste von Zeichenfolgen).

Probieren Sie es online!

Erläuterung

: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.
Geschäfts-Katze
quelle
@ LordFarquaad Oh, ähm ... Ich habe das überhaupt nicht gesehen, also denke ich, das ist ein Glücksfall
Business Cat
{:H;6Zm*{s:i3,:).*:+H=},}ist 1 Byte kürzer. Der Filter verwendet Ziffernfolgen anstelle von Zahlen, um m*den automatischen Bereich zu verwenden.
Esolanging Fruit
@ Challenger5 Schön, danke!
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
quelle
2

JavaScript (Firefox 30-57), 72 Byte

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
quelle
1

Pyth, 18 Bytes

fqQs*VS3CMT^jkU6 3
isaacg
quelle
1

QBIC , 40 Bytes

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

Erläuterung

[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
quelle
1

R , 67 62 61 Bytes

-5 Bytes dank Jarko Dubbeldam

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

Probieren Sie es online!

liest die Nummer aus stdin; Gibt eine Matrix zurück, in der die Zeilen die Zeichen sind.

Es generiert alle möglichen Zifferntrios in einem Matrixformat ( b), berechnet das Matrixprodukt b * [1,2,3], nimmt bdie übereinstimmenden Zeilen (subtrahiert 288von der Eingabe, die ist 1*48+2*28+3*48) und gibt sie zurück.

Giuseppe
quelle
1
t(t(m))ist eine Abkürzung füras.matrix(m)
JAD