Довідка! Я забув свій пароль!


24

Довідка! Я щойно увійшов до Stack Exchange, але забув, що таке мій пароль! Мені потрібен спосіб опрацювати це, перш ніж вийти з системи.

На щастя, я відмінний хакер. Не тільки я зміг знайти хеш мого пароля, але і знайшов алгоритм хешування Stack Exchange! Він приймає значення ASCII кожної цифри, помножене на місце цієї цифри, а потім підсумовує всі ці значення разом. Наприклад:

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

Я пам’ятаю, що мій пароль має три цифри і що кожен символ є числом від 0 до 5 включно (таким чином, щоб він відповідав регулярному вираженню:) ^[0-5]{3}$, але це ще занадто багато можливостей здогадатися. Мені потрібна програма, яка може перетворити хеш назад у потенційні паролі, але, не дивлячись на те, що я є хакерським експертом, я не можу кодувати, щоб врятувати своє життя! Мені вдалося написати ці тести вручну:

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

Чи може хтось із вас написати мені програму, яка візьме в хеш і надрукує всі можливі паролі, які я міг би використати?

Вхід завжди зможе створити принаймні один дійсний пароль. Дозволений будь-який вихідний формат, якщо рядки можна чітко визначити. Я також не переймаюся провідними нулями, тому, якщо потенційний пароль 001, я також прийму 01або 1.

Будь ласка, допоможіть мені, щоб я не був закритий з Stack Exchange!

Оцінка балів

Це , тому найкоротша відповідь на кожній мові виграє!


Чи не 1значення Ascii 49замість 48?
LiefdeWen

1
Випробування @LordFarquaad виглядають добре, але приклад повинен бути"135" -> 1*49 + 2*51 + 3*53 = 310
LiefdeWen

1
повинна бути обмежена комою (кома, за якою слідує одне чи кілька пробілів, також добре) Чому обмежувальний вихідний формат? Ми зазвичай допускаємо гнучкі формати
Луїс Мендо

1
Тут звичайно сказати щось на кшталт "дозволений будь-який формат виходу, якщо рядки можна чітко визначити". А може дозволити будь-який нечисловий роздільник. Якщо ви зміните це, повідомте поточних відповідей з коментарем у своїй відповіді
Луїс Мендо

1
@FelipeNardiBatista Так, провідні нулі необов’язкові. Пам’ятаю, я використав 3 цифри, тож якщо я просто бачу, 54я можу розробити нулі попереду.
Lord Farquaad

Відповіді:



9

C , 113 108 байт

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

Унікально бачити, що призначено для виводу, вихід має формат: 200010

Усі паролі записуються у вигляді 3-х цифр без роздільника.


2
Гей, код я можу прочитати! Гарний контраст з желе і таким. +1 за використання класичної мови. :)
Wildcard

8

Желе , 16 байт

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

Монадійне посилання, що повертає список списків цифр.

Спробуйте в Інтернеті!

Як?

Ṿ€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?

5

Python 2 , 126 75 байт

-2 завдяки @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]

Спробуйте в Інтернеті!


Якщо ви заміните обидва P/6/6«S з P/36, ви економите 2 байта
Arnold Palmer

Це саме те, що я збирався написати, +1
musicman523


4

MATL , 20 байт

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

Спробуйте в Інтернеті!

Пояснення

'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 байт

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

Спробуйте в Інтернеті!


Раніше я давав більш ретельну пораду, але не змусив її працювати правильно. Наразі моя проста оптимізація полягає у використанні Console.Write($"{i%48}{j%48}{k%48},");для виведення, а не побудови зворотного значення та видаленні непотрібних дужок навколо оператора if, щоб зберегти 8 байт.
Каміль Дракарі

Я випробував цей варіант раніше, але лямбда вимагає повернення. Зняття дужок буде працювати. Дякую :)
jkelm

Лямбда вимагає зворотного значення, якщо ви визначите це як Func<int,string>, але якщо ви визначите це як Action<int>тоді, воно не очікує поверненого значення.
Каміль Дракарі

Не усвідомлював цього! Я новачок і в c #, і в гольфі, але вирішив спробувати це, коли мені більше нічого робити на роботі. Ще раз дякую за поради. Я дуже ціную їх.
jkelm

1
Якщо ви граєте з неоднозначністю між charі intв C #, ви можете оголосити свої ітераційні змінні, як charу першому циклі, і все одно робити хеш-обчислення точно так само, як ви робите, спрощуючи Console.Write()речення. Таким чином, ви можете отримати правильне 119-байтове рішення. Спробуйте в Інтернеті!
Чарлі

2

Вугілля деревне , 33 байти

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

Спробуйте в Інтернеті!

Аналогічний підхід до інших відповідей: обведіть тричі від 0 до 5, обчисліть хеш і надрукуйте стан змінних ітерації, якщо він збігається з вхідним хешем.

Посилання на багатослівну версію .


2

CJam , 26 25 байт

-1 байт завдяки Challenger5

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

Анонімний блок очікує хеш на стеку (як ціле число) і залишає результат у стеку (як список рядків).

Спробуйте в Інтернеті!

Пояснення

: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 Ой, е-е, я навіть не бачив цього в першу чергу, тому, мабуть, пощастило
Business Cat

{:H;6Zm*{s:i3,:).*:+H=},}на 1 байт коротше. Для використання m*автоматичного діапазону використовується цифрові рядки у фільтрі, а не цифри .
Esolanging Fruit

@ Challenger5 Приємно, дякую!
Ділова кішка

2

Java, 162 байт

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 байти

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 байт

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

Пояснення

[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 байт

-5 байт завдяки Джарко Дуббелдам

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

Спробуйте в Інтернеті!

читає число з stdin; повертає матрицю, де рядки є символами.

Він генерує всі можливі трійки цифр у матричному форматі ( b), обчислює добуток матриці b * [1,2,3], приймає рядки, bякі відповідають (віднімаючи 288з вхідних даних 1*48+2*28+3*48) і повертає їх.


1
t(t(m))є скороченням дляas.matrix(m)
JAD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.