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

Day 8「Playground」
タイトルは「遊び場」。
Day7で修理したテレポーターに勇敢にも入っていくのですが、今度は遊び場です。ここでは、エルフたちがクリスマスデコレーションを準備しているのですが、どうやら電飾のためのジャンクションボックスを接続する必要があるようです。2つのジャンクションボックスを接続するとそこで電気が流れるようになっています。
ここにジャンクションボックスの一覧が3D位置座標として提示されました。
162,817,812
57,618,57
906,360,560
592,479,940
352,342,300
466,668,158
542,29,236
431,825,988
739,650,466
52,470,668
216,146,977
819,987,18
117,168,530
805,96,715
346,949,466
970,615,88
941,993,340
862,61,35
984,92,344
425,690,689
左からx座標、y座標、z座標となっています。
費用の節約のため、最も近いジャンクションボックスを繋いでいく必要があります。上の20個のリストの中では、1個目(162,817,812)と20個目(425,690,689)が最も近いボックスです。これで、このペア(これを1回路とします)が1つと、残り18個のボックスが残ります。
次に近いもの同士は、1個目(162,817,812)と 8個目(431,825,988)ですが、1個目はすでに回路に組み込まれているので、8個目は1個目が属するのと同じ回路に接続します。基本的にはこれを繰り返していき、10個のリストを接続していくと、回路としては11個となり、5個のジャンクションボックスの組の回路が1つ、4個のジャンクションボックスの組の回路が1つ、2個のジャンクションボックスの組の回路が2つ、個別に存在しているボックスが7つとなります。最もボックスの数が多い回路3つ(5、4、2)の数を掛け算したものがPart1の答えですが、1000個のリストを接続した時の最もボックスの数が多い回路3つのボックスの数を掛け算したものが答えです。
Part2は、上の作業を繰り返すと、すべてのジャンクションボックスが回路に組み込まれる瞬間があり、その時の最後の2つのジャンクションボックスのx座標をかけあわしたものがPart2の答えです。
・ネ
・
・タ
・
・バ
・
・レ
Part1、2を解いてみる
今年(去年からかもしれませんが)は、二段階くらいの処理が必要になる問題が多いですね。まぁ、AIが段階分でやるのをあんまり得意としていないからかな、と思いますが・・・。
まずは、近いもの同士のリストを作成する必要があります(Step1)。これはフィールド付加ツールですべての組み合わせを作り、距離計算をすればオッケーです。距離は√(x1-x2)2+(y1-y2)2+(z1-z2)2で計算可能です。

これで以下のようなデータができます(距離はもう不要ですが・・・)。

ここからは反復マクロになります。
初期のグループは、上のリストの一番上のレコードです。ここから、以下のようなデータを作ります(このデータを反復入出力として反復マクロ内でぐるぐる回していきます)。

もう一方で、Step1で作ったリストをそのままぶっこみますが、このリストを2行目から1行ずつ上の初期グループのリストと比較し、いずれかが含まれていれば、friendsという項目に追加します。なければ新規グループとしてレコードを追加します。
つまり、今回の場合、新たにGroup2として131,137というレコードができるわけです。
これをずっと繰り返していき、1000個目のCombinationまで処理した時の一番ジャンクションボックスの多い組み合わせ(回路)のトップ3のボックス数を掛け算します。
マクロの外には以下のような答えが出てきます。

これをfriendsの中の項目が多い順番に並べ替えて頭3つのグループを取って掛け算すればオッケーです。
このワークフローの後半部分は以下のようになります。


Part2は、Part1の終了条件を変えればオッケーです。

終了条件は、組み合わせのレコード数が1かつジャンクションボックスのカウントが1000になったときです。この条件をPart1のマクロのおしりにくっつけています。
繰り返していくと、組み合わせのレコード数が徐々に減っていくのですが、残りの数個になってから結構回ってる感じですね・・・(Messageツールでカウントを出すようにしているとわかります)。
ワークフローの後半部分は以下のようになります。マクロには最後の組み合わせが出てくるので、縦持ちにしてから元のレコード番号を元に結合し、x座標を取得して掛け算します。

ワークフロー全体は以下のとおりです。

別解
グループ作成ツールが使える、というのを聞いて、作ってみました。

以下のマクロの繰り返し部分は単なるダミーです。単純に組み合わせリストから一つずつ増やしながらグループの数をカウントしています。あるグループの数が1000になったら止める、というアルゴリズムです。

まとめ
- 今日は明らかにリアルタイムにできませんでした。しょうがない。
- Step1の組み合わせリスト作るところまでは比較的すんなりいきましたが、それは問題文の理解を除いて、ですかね。とにかくサイトをそのままGoogle翻訳だと日本語がおかしすぎて、Google翻訳にコピペしないと無理でした。
- マクロは、、、結構試行錯誤しました。Excelの手計算と比べてデバッグ必要でした。やっぱExcel必要。
- 集計ツールのConcatenate Distinctが役に立ちました!この機能AMPオンリーなんですね。
- 本番データ独特の変なものはなかったので助かりました。


コメント