1P by GN⁺ | ★ favorite | 댓글 1개
  • 12월 프로그래밍 퍼즐 이벤트인 Advent of Code는 실력과 언어 선택의 장벽을 낮춰, 연습·교육·경쟁 등 다양한 목적으로 참여할 수 있게 설계됨
  • 컴퓨터과학 배경이나 고성능 장비가 없어도 되며, 모든 문제에는 10년 된 하드웨어에서 최대 15초 안에 끝나는 해법이 있음
  • 풀이가 막히면 예제 확인, 직접 만든 테스트 케이스, 입력 검증, 친구나 subreddit 힌트 순서로 문제를 좁혀가면 됨
  • 2024년 FAQ에는 이벤트 길이 변경, global leaderboard 제거, private leaderboard 규칙, AI 사용, 복제·재배포 제한 같은 운영 정책이 정리돼 있음
  • 속도 경쟁은 선택 사항이며, 참가자는 자신에게 유용한 방식으로 퍼즐을 풀고 학습하는 데 집중할 수 있음

Advent of Code의 성격과 참여 조건

  • Advent of Code는 작은 프로그래밍 퍼즐로 구성된 Advent calendar 형식의 이벤트임
  • 퍼즐은 다양한 실력 수준을 대상으로 하며, 원하는 프로그래밍 언어로 풀 수 있음
  • 면접 준비, 회사 교육, 대학 과제, 연습 문제, 속도 경쟁, 참가자 간 도전 등에 활용됨
  • 컴퓨터과학 배경은 필수가 아니며, 약간의 프로그래밍 지식과 문제 해결 능력만 있어도 참여할 수 있음
  • 고성능 컴퓨터도 필요 없고, 모든 문제에는 10년 된 하드웨어에서 최대 15초 안에 끝나는 해법이 있음

막혔을 때의 풀이 절차

  • 풀이가 막히면 먼저 퍼즐에 포함된 예제로 프로그램을 검증해야 함
  • 예제 결과가 맞지 않으면 문제 설명을 다시 읽고, 오해한 부분이나 예상과 다른 프로그램 동작을 확인함
  • 예제는 맞지만 정답이 틀리면, 손으로 답을 확인할 수 있는 테스트 케이스를 직접 만들어 프로그램에 적용함
  • 전체 퍼즐 입력을 빠짐없이 사용했는지도 확인해야 함
  • 계속 막히면 친구에게 도움을 요청하거나 나중에 다시 풀 수 있으며, subreddit에서 힌트를 받을 수도 있음

사이트 사용과 인증

  • 코드 블록은 JavaScript가 활성화되어 있으면 트리플 클릭으로 전체 선택할 수 있음
  • 인증은 OAuth를 사용해 외부 서비스에서 신원을 확인함
    • 로그인할 때 자격 증명은 Advent of Code가 아니라 해당 외부 서비스에만 제공됨
    • 외부 서비스는 Advent of Code 서버에 사용자가 본인임을 알려줌
    • 일반적으로 이미 공개된 정보 외에는 추가 정보가 드러나지 않음
    • Advent of Code는 인증 서비스의 고유 ID, 이름, URL, 이미지를 기억함
  • 사이트 글자가 읽기 어렵다면 고대비 대체 스타일시트를 사용할 수 있음
    • Firefox는 View → Page Style → High Contrast를 기본 지원함

난이도, 공개 시간, 이벤트 길이

  • 퍼즐의 난이도와 주제는 이벤트마다 달라짐
  • 일반적으로 시간이 지날수록 퍼즐은 더 어려워지지만, 개인의 기술 조합에 따라 체감 난이도는 크게 달라질 수 있음
  • 퍼즐은 EST/UTC-5 자정에 공개됨
    • 그 시간이 운영자가 안정적으로 문제 없이 동작하는지 확인할 수 있는 시간이기 때문임
    • 자정에 참여하지 못해도 문제가 없고, 지역 내 경쟁은 private leaderboards를 사용할 수 있음
  • 이벤트 일수는 변경됨
    • Advent of Code 운영에는 매년 많은 자유 시간이 필요하고, 퍼즐 제작이 그중 대부분을 차지함
    • 10년 동안 일정을 유지한 뒤 변화가 필요해짐
    • 퍼즐은 날짜 번호가 맞도록 12월 1일에 시작하며, 매일 공개되고 12월 중순에 끝남

