代码编年史
Source: Dev.to
Part 1
一种酷炫的年终收官方式。这看起来是个有趣的挑战,我很期待去尝试。
我首先注意到:
- 示例输入把锁和钥匙分开了
- 我的谜题输入 没有 分开
所以我的算法在分类时需要格外仔细。
按照解释,我打算把每个锁和钥匙存为一个数组,数组中的数字代表每列的高度。随后我可以写出这样一个算法:
For each lock
For each column
Further filter the list of keys to those with 5 - N height
in this column, where N is the lock column's height
Any remaining keys are winners
我迫不及待想要写代码实现它!
编写我的锁‑钥匹配算法
把输入处理成两个列表,每个列表包含 5 位数字的列表:
input = input.split('\n\n').reduce((group, item) => {
item = item.split('\n').map(line => line.split(''))
if (item[0].every(el => el == '#')) {
// Lock
let digits = []
for (let i = 0; i el == '.')) {
// Key
let digits = []
for (let i = 0; i {
tally += lock.reduce((keysRemaining, digit, index) => {
return keysRemaining.filter(item => item[index] el.slice())).length
})
真的会这么简单吗?
下面是我的思路:
- 初始化一个计数器,用来统计所有有效钥匙
- 遍历每个锁
- 在对每个数字过滤五次(对应每一列)后,根据剩余钥匙列表的长度来递增计数器
在示例输入上运行时,我得到 3,这正是正确答案。我有点想直接在我的谜题输入上跑一遍。最坏的情况是提交错误,只剩下三次机会指引我走向正确方向。我决定这么做!
在我的谜题输入上运行
会输出什么? …
一个几千的数字。看起来…还行?
准备提交…
结果正确!
Woohoo!!!
年度回顾
我在一年中匹配到了最低分:34。
鉴于今年似乎是最难的一年,我很自豪没有再创下更低的分数。

至于历年总分:

382/500 为 76.4%,相当于一个强劲的 C。
这就是我整个旅程至今的平均水平。又是充满乐趣的一年,出现了有趣的新谜题。接下来,2025!
再次感谢阅读。