※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目、12日目、13日目、14日目、15日目、16日目、17日目、18日目、19日目、20日目、21日目、22日目
23日目です。21のPart2が解けたときの画像を採用しています。

タイトルは、「Unstable Diffusion」。不安定な拡散・・・。
今回の問題は、地図上に配置されたエルフを条件に従って動かしていく問題です。
サンプルの入力データとしては、以下のようになっています。
....#..
..###.#
#...#.#
.#...##
#.###..
##.#.##
.#..#..
#はエルフ、ドットは空白です。ちなみに、地図は無限大に広がっています。
エルフは以下のルールに従って動きますが、1ラウンドは3つのプロセスに分かれています。
- 移動する方向を決めます。以下のルールを上から見ていきます。
- 北、北東、北西で隣接する位置に他のエルフがいない場合は北に1歩移動することを決める
- 南、南東、南西で隣接する位置に他のエルフがいない場合は南に1歩移動することを決める
- 西、北西、南西で隣接する位置に他のエルフがいない場合は西に1歩移動することを決める
- 東、南東、北東で隣接する位置に他のエルフがいない場合は東に1歩移動することを決める
- 提案を検討する
- 各エルフが移動を提案したポイントに他のエルフが提案してなければ実際に移動が決定される
- 移動する
- 2で決めた位置に移動する
ただし、1で検討する4つのルールは、ラウンドによって一つづつずらして行われます。
例えば、1歩目はリスト通り北→南→西→東の順番で検討します。2歩目は南→西→東→北の順に検討します。3歩目以降も一つずつずらして検討します。
Part1では、10ラウンド後にエルフを含む最小の長方形を作った際に存在する空白のポイントの数をカウントします。
Part2では、エルフが完全に動かなくなるまでにかかるラウンド数を数えます。
・ネ
・
・タ
・
・バ
・
・レ
解いてみる
シンプルに指示通り組み立てれば良いと思います。しっかり可視化しながら進めていくとわかりやすいです。

Part1マクロ:

各プロセスごとにわかるようにコメント入れながら作っています。今回のように明確に指示があるような場合はわかりやすくコメントを入れておくと迷子になりにくいかと思います。
反復回数が指定されている場合は、直接反復回数を指定するのではなく、パラメータにして可変にできるようにしています(Part2で回数が増えることが多いため)。
また、移動方向をどの順番で行うか、というところはパラメータとして反復データに今回持たせていますが、MOD計算すればハードコーディングできるかと思います(Part2でどういう指示が来るかわからないので、柔軟性を持たせていました)。
Part2は終了条件を「動くエルフが0になるまで行う」とPart1のマクロで行っておければそのまま流用可能です。
最終的にPart1、2含めたワークフローは以下のようになります。

むしろPart2の方がシンプルになりました。
まとめ
- 23日目はまたもや地図の問題でした。ただ、難易度的にはちょっと納まったように思います。ただ、ステップが多かったのと、移動方向の検討が毎回じゅんぐりに変わるというのを見落としてデバッグに時間がかかりました。
- 難易度的にはちょっと納まったように思いますが、挑戦者が比較的少ない問題です(Part1が解ければPart2もそのまま解けるというありがたい問題です)
- 個人タイム:チャレンジする時間がすぐに取れなかったのですが、Part1が解けてからPart2は5分程度で解いています。
コメント