Помогите! Я забыл мой пароль!


24

Помогите! Я только что вошел в Stack Exchange, но забыл, какой у меня пароль! Мне нужен способ решить это, прежде чем я выйду.

К счастью, я отличный хакер. Я не только смог найти хэш своего пароля, но также нашел алгоритм хеширования в Stack Exchange! Он принимает значение ASCII каждой цифры, умноженное на место этой цифры, а затем суммирует все эти значения вместе. Например:

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

Я помню, что мой пароль состоит из 3 цифр, и что каждый символ представляет собой число от 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я смогу вывести нули впереди.
Лорд Фаркваад

Ответы:



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на P/36, вы сэкономите 2 байта
Арнольд Палмер

Это именно то, что я собирался написать, +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.