※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目、12日目、13日目、14日目、15日目。
第拾陸話 「The Floor Will Be Lava」
タイトルは「床が溶岩になります」。不吉なタイトルですね・・・。
前回光線が収束し、さらに施設の奥に案内されました。進んでいくと完全に天然の洞窟になります。奥には焦点があった光が装置に注がれています。
この装置は、正方形の格子になっており、ミラーやスプリッターが置かれています。この装置を操作することで、光を熱に変換し、洞窟の岩を溶かすようです。
その配置は以下のようになっています(パズル入力)。
.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|....
収束された光(ビーム)は、左上から右側に向けて入ってきますが、以下のように動作します。
- ビームが空のスペース (.) に入るとそのまま直進します
- ビームがミラー (/ または\) に当たると、ミラーの角度に応じてビームは 90 度反射されます(日本語環境だと、バックスラッシュが円マークになってしまいます)。たとえば、右に向かって「/」ミラーに遭遇すと、ビームは上向きに進みます。右方向から「\」ミラーに遭遇すると、ビームはミラーの下向きに進みます。
- ビームがスプリッターの尖った端 (| または -) に遭遇すると、ビームはスプリッターが空きスペースであるかのようにスプリッターを通過します。たとえば、右方向に移動するビームが「-」スプリッターに遭遇すると、同じ方向に進みます。
- ビームがスプリッターの平らな面 (| または -) に遭遇すると、ビームはスプリッターの尖った端が指す 2 つの方向のそれぞれに進む 2 つのビームに分割されます。たとえば、右方向に移動するビームが | に遭遇すると、スプリッターは上下向きの2つのビームに分割します
ビーム同士は干渉しません。また、同時に同じ場所に複数のビームが通過することもあります。ビームが通った場所は、通電します。
ビームが通電した経路をサンプル入力に対して表示すると以下の通りとなります。
######....
.#...#....
.#...#####
.#...##...
.#...##...
.#...##...
.#..####..
########..
.#######..
.#...#.#..
このサンプルでは#をカウントすると46個となります。これがパズルの答えになります。
Part2では、この装置に対して上下左右のどこからどの向きにビームを入れたら帯電する場所が一番多くなるかを答えます。440通り試せばオッケーです。
・ネ
・
・タ
・
・バ
・
・レ
Part1,2を解いてみる
ひたすら指定通りにロジックを組むだけですが、いくつか注意点があります。
このビームの経路ですが、ループするので、どこかで終わらせる必要があります。通った履歴を保存しておいて、再度同じ向きで通るようであれば、そのビームは止める必要があります(そうしないと無限にぐるぐるしてしまいます)。
ビームが同時に複数走るのが要注意ポイントでしょうか。とはいえ、ちゃんと同じ経路になりそうならストップすれば良いだけです。
今回はビームデータを現在の状態を示すデータとして反復することとし、MAP部分は通常の入力としています(反復データを少なくするため)。
ビーム入力は以下のようにしています。
現在のx、yの座標、進んでいる方向、履歴、あと地図のサイズを得るためのMaxのx、y。
MAPは以下のようにシンプルです。
これを以下のような反復マクロに入力します。
入力してくるデータに対して履歴を保存し、次のポイントに移動し、ここで次のポイントをMapから拾ってきて何があるかを判断し、移動したポイントで次に移動する方向を決めておいて、ループする、という形にしています。繰り返し回数としては、約700回くらいで18秒程度かかります。
Part2は、入力データをまず最初に作ります。
ここからバッチマクロで、Part1のマクロを入力データの回数だけ繰り返します。バッチマクロの作成はそれほど高くないです。
ワークフロー全景としては以下のとおりです。
まとめ
- 見事にPart1でハマってしまいました。履歴を取るポイントをミスっていました。一見正常に動いているように見えたので、めちゃくちゃハマりました・・・。
- Part2は実行時間がかかりました。Part1のマクロをそのままバッチマクロで回すだけですが、Part1のマクロの出来がそのままPart2の時間に直結。結果的に1時間20分で完走しました!
- Part1のマクロが意外と遅くて、MAPデータを繰り返すマクロも作ったのですが、複雑な上に余計に遅くなったので捨てました(その分Part2をクリアするのが遅くなりました)。
- 途中でハマったのもありますが、買い物にでかけたりしたので、Part1はPrivate Leaderボードで11位。Part2あわせると10位です。Part2でいらないマクロ作らなかったらもう少し早く終われたのに(笑)
コメント