Как насчет хорошей игры в шахматы?


Адвент кода 2016 День 5

Часть 1

  1. Движение назад помогло
  2. Игра в ожидание… снова

Движение назад помогло

К настоящему времени я уже достаточно хорошо знаком с хэшированием MD5:

  • День 17: Два шага вперед
  • День 14: Одноразовый блокнот
  • А теперь день 5, который, как я полагаю, является первой головоломкой на тему MD5 в этом году — хотя я могу ошибаться.

Игра в ожидание… снова

  • Сгенерировать хэш
  • Проверьте совпадение 00000 с первыми пятью символами в хэше
  • Повторять до тех пор, пока не будет найдено восемь совпадений

Мой алгоритм на JavaScript:

let index = 0, password = "", doorID = 'abc'
while (password.length < 8) {
  let hash = MD5(doorID + index).toString()
  if (hash.slice(0,5) == '00000') {
    password += hash[5]
  }
  index++
}
return password
Вход в полноэкранный режим Выйти из полноэкранного режима

Это может занять некоторое время… особенно если совпадение состоит из пяти 0 подряд!

Это заняло не так много времени, как в День 14 — где мне пришлось генерировать 2017 хэшей каждую итерацию!

Но все равно на выполнение ушло несколько минут.

К счастью, он сгенерировал правильный ответ для моего идентификатора двери!

Часть 2

Крутой поворот и более длительное ожидание

  • Я обновил свой алгоритм, чтобы учесть массив, позицию и значение.

Но изначально я не учел эту часть инструкции:

Использовать только первый результат для каждой позиции

  • Я не был уверен, что это значит.
  • Пока я не запустил свой алгоритм на входном примере.
  • И я получил ответ, отличный от ожидаемого.
  • Потому что я изменил некоторые из уже установленных значений.

После обновления моего кода, чтобы учесть это:

password[hash[5]] = password[hash[5]] || hash[6]
Вход в полноэкранный режим Выход из полноэкранного режима

Мой алгоритм сгенерировал правильный ответ для ID двери примера и ID моей двери!

Мой обновленный алгоритм на JavaScript:

let index = 0, doorID = 'abc'
let password = new Array(8).fill(null)
while (password.includes(null)) {
  let hash = MD5(doorID + index).toString()
  if (hash.slice(0,5) == '00000' && hash[5] < 8) {
    password[hash[5]] = password[hash[5]] || hash[6]
  }
  index++
}
return password.join('')
Войти в полноэкранный режим Выход из полноэкранного режима

Я сделал это!!!

  • Я решил обе части!
  • После короткого времени написания и долгого времени ожидания!
  • И вместив один важный случай использования в моем алгоритме!

Оцените статью
devanswers.ru
Добавить комментарий