코드 연대기
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
코딩해 보는 게 기대돼요!
Writing my lock‑key matching algorithm
입력을 두 개의 리스트로 변환합니다. 각각은 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이 나오며, 정답과 일치합니다. 이제 내 퍼즐 입력에 바로 적용해볼까 합니다. 최악의 경우 틀린 제출을 하고 남은 시도 기회가 세 번뿐이니, 바로 진행합니다!
Running on my puzzle input
어떤 결과가 나올까요? …
수천 단위의 숫자. 괜찮아 보이나요?
제출해봅니다…
정답이었습니다!
우와!!!
Year in review
올해 최저 점수와 동일하게 34점을 기록했습니다.
올해가 가장 어려운 해였음에도 새로운 최저 점수를 만들지 않은 것이 매우 자랑스럽습니다.

역대 점수는 다음과 같습니다:

382/500은 76.4%이며 강한 C 등급입니다.
지금까지 제 평균은 이 정도였습니다. 또 다른 재미있는 퍼즐이 기다리는 2025년이 기대됩니다!
읽어 주셔서 감사합니다.