Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2024年11日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目。
Day 11「Plutonian Pebbles」
タイトルは「冥王星の小石」。
ストーリーとしては、冥王星の古代文明の石があり、物理法則に反した動きをするそうです。
これは、完全に一直線に並んでいて、石には番号が刻まれています。瞬きするたびに石が変わるのが一番変わっているポイントです。そのルールは以下の通り。
- 石の番号が0であれば、瞬きで1に変化します
- 石の番号の桁数が偶数の場合は、2つの石に分裂します。それぞれの石の左半分は、左半分の桁、右半分は右半分の桁の番号になるようです。
- どれにも該当しない場合、石の番号は元の番号に2024をかけた番号になります。
例として「127 17」という2つの石があるとします。
1:125 17
2:253000 1 7
3:253 0 2024 14168
4:512072 1 20 24 28676032
5:512 72 2024 2 0 2 4 2867 6032
6:1036288 7 2 20 24 4048 1 4048 8096 28 67 60 32
7:2097446912 14168 4048 2 0 2 4 40 48 2024 40 48 80 96 2 8 6 7 6 0 3 2
6回目の瞬きで、22個の石ができます。25回だと55312個になります。
Part1はパズルの入力に対して、25回の瞬きで何個の石になるか?
Part2は75回の瞬きで何個になるか、です。
・ネ
・
・タ
・
・バ
・
・レ
Part1,2を解いてみる
基本的にトリックはなにもないので、言われたとおりにするだけです。一直線とか順番は保持されるとかよくわからない伏線はありましたが、全く関係ありません。空白で行に区切って0だったら1を足す、桁が偶数なら左半分と右半分に分ける、それ以外は2024をかける、を反復マクロで実行するだけです。どれも基本的な操作なので難易度は高くないと思います。データの準備も単に列分割ツールで行に分割するだけです。
Part1のマクロは以下のとおりです。
Part2は、この方式で行うと、データ量が増えすぎて繰り返しがめちゃくちゃ遅くなります(試してないですが、何時間かかるのでしょうか?)。ここで一つトリックを使います。レコードが多すぎる場合はレコードが増えすぎないようにする必要があります。今回は、同じ数字は同じようにしか変化しないので、グループ化しつつカウント合計することでデータ量を大幅に圧縮することができます、
ということでPart2のマクロは、繰り返し出力側でグルーピングと合計を取るだけです。入力についても、合計ができるようにすべてのレコードに1をつけておきましょう。
これであれば、私のワークフローは1.3秒で回ります。
まとめ
- 繰り返し出力のデータをグルーピングして合計するテクニックは、AoCの後半では必須のテクニックです。
- 知ってさえいれば、オアシス問題ですね。
- Private Leaderboardでは、Part1は12位(スタートが遅れました)、Part2は6位でした。Part1からPart2までの時間は4分以内とかなり良い結果となっています。よーいどんでできてたら一位が狙えたくらいの時間で回答まで出せています。
コメント