리더보드와 속도 경쟁

  • global leaderboard는 제거됨
    • 운영자, 인프라, 많은 사용자에게 가장 큰 스트레스 요인 중 하나였음
    • 일부 참가자는 경쟁을 지나치게 심각하게 받아들였고, DDoS 공격 같은 행동도 있었음
    • 많은 사용자가 자신의 시간이 비교 대상보다 느리다는 이유로 자신을 더 나쁜 프로그래머라고 잘못 결론 내림
    • 2015년에 재미있는 기능으로 시작했지만 10년 동안 점점 커지는 문제가 되었음
  • private leaderboard의 읽기 전용 보기는 공유할 수 있음
    • 이 기능이나 데이터를 사용해 새로운 global leaderboard를 만들면 안 됨
  • 빠른 풀이 시간은 선택 사항임
    • 빠르게 풀려면 퍼즐 풀이 외에도 여러 추가 기술과 많은 연습이 필요함
    • speed-solve 코드는 코드 리뷰를 통과할 코드와 전혀 다르게 보일 때가 많음
    • 자신에게 유용한 목표에 맞춰 접근 방식을 고르고 속도 경쟁을 완전히 무시해도 괜찮음

AI 사용과 private leaderboard 규칙

  • private leaderboard에 속해 있다면 운영자에게 기대 규칙을 확인해야 함
  • 규칙이 맞지 않으면 다른 private leaderboard를 찾거나 직접 만들 수 있음
  • private leaderboard 규칙에는 최대 실행 시간, 허용 언어, 퍼즐을 처음 열 수 있는 시간, 사용할 수 있는 도구, 작업 중 우스꽝스러운 모자를 써야 하는지 여부까지 포함될 수 있음
  • Advent of Code 퍼즐을 풀 때 AI 사용은 권장되지 않음
    • 대신 친구를 헬스장에 보내면 자신이 강해질 수 있느냐는 비유가 사용됨
    • 퍼즐은 사람이 풀 때 흥미롭도록 설계되며, AI가 풀 수 있는지 여부는 고려하지 않음
    • AI 프롬프트 연습이 목적이라면 그 목적에 맞게 설계된 다른 연습이 더 적합할 수 있음

퍼즐 아이디어, 버그, 복제 정책

  • 퍼즐 아이디어는 보내지 말아야 함
    • 저작권과 attribution 같은 법적 문제 때문에 아이디어를 받지 않음
    • 실수로 일부를 사용할 가능성을 피하려고 퍼즐 아이디어처럼 보이는 이메일도 읽지 않음
  • 퍼즐 버그를 발견했다고 생각하면 먼저 subreddit에서 확인해야 함
    • 퍼즐 공개 후 한 시간이 지나면 이미 많은 사람이 풀었기 때문에 그 이후에는 버그 가능성이 매우 낮음
  • Advent of Code는 무료로 사용할 수 있지만 복제는 자유롭지 않음
    • 코드 저장소에 퍼즐 본문이나 자신의 입력 같은 Advent of Code 일부를 포함하지 말아야 함
    • 웹사이트를 만들 때 Advent of Code처럼 보이게 하거나 비슷한 이름을 붙이지 말아야 함

법적 고지와 허용 범위

  • Advent of Code는 미국 등록 상표임
  • Advent of Code의 디자인 요소, 문구, 스타일, 개념은 Advent of Code의 단독 재산이며, 명시적 서면 동의 없이 복제하거나 사용할 수 없음
  • 저작권 표기는 2015-2025 Advent of Code이며 모든 권리를 보유함
  • 토론, 수업, 소스 코드, 인쇄물 등에서 Advent of Code 퍼즐에 링크하거나 참조할 수 있으며, 상업적 맥락에서도 가능함
  • Advent of Code는 사용자의 풀이 구현에 대한 소유권이나 저작권을 주장하지 않음

