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ć 01
lub 1
.
Proszę, pomóż mi zostać zablokowanym w Stack Exchange!
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w każdym języku!
1
ma wartości Ascii ?49
48
"135" -> 1*49 + 2*51 + 3*53 = 310
54
, mogę wyliczyć zera z przodu.Odpowiedzi:
05AB1E , 9 bajtów
Wypróbuj online!
Zwraca listę list cyfr.
źródło
C ,
113108 bajtówUnikalne 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.
źródło
Galaretka , 16 bajtów
Monadyczny link zwracający listę list cyfr.
Wypróbuj online!
W jaki sposób?
źródło
Python 2 ,
12675 bajtów-2 dzięki @ArnoldPalmer
Wypróbuj online!
źródło
P/6/6
„szP/36
, oszczędzasz 2 bajtyMATL , 20 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 , 81 bajtów
Wypróbuj online!
źródło
Haskell,
71706461 bajtówWypróbuj online!
źródło
C # (.NET Core) ,
133 131 125123 bajtówWypróbuj online!
źródło
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.Func<int,string>
, ale jeśli zostanie zdefiniowana jako,Action<int>
wówczas nie oczekuje wartości zwracanej.char
iint
w C #, możesz zadeklarować zmienne iteracyjne jakchar
w pierwszej pętli i nadal wykonywać obliczenia skrótów dokładnie tak samo, jak podczas uproszczeniaConsole.Write()
zdania. W ten sposób można uzyskać właściwe rozwiązanie 119-bajtowe. Wypróbuj online!Węgiel drzewny , 33 bajty
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 .
źródło
CJam ,
2625 bajtów-1 bajt dzięki Challenger5
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
źródło
{: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.Java, 162 bajty
źródło
JavaScript (Firefox 30-57), 72 bajty
źródło
Pyth, 18 bajtów
źródło
QBIC , 40 bajtów
Wyjaśnienie
źródło
R ,
676261 bajtów-5 bajtów dzięki Jarko Dubbeldam
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 macierzyb * [1,2,3]
, pobiera wiersze,b
które pasują (odejmując288
od wejściowego, który jest1*48+2*28+3*48
) i zwraca je.źródło
t(t(m))
jest skrótem odas.matrix(m)