はてなエンジニアアドベントカレンダー2024 30日目の記事です。
昨日は id:vilagia の ぼくの考えた最強のアルゴリズムを雑に検証してみたら、想定通り駄目なアイディアだった話 - 隅田川ヘキサゴナルアンテナ でした。
今日の話も、ちょっとアルゴリズム関係あり。
Advent of Code
adventofcode.com
Advent of Codeは12/1 - 25の25日間、1日ずつ出題されるパズルをプログラミングで解くものです。
1日ずつテーマがあって、Part One/Twoの⭐️、合計50スターを揃えるのが目標。
速さランキングもありますが、実行速度とコード長の短さは問われません。
自分が知ったのは Advent of Code 2019 に挑戦している - すぎゃーんメモ でした。
昨年からSwiftコミュニティでAdvent of Codeを解く活動が起きています。
We're excited for the Advent of Code challenge, and grateful to @ericwastl and his team of elves for their hard work. If you're using Swift to participate, come and join us here: https://t.co/MxN2zf6pbj #AdventOfCode pic.twitter.com/gWU5Y3xFaP
— Swift Language (@SwiftLang) December 1, 2024
リポジトリテンプレートも用意されています。
GitHub - swiftlang/swift-aoc-starter-example: Swift starter project for solving Advent of Code challenges.
自分も昨年からチャレンジしていますが、昨年は37スターで挫折していました...
2024
2024年は、無事に完走して50スターを達成できました🎉
github.comI just completed all 25 days of Advent of Code 2024! https://t.co/xfs6cyvT4P #AdventOfCode
— Yutaro Muta (@yutailang0119) December 28, 2024
今回は無理せず、悩む問題は Reddit や Youtubeを見たりして、完走を目指しました。
Swift x Advent of Code
Advent of Codeはどんなプログラミング言語*1でも挑戦できます。
コード長を採点されないので、Swiftらしい型を尊重して書くこともできます。
また、正規表現が苦手な自分もRegexBuilderを使えるのがよいところです。
apple/swift-algorithm、swift-collections
Swiftのリポジトリテンプレートから始めると、apple/swift-algorithmsが依存に入っています。
apple/swift-collections も使える状態になっています。
普段のアプリ開発では出会う機会が少ないですが、引き出しにあると安心です。
今回は以下を使いました。
Swift is full of helpful methods for solving the type of problems you'll find in Advent of Code, for those who are playing along. Here are a few examples from Swift and the Swift Algorithms core package that are helpful for the day 2 puzzle! 🧩#AdventOfCode pic.twitter.com/oOQgT7y1Q9
— Swift Language (@SwiftLang) December 3, 2024
パターンを見つける
パズルの多くは、考え方をパターン化できます。
- マップ内をルールに則って移動していく
- 迷路の最短経路問題
- 再帰処理のメモ化
もちろん、これだけでは解けない問題もありますが、ある程度準備をしておくと有利です。
自分も手札を作りながら進めてました。ToolKit
ピックアップ
最後にAdvent of Code 2024から、おもしろ問題をピックアップします!
- Day 11: Plutonian Pebbles
- 問題は単純ですが、Part TwoをイメージしてOneを解けるとよかった問題でした。
- Day 14: Restroom Redoubt
- おもしろいんだけど、システム的に解けない系の問題でした...
- Day 20: Race Condition
- 最短経路問題にチートを組み合わせたルールでおもしろかったです。
- Day 24: Crossed Wires
- Part Twoが難しくて、時間がかかりました。解答は提出できたけど一般化が不足していて、例のテストを通せていない。
よいお年を!🐉🔜🐍
*1:あるいはプログラミングではなくても