Wsparcie! Zapomniałem hasła!

24

Wsparcie! Właśnie zalogowałem się do Stack Exchange, ale zapomniałem, jakie jest moje hasło! Potrzebuję sposobu, aby to rozwiązać, zanim się wyloguję.

Na szczęście jestem doskonałym hakerem. Nie tylko mogłem znaleźć skrót mojego hasła, ale także znalazłem algorytm mieszania Stack Exchange! Pobiera wartość ASCII każdej cyfry pomnożoną przez miejsce tej cyfry, a następnie sumuje wszystkie te wartości razem. Na przykład:

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

Pamiętam, że moje hasło składa się z 3 cyfr i że każdy znak jest liczbą od 0 do 5 włącznie (tak, że będzie pasować do wyrażenia regularnego:) ^[0-5]{3}$, ale to wciąż zbyt wiele możliwości zgadnięcia. Potrzebuję programu, który może przekształcić skrót z powrotem w potencjalne hasła, ale pomimo tego, że jestem ekspertem w dziedzinie hakerów, nie mogę kodować, aby uratować mi życie! Udało mi się jednak napisać te testy ręcznie:

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

Czy ktoś z was może napisać program, który weźmie skrót i wydrukuje wszystkie możliwe hasła, których mógłbym użyć?

Dane wejściowe zawsze będą w stanie wygenerować co najmniej jedno prawidłowe hasło. Dowolny format wyjściowy jest dozwolony, o ile ciągi znaków można wyraźnie zidentyfikować. Nie jestem również zaniepokojony zerami, więc jeśli potencjalny hasło 001, będę również zaakceptować 01lub 1.

Proszę, pomóż mi zostać zablokowanym w Stack Exchange!

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w każdym języku!

Lord Farquaad
źródło
Czy zamiast tego nie 1ma wartości Ascii ? 4948
LiefdeWen,
1
@LordFarquaad przypadki testowe wyglądają dobrze, ale przykładem powinno być"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen
1
muszą być oddzielone przecinkiem (przecinek, po którym następuje co najmniej jedna spacja, jest również w porządku) Dlaczego restrykcyjny format wyjściowy? Zwykle zezwalamy na elastyczne formaty
Luis Mendo,
1
Zazwyczaj mówi się coś takiego: „Dowolny format wyjściowy jest dozwolony, o ile ciągi znaków można wyraźnie zidentyfikować”. A może dopuścić dowolny separator nienumeryczny. Jeśli to zmienisz, powiadom obecnych odpowiedzi z komentarzem w odpowiedzi
Luis Mendo,
1
@FelipeNardiBatista Tak, wiodące zera są opcjonalne. Pamiętam, że użyłem 3 cyfr, więc jeśli tylko zobaczę 54, mogę wyliczyć zera z przodu.
Lord Farquaad,

Odpowiedzi:

9

C , 113 108 bajtów

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

Unikalne jest zobaczenie, co jest przeznaczone na dane wyjściowe, dane wyjściowe mają format: 200010

Wszystkie hasła są zapisane jako 3-cyfrowe bez separatora.

Xanoetux
źródło
2
Hej, kod umiem czytać! Niezły kontrast do galaretki i tym podobnych. +1 za używanie klasycznego języka. :)
Wildcard,
8

Galaretka , 16 bajtów

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

Monadyczny link zwracający listę list cyfr.

Wypróbuj online!

W jaki sposób?

Ṿ€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
źródło
5

Python 2 , 126 75 bajtów

-2 dzięki @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]

Wypróbuj online!

Felipe Nardi Batista
źródło
Jeśli wymienić obie P/6/6„sz P/36, oszczędzasz 2 bajty
Arnold Palmer
Właśnie to miałem napisać, +1
musicman523
@Felipe Nardi Batista, nie wiem, dlaczego tak miałoby być
Arnold Palmer
4

MATL , 20 bajtów

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

Wypróbuj online!

Wyjaśnienie

'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
źródło
3

Python 2 , 81 bajtów

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)

Wypróbuj online!

musicman523
źródło
2

C # (.NET Core) , 133 131 125 123 bajtów

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

Wypróbuj online!

jkelm
źródło
Wcześniej udzielałem bardziej szczegółowych porad, ale nie udało mi się tego zrobić. Na razie moją prostą optymalizacją jest użycie Console.Write($"{i%48}{j%48}{k%48},");wyjścia, zamiast budowania wartości zwracanej i usuwanie niepotrzebnych nawiasów wokół instrukcji if, aby zaoszczędzić 8 bajtów.
Kamil Drakari,
Próbowałem wcześniej tej opcji, ale Lambda wymaga wartości zwracanej. Usunięcie nawiasów będzie jednak działać. Dzięki :)
jkelm
Sonda lambda wymaga wartości zwracanej, jeśli zostanie zdefiniowana jako Func<int,string>, ale jeśli zostanie zdefiniowana jako, Action<int>wówczas nie oczekuje wartości zwracanej.
Kamil Drakari 17.07.17
Nie zdawałem sobie z tego sprawy! Jestem nowy zarówno w C #, jak i golfie, ale postanowiłem wypróbować go, gdy nie mam nic innego do roboty w pracy. Jeszcze raz dziękuję za wskazówki. Bardzo je doceniam.
jkelm
1
Jeśli grasz z dwuznacznością między chari intw C #, możesz zadeklarować zmienne iteracyjne jak charw pierwszej pętli i nadal wykonywać obliczenia skrótów dokładnie tak samo, jak podczas uproszczenia Console.Write()zdania. W ten sposób można uzyskać właściwe rozwiązanie 119-bajtowe. Wypróbuj online!
Charlie,
2

Węgiel drzewny , 33 bajty

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

Wypróbuj online!

Podobne podejście do innych odpowiedzi: zapętlić trzykrotnie od 0 do 5, obliczyć skrót i wydrukować stan zmiennych iteracyjnych, jeśli pokrywa się z hasłem wejściowym.

Link do pełnej wersji .

Charlie
źródło
2

CJam , 26 25 bajtów

-1 bajt dzięki Challenger5

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

Anonimowy blok oczekujący skrótu na stosie (jako liczba całkowita) i pozostawia wynik na stosie (jako lista ciągów znaków).

Wypróbuj online!

Wyjaśnienie

: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.
Business Cat
źródło
@ LordFarquaad Oh, uh ... nawet tego nie widziałem, więc myślę, że to szczęście
Business Cat
{:H;6Zm*{s:i3,:).*:+H=},}jest o 1 bajt krótszy. Wykorzystuje ciągi znaków w filtrze zamiast liczb, aby użyć m*automatycznego zakresu.
Esolanging Fruit
@ Challenger5 Fajnie, dzięki!
Business Cat
2

Java, 162 bajty

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
źródło
2

JavaScript (Firefox 30-57), 72 bajty

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
źródło
1

Pyth, 18 bajtów

fqQs*VS3CMT^jkU6 3
isaacg
źródło
1

QBIC , 40 bajtów

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

Wyjaśnienie

[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
źródło
1

R , 67 62 61 bajtów

-5 bajtów dzięki Jarko Dubbeldam

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

Wypróbuj online!

odczytuje liczbę z stdin; zwraca macierz, w której wiersze są znakami.

Generuje wszystkie możliwe trzy cyfry w formacie macierzy ( b), oblicza iloczyn macierzy b * [1,2,3], pobiera wiersze, bktóre pasują (odejmując 288od wejściowego, który jest 1*48+2*28+3*48) i zwraca je.

Giuseppe
źródło
1
t(t(m))jest skrótem odas.matrix(m)
JAD