SwiftでAdvent of Code 2024 #AdventOfCode

はてなエンジニアアドベントカレンダー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を解く活動が起きています。

リポジトリテンプレートも用意されています。
GitHub - swiftlang/swift-aoc-starter-example: Swift starter project for solving Advent of Code challenges.

自分も昨年からチャレンジしていますが、昨年は37スターで挫折していました...

2024

2024年は、無事に完走して50スターを達成できました🎉

github.com

今回は無理せず、悩む問題は RedditYoutubeを見たりして、完走を目指しました。

Swift x Advent of Code

Advent of Codeはどんなプログラミング言語*1でも挑戦できます。
コード長を採点されないので、Swiftらしい型を尊重して書くこともできます。
また、正規表現が苦手な自分もRegexBuilderを使えるのがよいところです。

apple/swift-algorithm、swift-collections

Swiftのリポジトリテンプレートから始めると、apple/swift-algorithmsが依存に入っています。
apple/swift-collections も使える状態になっています。
普段のアプリ開発では出会う機会が少ないですが、引き出しにあると安心です。
今回は以下を使いました。

パターンを見つける

パズルの多くは、考え方をパターン化できます。

  • マップ内をルールに則って移動していく
  • 迷路の最短経路問題
  • 再帰処理のメモ化

もちろん、これだけでは解けない問題もありますが、ある程度準備をしておくと有利です。
自分も手札を作りながら進めてました。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:あるいはプログラミングではなくても