はじめに
DenoのブログでAdvent of Codeを紹介していたのを見て、2024年の12月1日から12月25の期間でAdvent of CodeにDenoを使って参加しました。
この記事ではAdvent of Codeについてと完走した感想を述べたいと思います。
Advent of Code
Advent of CodeはEric Wastlさんが作成するプログラミングパズルのアドベントカレンダーです。
プログラミングパズルは日本時間の12月1日から12月25日の毎日14時に、様々なスキルレベルに対応したものが出題されます。
パズルの解答にコードは必要ありません、すなわちどのような言語でもパズルに取り組めます。
解答は与えられた入力に対する答えを入力するだけなので、手計算でゴリ押しすることもできます(手計算の答えを提出してから、コードを考えたこともあります)。
プログラミングパズルではありますが、競プロのようにアルゴリズムやコンピューターサイエンスの知識は必要ありません。最低限のプログラミングスキルと思考力で解けるようなパズルになっています。もちろんそれらの知識があれば有利に解けるパズルは多いと思います。
実際、私は競プロで使うようなアルゴリズムをほとんど知りませんが、全てのパズルを解くことができました。
パズルは毎日Part1とPart2の2つ出題されます。Part2はPart1の内容を発展させたような内容で、Part1を解くことでPart2が開放されます。
Part1とPart2は同一の入力をもとにパズルを解きます。パズルには例題が用意されているのがほとんどで、手元で例題が動くようにしてから解答に使う入力を動かすのが効果的でした。
パズルがどうしても解けない場合はsubredditの投稿を見ます。考え方のヒントとなる投稿や解法を視覚化した投稿が役立ちます。パズルが出題されたあと数時間経つと解答も投稿されていました(解答はいつでも投稿できるわけじゃないようで、条件はよくわかっていないです)。
パズルを解くと星がもらえてトップページがデコレーションされます。下の画像はパズルを解いていない時の表示です。
星を50個全て集めると「10」の部分が綺麗にデコレーションされます。パズルを全て解いて確認してみましょう。
Deno
Denoは、Denoを使用してAdvent of Codeのパズルを解いた日数に応じて景品を提供してくれます。
画像はDenoのブログでPrizesを紹介している箇所から引用
1日分解くとDeno Dinoのステッカー、5日分だとDenoの由来となったコードのステッカー、10日分だとこのイベント限定のステッカー、15日分だと限定のジンジャーブレットステッカーが貰えます。
20日分だとさらに限定版のステッカー3枚のうち1枚が貰えます。
ステッカーを入手するには4つの条件を日本時間の2025年1月4日(9pm PT on January 3rd, 2025.)までに満たす必要があります。この記事が投稿されてすぐ見ている人ならまだ間に合います!
1つ目の条件はGitHubでパブリックな方法を用いて解法を共有します。その際にaoc-2024-in-deno
をtopic
に追加します。
私は念の為、deno
も追加しました。
2つ目の条件はメールアドレスをGitHubのプロフィールに追加することです。
3つ目の条件はソーシャルメディアで解法が書かれたGitHub Repositoryを共有することです。denoland/advent-of-code-2024
のissueを作成して共有するのも良いみたいなのでこちらをお勧めします(ソーシャルメディアが何に値するかわからないので)。
これがあっているかわかりませんが、私は1つ目でtopic
を追加したものは3つ目のGithub Repositoryと同じものを使いました。
4つ目の条件はAdvent of Codeのガイドラインに従うことです。例えばLLMやAIの使用を禁じられています。
これらの条件を満たせばDenoからステッカーをもらえるはずです。初参加なので、本当にもらえるかまだわかっていません。
良かったところ
普段はフロントエンドの道具としてTypeScriptを使っていたので、パズルを解くための道具として用いることで普段利用しないAPIの利用や記述を行えました。異なる視点から利用することで普段の開発だけでは感じなかった点に気づいたり、言語に対する理解が深まりました。
特にパズルを解くために計算量の工夫を求められた時に。Map
やSet
のありがたさを身をもって体感することができました。
パズルは複雑なものが多いのですが、高度な知識を必要とするパズルはほとんどないため、時間をかけてしまえば解けます。そして、時間をかけて解いていくとパズルを重ねるにつれて思考力が身についていることを体感できましたし、時間をかけてパズルを解いた時の達成感とても心地よいものでした。
全てのパズルが機械的に解けるわけではないことも興味深かったです。あるパズルでは、時間ごとに変化する文字列の集合があり、その中から特定の模様が作られる時間を探すというものでした。
10000強ある変化の中から特定の模様が作られているものを探す必要があり、私はブラウザにそれらを表示して全ての文字列を検査しました。
終わった後にエントロピーを計算して最もらしいものをピックアップすれば少ない労力でできることに気づいたのですが、どちらにせよ機会的な判定だけでは解けないパズルがあるのは飽きさせない良い出題だと感じました。
subredditの投稿の活気が良いところもとても良かったです。毎回パズルを解いた後に覗いていたのですが、私が泥臭く解いたパズルをエレガントに解く方法を紹介している人がいたり、視覚化して実装したコードがどのように動いていたかをわかりやすく紹介している人がいました。
showglobe awardでは様々な方法で興味深い投稿をしていた人をまとめたページです。パズルの内容を知らなくても見てみると楽しめると思います(これからパズルを解こうと思っている人にはネタバレになるかもしれません)。
大変だったところ
パズルによっては解くのにかなり時間がかかりました。パズルは順番に難しくなるわけではなく、ランダムな難易度が出題されている印象でした。
あまり時間がない日に難しいパズルが出題されて、寝る時間がなくなることもありました。最高で8時間くらい向き合っていた気がします。簡単なものだと10分かからないくらいだったのでかなり幅がありますよね。
当然ですが、出題が全て英語なことにも苦労しました。パズルの内容を読むのにも日本語と比べて時間がかかりましたし、パズルの内容を勘違いして解いていたこともあります。
また、出題時間が14時であることも大変でした。平日は勤務中ですしパズルが出てからすぐに解くことはできませんでした。午後から予定がある日でもその日の朝に解けないので次の日の朝に解くしかありませんでした。
おわりに
最後に大変だったところを書きましたが、参加して良かったです。
最終日の達成感はかなりありましたし、日々の脳の運動としてちょうど良かったです。来年も開催されれば参加したいと思いました。
今年のDenoのPrizesを目的とした参加にはまだ間に合いますし、過去のパズルもこれから解くことができるようなので年末に時間がある方はチャレンジしてみてはいかがでしょうか。
Advent of Codeを解いている人はどうやらPythonやC++で解いている人が多くTypeScriptで解いている人が少なかったようです。これからTypeScriptで挑戦したいという方で、解答に困った際は私のリポジトリで解答を確認できるので参考程度にどうぞ。うまく動かないパズルなどがあればIssueをお願いします(日本語で大丈夫です)!