※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目、12日目、13日目、14日目、15日目、16日目、17日目
18日目です。トップの画像は25日まで完走したものを使っています・・・。
タイトルは、「Boiling Boulders」。沸騰する岩。
今回の問題は、3Dで考えなければならない問題です。内容としては、3Dでスキャンされた溶岩を冷やすために表面積を求める問題です。
サンプルの入力データとしては、以下のようになっています。
2,2,2
1,2,2
3,2,2
2,1,2
2,3,2
2,2,1
2,2,3
2,2,4
2,2,6
1,2,5
3,2,5
2,1,5
2,3,5
これは、x、y、z座標系でスキャンされた立方体が存在する位置を示しています。つまり、1行目は(x,y,z)=(2,2,2)のところに立方体があることを示しています。この例では、全部で13個の立方体が存在しますが、この表面積は64となります(全部で13個×6面=78個の辺がありますが、隣接する側面をカウントからはずします)。
Part2では、内部のエアポケット(外側と接しない部分)を抜いた表面積を計算する必要があります。
問題としては非常にシンプルです。
・ネ
・
・タ
・
・バ
・
・レ
解いてみる
3Dなので想像するのが大変です・・・(可視化が大変)。
そのため、まずx、y座標のみについて考え、それをz座標方向に積み重ねて考えてみました。可視化もこれをベースで行いました。例えば、テーブルツールを使って以下のように可視化しました。
Part1のロジックとしては、まずx、y座標についてのみに着目して考えました。各ポイントに対して隣り合うポイントを作成し、全体のポイントと結合して結合できたポイントは重なるということ、立方体の数×6面から結合された数を引き、さらにz軸についてもz軸内で隣接する数を算出し、引いて結果を出しています。
Part2のロジックとしては、この立方体の塊の外側に大きな箱を作って、箱側から隣接するポイントを作成していき、この立方体にぶつかったらそこでストップとしています。ぶつからなかったらまた新しいポイントを作っていく、という考え方でぶつかるところまで探し続ける、というアルゴリズムにしています。これにより、立方体の型を取ることができるので、箱の外側の表面積からPart1のロジックを使って重なる面積を引けば欲しい面積が得られます。Part2は水のタンクを用意して、溶岩の塊を沈めていくときに見られる浸水ロジックとして解きました。
浸水シミュレーションマクロ:
まとめ
- 18日目も、図形的な問題です。3Dになってさらに凶悪になったように思いますが、逆にシンプルなロジックになった気がします。
- 比較的解けた人は少なめです・・・。特にPart1は解けるけど、、、といった感じでPart2の難易度が高いようです。
- 個人タイム:Part1 1時間7分8秒。Part2:5時間28分1秒(PrivateLeaderboardで1位でした!)※Part2は時間かけてやっています
コメント