Содержание
День 4 Advent of Code 2017
Часть 1
- Система управления запасами Redux!
- Написание моего рабочего алгоритма
Система управления запасами 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
- Какой восхитительный поворот!
- Три
reduce()
, вот как! - Раскрытие моих рабочих
reduce()
rs
Какой восхитительный поворот!
- Анаграммы, да? Как весело!
- А также… усложняет
Хм… как мне попытаться решить это?
Три reduce()
, вот как!
Это будет очень быстро усложняться, так что потерпите меня:
- Внешний
reduce()
для отслеживания количества правильных парольных фраз. - Внутренний
reduce()
для сбора всех строчных букв для каждого слова - Внутренний
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
!