Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2025年6日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目。

Day 6「Trash Compactor」
タイトルは「ゴミ圧縮機」。
Day5で到達したカフェテリアのキッチンの話は通り過ぎ、なぜかごみ捨て口に入ってしまったようです(なんでやねん)。そして閉まっているドアを頭足動物(タコとか)があけてくれるらしいのですが、それを開けるためにはしばらく待たないといけなくて、なぜか頭足動物の宿題を手伝うというよくわからないことになっています。
その宿題とやらのインプットは以下の通りです。
123 328 51 64
45 64 387 23
6 98 215 314
* + * +
一番下に演算子があり、縦に足したりかけたりするだけです。クイズの答えとしては、各計算結果の答えを合計します。
Part2では、数字が縦に書かれていることが判明しました。例えば、一番右のブロックであれば、4と431と623という3つの数字があり、それを演算子にしたがって計算する、ということです。
・ネ
・
・タ
・
・バ
・
・レ
Part1、2を解いてみる
今回は、パースの手腕が問われる問題です。
厄介なのは二点あり、サンプルの例では大したことなさそうに見えますが、実際の問題では、横方向の数字の桁数がまちまちになっています。このサンプル入力だけでは3桁に揃っていますが、実際は揃っていない・・・。まぁ、これについてはPart1ではあまり気にならないと思います。
もう一つは、サンプル入力では数字の行が3列になっていますが、実際は4列になっています。これも要注意ポイントです。場合によってはサンプル入力と実際の問題で同じワークフローでは通らないかもしれません。
Part1は、横方向にもIDをふっておいて、そのIDごとに計算できるようにするのがポイントです。
- 行ごとにIDをふる
- 入力データを数字の塊ごとに行方向に分解
- 列方向のidを各数字に付与(1のIDごとにグループ化してふる)
- クロスタブで各行で持っていたものを横持ちにする
- 足し算または掛け算を実行
- 合計を算出(パズルの答え)
細かいところは実際のワークフローを見ていただければ・・・。

Part2は結構大変です。Part1では数値の塊で分割できていましたが区切り記号などがまったくないため、Part2は方眼的に解析していく必要があります。
つまりテストデータを以下のように分割し、各セルに対してIDをつけていきます。

こうしたとき、x idの列ごとにグループ化し、縦方向に結合すると、例えばxのidが14のところは431という数字になります。これによって、この塊が4+431+623と計算できます。
また、各塊に対してもidをつけてグループ化することで、id内で計算ができるようになります。

これを実現するためにcacl groupという列を作成し、この値でグループ化する必要があります。
また、演算子(+か*)の扱いが少し難しいです。とはいえ、上記データの中で列方向にコピーするような式を書いてあげれば問題ありません。
これで以下のようになれば、あとはPart1と同じように計算するだけです。

つまり、カンマで区切ったものを別々の列に分割し、Operatorの種類ごとに計算し、合計を取ればオッケーです。
トータルでは以下のようなワークフローになります。

まとめ
- 本日はすんなりいきました
- とはいえ、Part2でどうパースするのか、なかなか悩みました。
- とはいえ、それなりに時間かければできるものだと思いますが、これ中級者レベルでも慣れてないと歯が立たないよなぁ、と思いました。
- 今年は12日しかないので、これで折り返しです!
- 折り返し地点でこの難易度だと簡単じゃね?って思ってしまいますが、これからどうなるのか、、、明日から、改めて兜の緒を締めてかかりたいと思います。

コメント