пс. ищите все другие мои решения проблем Advent of Code здесь.

День 5

Подробности челленджа смотрите здесь.

Начнем с добавления функции хэш, которая будет принимать входную строку и возвращать шестнадцатеричное представление ее хеша MD5.

Оттуда мы можем создать бесконечную последовательность хеш-значений, сгенерированных путем объединения ввода и возрастающего индекса (согласно инструкции). Но помните, нас интересуют только хеш-значения, начинающиеся с 5 нулей.

Когда у нас есть эта последовательность интересных хеш-значений, часть 1 требует, чтобы мы взяли первые 8 и сделали из них пароль.

Часть 2

Когда дверь открывается, вы видите вторую дверь, в которой используется
чуть более оригинальный механизм безопасности. Явно не впечатленные последней
версией (в каком фильме пароль расшифрован по порядку?!), инженеры компании «Пасхальный кролик»
разработали лучшее решение.

Вместо того, чтобы просто вводить пароль слева направо, решетка теперь также
указывает позицию в пароле, которую необходимо заполнить. Вы по-прежнему ищете хеши
, начинающиеся с пяти нулей; однако теперь шестой символ представляет собой
позицию (0–7), а седьмой символ — это символ, который нужно поместить в эту позицию.

Результат хеширования 000001f означает, что f является вторым символом в пароле.
Использовать только первый результат для каждой позиции и игнорировать недопустимые позиции.

Например, если идентификатор двери abc:

Первый интересный хеш исходит от abc3231929, что дает 0000015…; таким образом, 5
помещается в позицию 1: _5______.
В предыдущем методе 5017308 давало интересный хэш; однако он
игнорируется, так как указывает недопустимую позицию (8).
Второй интересный хэш находится по индексу 5357525, что дает 000004e …; Итак,
e занимает позицию 4: _5__e___.
Вы чуть не подавитесь попкорном, когда последний символ встанет на место,
создание пароля 05ace8e3.

Учитывая фактический идентификатор двери и этот новый метод, какой пароль? Будьте особенно
гордитесь своим решением, если оно использует кинематографическую анимацию «расшифровки».

Мы можем повторно использовать бесконечную последовательность интересных хэш-значений, которую мы построили ранее, но на этот раз нам нужно также отфильтровать хэш-значения, 6-й символ которых не равен 0–7.

Кроме того, нам нужно отслеживать первое хеш-значение для каждой позиции.

Первая идея, которая у меня возникла, заключалась в том, чтобы использовать изменяемый Option‹char›[] (длина 8) для представления пароля, а затем перебирать допустимые значения хэша до тех пор, пока этот массив заполнен Some x. Но этот подход казался мне слишком императивным.

Я не мог использовать сгиб, так как он сворачивает все входные данные.. однако я могу использовать сканирование, которое дает промежуточные результаты в виде последовательности, которую я затем могу пропустить, пока не получу 8 хеш-значений.

Я также могу использовать неизменяемый Set для представления всех незанятых позиций при повторении хеш-значений.

Хотя часть 1 не была легкой в ​​вычислительном отношении, на моем ноутбуке она завершилась за считанные секунды. Часть 2 заняла больше минуты, поэтому, если кто-то знает хороший способ ускорить процесс, пожалуйста, оставьте комментарий к этому сообщению.

Ссылки