Высокоэнтропийные парольные фразы


День 4 Advent of Code 2017

Часть 1

  1. Система управления запасами Redux!
  2. Написание моего рабочего алгоритма

Система управления запасами Redux!

  • Помните День 2 2018 года?
  • В нем меня просили найти точное количество букв в строках.
  • Это похоже, но, на мой взгляд, проще.
  • Потому что мне не нужно создавать объект с количеством букв для каждой строки.
  • Мне просто нужен Array и Set, чтобы я мог сравнить length и size!

Написание моего рабочего алгоритма

Split the input at each newline character into an array of strings

For each string, accumulate a tally, starting at 0
  Split the string at each space character into an array of strings
  If the length of the array is the same as the size of a Set generated from that array
    Increment the tally by 1, because there are no duplicate phrases
  Else
    Leave the tally unchanged

Return the tally
Вход в полноэкранный режим Выйти из полноэкранного режима

В JavaScript я использую reduce(), split(), Array.length, Set.size и ternary operator в одном длинном цепочечном операторе:

input.split('n')
     .reduce((tally, current) => {
       return tally += current.split(' ').length 
                    == new Set(current.split(' ')).size 
                    ? 1 : 0
     }, 0)
Войти в полноэкранный режим Выход из полноэкранного режима

Часть 2

  1. Какой восхитительный поворот!
  2. Три reduce(), вот как!
  3. Раскрытие моих рабочих reduce()rs

Какой восхитительный поворот!

  • Анаграммы, да? Как весело!
  • А также… усложняет

Хм… как мне попытаться решить это?

Три reduce(), вот как!

Это будет очень быстро усложняться, так что потерпите меня:

  1. Внешний reduce() для отслеживания количества правильных парольных фраз.
  2. Внутренний reduce() для сбора всех строчных букв для каждого слова
  3. Внутренний reduce() для генерации подсчета строчных букв для одного слова.

Эта анимация иллюстрирует каждый из reduce() на примере последнего набора ключевых фраз:

Раскрытие моих рабочих reduce()rs

Это JavaScript, который я с гордостью написал примерно за 15 минут:

return input
  .split('n')
  .reduce((passphrases, passphrase) => {
    let letterCounts = passphrase
      .split(' ')
      .reduce((list, group) => {
        let counts = group
          .split(' ')
          .reduce((tallies, letter) => {
            tallies[letter] = (tallies[letter] || 0) + 1
            return tallies
          }, {})
        list.push(
          Object.keys(counts)
            .sort()
            .map(el => el + '|' + counts[el]).join(''))
        return list
      }, [])
    return passphrases += letterCounts.length 
                       == new Set(letterCounts).size 
                       ? 1 : 0
  }, 0)
Вход в полноэкранный режим Выход из полноэкранного режима

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

  • Я решил обе части!
  • Я использовал тонну reduce()!
  • Я сделал подробный GIF, показывающий, что делает каждый reduce()!
  • Мне очень понравилось решать часть 2!
  • Теперь у меня лучший звездный результат за год: 40!

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