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!


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:



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.


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?


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



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!


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 .


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.

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

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]


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)

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.


1
t(t(m))ist eine Abkürzung füras.matrix(m)
JAD
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.