댓글과 토론

Hacker News 의견들
  • AoC를 좋아해서 지난 2~3년은 Rust로 풀었고, Discord에서 다 같이 가장 빠른 풀이를 만드는 식으로 놀았음
    그 과정에서 온갖 성능 최적화 요령, 고급 알고리즘, SIMD를 배웠음
    이번에는 직장에서 쓰는 Go를 좋아하거나 견딜 수 있게 될지, 아니면 별로라는 가설을 확인하고 꼭 필요할 때만 쓸지 보려고 Rust와 Go로 풀어보는 중

    • 지난 몇 년간 Go로 풀어봤는데, day 6 이후로 갈 시간이나 집중력은 늘 부족했지만 이런 용도에는 꽤 좋았음
      실용적이고, 환경 설정이나 곁가지 작업이 적고, 파일 읽기/파싱 같은 필요한 기능이 대부분 내장되어 있으며, 성능도 좋고 하드웨어에 가까운 편이라 숨은 성능 함정이 적음
      Rust는 써본 적이 없어 비교는 어렵지만, 아주 피상적으로 보면 덜 실용적으로 느껴짐
      AoC는 메모리 안전성 같은 프로덕션 기준이 크게 필요하지 않으니, 후반 문제에서는 안전성보다 실용성과 성능이 더 중요해 보임
    • Rust에서 빠르게 푸는 접근이 궁금한데, 공유할 만한 링크가 있으면 보고 싶음
    • Discord를 공유해줄 수 있으면 좋겠음
      매년 Zig로 속도 최적화를 해보려고 함: https://github.com/ManDeJan/advent-of-code
    • Go는 "Golang"이 아니고, Rust보다 컴파일 시간이 낫고 서로 맞지 않는 동시성 사용 방식을 억지로 결합하려 하지 않음
      오히려 반대로 Rust를 좋아해보려고 하는 딜레마가 있음
    • AoC 프로젝트를 어떻게 구성하는지 궁금함
      Rust로 해보려 했는데, 날짜별로 모듈을 나눠야 하는지, 각 날짜를 라이브러리 파일로 두고 메인 진입점에 연결해야 하는지 감이 안 잡힘
      공개 저장소가 있으면 공유해주면 좋겠음
  • 올해의 도전은 표준 라이브러리나 할당자 없이 C로 작성하는 것임
    32KB SRAM을 가진 STM32에서 실행 가능해야 함
    2년 전에는 어셈블리로 해봤는데, 어셈블리용 표준 라이브러리를 몇 시간씩 만들다가 포기하고 Rust로 갈아탔음

    • 작년에는 실제 Amiga 1200에서 C로 해봤고, DICE라는 Matt Dillon의 컴파일러/런타임을 썼음
      많이 진행하지는 못했는데, 메모리 보호가 없으면 정말 어려워짐
      올해는 Amiga에 MMU가 있는 060 업그레이드가 있으니, 그걸 어떻게 활용할지 알아내서 다시 해볼 수도 있겠음
    • 올해도 Common Lisp로 가지만, 첫날 문제는 내가 "아는" 모든 언어로 풀어보기로 했음
      C도 포함했는데 해시 테이블이 없어서 정말 고통스러웠음
      https://git.sr.ht/~q3cpma/aoc2024/tree/master/item/01
      진행 상황을 볼 수 있게 저장소 링크를 올려주면 고맙겠음
    • 그 제약은 꽤 어렵게 들리지만 행운을 빎
      작년에는 외부 라이브러리 없이 C로 모든 문제를 풀었고 [1], 아주 재미있었음
      잊고 있던 저수준 요소, 예를 들면 힙 같은 것을 직접 구현하게 만들었고, 수치 루틴도 직접 작성하게 됐는데 생각보다 쉬웠음
      [1] https://github.com/sebastianotronto/aoc/tree/master/2023
    • RPC 호출만 가능하면 32KB RAM 안에서도 뭐든 할 수 있음 :-)
    • 대칭적으로 보면 sh와 튜링 완전하지 않은 표준 CLI 도구만 쓰는 것도 생각해볼 만함
      grep은 되고 awk는 안 되는 식인데, 비슷하게 제한적이면서도 치명적인 메모리 손상 버그는 없음
  • 보통 AoC는 Common Lisp로 하지만, 올해는 Swift를 시도해보는 중
    정적 타입의 주류 언어치고는 이런 자잘한 조작에 꽤 괜찮음
    https://github.com/codr7/aoc24/tree/main/swift/Sources/aoc
    올해는 조금 이상한데, 새 직장에서 이벤트를 준비하던 중이었음
    개발자들이 프레임워크를 이어 붙이는 것보다 실제 문제 해결을 배우는 데 유용하다고 생각했기 때문임
    그런데 새 상사가 도저히 같이 일할 수 없는 사람으로 드러나서 떠나야 했음
    결국 늘 그렇듯 나와 Emacs만 남을 듯함

    • 아직 안 했다면 Swift 리더보드에 참여해보면 좋겠음: https://forums.swift.org/t/advent-of-code-2024
      서로 다른 풀이를 비교하는 게 꽤 흥미로움
    • Swift에서 문자열 파싱과 조작이 꽤 고통스럽지 않은지 궁금함
      예전에 Swift로 AoC를 해보려 했는데 그 부분 때문에 많이 식었음
      작은 함수형 한 줄 풀이들은 좋았지만, 일주일쯤 지나면 파싱 부담이 너무 커질 것 같음
    • 풀이 작성, 컴파일, 실행을 전부 Emacs에서 하는지 궁금함
      올해 Swift를 시도해보고 싶었지만, 이걸 하려고 Xcode를 띄우는 건 좀 과한 느낌임
  • 또 돌아왔군, 점점 복잡해지는 입력 파서를 25일 동안 쓰는 시즌

    • 그런 문제가 제일 싫음
      진짜 문제는 입력을 다루기 좋은 형태로 파싱하는 데 있고, 일단 파싱만 끝나면 쉬워짐
    • 며칠 지나면 결국 정규식을 쓰게 되고, 매년 잊어버려서 다시 배워야 함
    • 입력 파서가 날짜가 갈수록 복잡해지는 건 아님
      복잡해지는 건 문제 자체이고, 22일이나 23일쯤의 어려운 문제도 입력은 대개 공백으로 구분된 정수 줄이나 점들의 격자 같은 형태라 1~3일차의 쉬운 문제와 비슷함
    • 입력 파싱에 재미있는 이야기를 붙인 것임
    • split/explode 스타일 파서보다 scanf와 상태 기계가 훨씬 효과적이라고 봄
  • 올해는 별을 모두 모아서 총 500개 별을 채우는 게 목표임
    모든 연도, 모든 문제를 끝내는 셈
    지난주 기준으로 전체 450개 별을 가진 사람이 약 1024명쯤 있었음
    2022년 day 6쯤에야 시작했지만 빠져들었고, 2023년 초에 시간이 있어 이전 연도들을 쭉 풀었음
    몇 가지 알고리즘을 준비해두면 아주 어렵지는 않고, 해마다 반복되는 주제도 있음
    평소 자주 만지지 않는 실제 알고리즘 같은 것들을 다시 익히는 재미가 있음
    자원봉사자들과 Eric에게 감사하고, 이제 매년 기부하려고 함. 정말 좋은 이벤트임

  • 이 시기의 하이라이트 중 하나라서 좋음
    이번에는 태평양을 동쪽으로 건너는 비행기 안에서 풀어야 했음
    개인적으로도, 친구들·동료들·HN 사람들에게도 재미있는 전통이 됐음
    wastl과 도우미 엘프들이 만들어줘서 다시 한번 대단하다고 느낌
    여기서 가치를 얻는 사람은 가능하다면 후원하면 좋겠음
    열정 프로젝트이긴 하지만 실제 비용이 드는 것도 사실임

    • 스폰서와 AoC++ 사용자가 워낙 많아서, VPS 월 구독료를 내기 힘든 작은 열정 프로젝트라고 보기는 어려운 듯함
      그래도 adventofcode는 정말 훌륭하고, 가능하다면 지원하는 게 좋음
      다만 현재 받는 지원 규모를 보면 제작자는 꽤 잘 지내고 있을 것 같음
  • 올해는 F#과 Gleam으로 해보려고 하지만, 매년 그렇듯 10~12일 이상 할 시간과 머리는 없을 듯함
    Python을 쓰는 사람들은 F#도 한번 써보면 좋겠음
    스크립팅에 꽤 가깝게 느껴질 수 있고, 훌륭한 REPL도 있음

    • AoC를 Whitespace로 푸는 전통을 이어가는 중임 [0]
      첫해에는 너무 지루하지 않게 하려고 표준 라이브러리를 만드는 동기가 됐음
      이제는 더 나은 도구를 끝내뒀으면 좋았겠다는 생각이 듦
      jq로 작성한 gdb 같은 CLI 디버거인 wsjq[1]로 디버깅하지만 느림
      [0]: https://github.com/thaliaarchi/ws-challenges
      [1]: https://github.com/thaliaarchi/wsjq
    • bash로 하는 중이고, 어디까지 갈 수 있을지 보려고 함
    • 지난 두 번의 AoC는 F# 로 했고, 사실 앞부분 며칠만 했음
      함수형 프로그래밍 경험이 없던 사람에게도 재미있었음
      올해는 참가할 시간이 없지만, 한다면 아마 다시 F#을 고를 듯함
    • 나도 F#을 배우기 시작했고 올해 AoC에 써보는 중임
      아직 함수형 여정의 초반이지만, 지금까지는 AoC가 도움이 됐다고 봄
    • Linux 지원은 어떤지 궁금함 :)
  • 작년에는 Day 12에서 일주일 내내 막혔고, 푸는 방법을 생각하느라 깨어 있는 모든 시간이 잡아먹혔음
    올해는 스스로에게 좀 관대해져서 참가하지 않고, 겨울 휴가를 제대로 즐기려고 함

    • 몇 년 연속으로 삶을 잡아먹었고, 두 번은 크리스마스이브에 겨우 끝내기도 했음
      이제는 아예 보지 않음. 재미가 스트레스로 꽤 빨리 바뀜
    • 현명해 보임
      경계를 정하고 쉬는 시간을 즐기는 건 중요함
      나에게 Advent of Code는 미끄러운 비탈길 같음
      난이도가 올라가면서 처음엔 쉽고, 그다음엔 보람 있게 어렵지만, 어느새 너무 많은 시간을 쓰게 됨
      그때쯤엔 이미 감정적으로 투자해버린 게 위험함
    • 친구가 최근에 이걸 공유해줬는데, 마음에 들 것 같음
      https://eli.li/december-adventure
    • 그래프 컷 퍼즐에서 네 달 동안 막혔음
      잘라야 할 가장 긴 세 간선을 찾으려고 힘 기반 그래프 엔진까지 작성해야 했음
      풀고 나서 다른 사람들의 풀이를 보니 Meta의 명제 해결기를 써서 10줄쯤에 끝냈더라
      나에겐 엄청난 꼼수처럼 보였음
  • AoC를 좋아함
    AI 봇이 푸는지, 다른 사람이 더 일찍 일어나는지 신경 쓸 필요 없이 그냥 자기 재미로 풀면 됨
    도전 자체가 좋아서든, 새 언어를 시험해보려는 것이든 상관없음
    나는 업무와 다르게 해보려고 가능한 한 Kotlin 함수형 스타일로 푸는 걸 좋아함
    오늘 풀이도 올려둠. 유틸리티를 쓰기 때문에 순수한 Kotlin은 아니지만, 멋진 함수들을 모아 일종의 라이브러리를 만드는 것도 재미의 일부임
    https://github.com/Matsemann/algorithm-problems/blob/main/ad...