Сигналы и шум


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

Часть 1

Нет проблем!

  • Еще одна головоломка с подсчетом символов?
  • Я уже чувствую себя мастером!
  • Возможно, это редкий случай, когда я соединяю два метода reduce() — я и раньше вставлял их друг в друга, но редко использовал один за другим.

Мой алгоритм в виде псевдокода:

Split the input at each newline character into an array of strings
For each string, accumulate an array with as many empty objects as there are characters in the string
  Split each string into an array of characters
  For each character
    Increment the number associated with the character key in the object at the same index in the accumulating array as the character's in the string
For each object, accumulate a string
  The next character is the one who's key is associated with the largest number among all the keys in that object
Return the accumulated string
Войти в полноэкранный режим Выход из полноэкранного режима

Мой алгоритм в виде JavaScript:

input.reduce(
 (counts, line) => {
  line.split('')
   .forEach(
    (char, i) => counts[i][char] = (counts[i][char] || 0) + 1
   )
  return counts
 }, new Array(stream[0].length).fill(null)
                               .map(el => Object.create({}))
).reduce(
 (message, tallies) => {
   return message += Object.entries(tallies)
    .find(
       (el) => el[1] == Math.max(...Object.values(tallies))
    )[0]
 }, ""
)
Войти в полноэкранный режим Выход из полноэкранного режима

Он выдал easter для примера, как и ожидалось!

Он также сгенерировал мой правильный ответ!

Часть 2

Измените max на min

Это все, что мне нужно было сделать, чтобы получить правильный ответ!

Я переработал свой алгоритм, чтобы получить оба ответа:

function bothParts(fn) {
 input.reduce(
  (counts, line) => {
   line.split('')
    .forEach(
     (char, i) => counts[i][char] = (counts[i][char] || 0) + 1
    )
   return counts
  }, new Array(stream[0].length).fill(null)
                                .map(el => Object.create({}))
 ).reduce(
  (message, tallies) => {
    return message += Object.entries(tallies)
     .find(
        (el) => el[1] == fn(...Object.values(tallies))
     )[0]
  }, ""
 )
}
// Part 1: bothParts(Math.max)
// Part 2: bothParts(Math.min)
Войти в полноэкранный режим Выйти из полноэкранного режима

Работает отлично!

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

  • Я решил обе части!
  • За рекордное время для головоломки дня 5: менее получаса!
  • И с помощью одной длинной серии цепочки вызовов методов в менее чем 10 строках кода для тела функции!
  • Я даже сделал глупый GIF, чтобы показать, как работает мой алгоритм!

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