Advent of Code というのがある。
日本ではまだあまり 知っている人/やっている人 は多くないかもしれない。検索してみても、日本語の紹介記事はこれくらいしか見つからなかった。
僕も、去年 元同僚の @ExAdamu に教えてもらうまでは存在すら知らなかった。
どういうものか、っていうのは上に貼った記事でも書かれている通りで、12/1 〜 12/25 まで 毎日1つずつ、プログラミングを使うパズル問題が出題される、というもの。 puzzle input の入力値が与えられ、それに対する回答を自分の書いたコードで計算し、出力値を submitして正解すれば星が貰える。
入力値とそれに対する正解はどうやらユーザごとに異なるものになっているようで、誰かに正解を訊く みたいなものは出来ないようになっている。 重要なのは正解に辿りつくためのコード、ということになる。
問題は毎日 part1 / part2 と分かれていて、part1はだいたい問題文に書いてある通りに正しく実装すれば答えが出せるような感じになっている。 part2 は、使う入力値はpart1と一緒なのだけど 求められるものがより複雑になり、ちょっと難しくなる。それなりに正しくアルゴリズムとデータ構造を駆使しないと解けなかったり、ある程度は数学的な知識が必要になってきたりするようだ。
すべての日程で part1 / part2 すべて正解すれば星が50個集まる、ということになる。
去年は存在を知っただけで全然挑戦していなかったのだけど、今年はちょっと腕試しと練習を兼ねて、ということで Rustで挑戦してみることにした。 現時点で 23日まで出題されていて、46個中41個まで星を集めた状態。
別にこれはコンテストとか競技のものではないので 他の人の回答方法を見てはいけないわけではない(早解き上位を目指す人とかは別だろうけど)。
出来る限り自分で考えてみて、分からなかったら reddit で他の人のコードや考え方を見ても良い。 僕も幾つかは詰まってredditの他の人のアイデアを参考にさせてもらったりもした。
とにかく、やってみると、これはとても面白い。
問題がとてもよく出来ていて、スッキリ解けたときの爽快感がすごい。
あと特徴として、毎回恒例なのか今年のが特別なのかは知らないけど シリーズものになっている問題もある。
奇数日は IntCode
という 整数値列を使ったレジスタマシンのようなものを使用することになり、このインタプリタを実装する問題が day5, day7, day9 あたりで出されている。このへんは順番にやっていないと解けない。
でも ちゃんと動かせると迷路を出現させたりブロック崩しのゲームが動いたりして、これは感動した
I've completed "Care Package" - Day 13 - Advent of Code 2019 https://t.co/dBohq0wslX #AdventOfCode pic.twitter.com/cWsAblH7vy
— すぎゃーん💯 (@sugyan) December 14, 2019
偶数日は逆に他の日とは全然関係ないので まったく予備知識なくても挑戦して解くことが出来るはず。
プログラミングが好きな人や数学が好きな人、是非とも挑戦してみると良いんじゃないかな、と思います。
僕も今年どこまで出来るか分からないけどもうちょっと頑張ってみるし、来年もあったら絶対また挑戦してみたいと思っている。