Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2024年12日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目。
Day 12「Garden Groups」
タイトルは「庭のグループ」。なんのこっちゃ・・・。
ストーリーとしては、植物を栽培する際に、植物の種類ごとに区画分けしたいとのことで、フェンスを設置したいようです。フェンスのコストを知る必要がありますが、フェンスのコストは面積と周囲の長さを掛け算したものになるようです。
例えば、以下のような入力があったとき、
AAAA
BBCD
BBCC
EEEC
以下のようにフェンスを立てることができます。
+-+-+-+-+
|A A A A|
+-+-+-+-+ +-+
|D|
+-+-+ +-+ +-+
|B B| |C|
+ + + +-+
|B B| |C C|
+-+-+ +-+ +
|C|
+-+-+-+ +-+
|E E E|
+-+-+-+
この例では、
A:4 x 10 = 40
B:4 x 8 = 32
C:4 x10 = 40
D:1 x 4 = 4
E:3 x 8 = 24
となり、合計140となります。
Part2では、コスト計算が変わります。なんとディスカウントが効くようで、今までは外周の長さでしたが、代わりに辺の数になるそうです。
・ネ
・
・タ
・
・バ
・
・レ
Part1,2を解いてみる
今回はかなり工夫が必要に思います。2ひねりくらいする問題です。
Part1でやっかいなのは、アルファベットが同じなのに、別の場所にあるものをどう識別するか、ということです。単純に面積の周囲の長さを調べるだけであれば、各ポイントの隣接のポイントを調べることで、算出することができます。面積はもちろんアルファベットの数です。塊のグループ化をどうするか、というのは「グループ作成」ツールが利用できます。それぞれのポイントに機能する隣接ポイントを作成し(つまり、4方向に隣接ポイントを作成し、結合できるもの=隣接するもの、のリストを作成します)、グループ作成ツールにかけるだけです。これで、以下のようなグループ化を行えます。
空間ツールを使うのであれば、結合し、ポリゴンを分割した後、ポイントを空間マッチすればできそうですね(今回は試していません)。
Part2は結局空間ツールのお世話になりました。ただ、空間ツールを使うまでには、ひと工夫これまた必要です。今回与えられているアルファベットはX、Y座標に配置できますが、点なのでこれをポリゴンにする必要があります。一旦X、Y座標にした後、斜め方向に4つのポイントを作成し、与えられたアルファベットを中心点とした四角形のポリゴンを作成しました。あとは、空間結合し、穴開きポリゴンがあるので一旦詳細な領域にポリゴン分割ツールで分割し、さらに点に分解します。ただ、この方法は無駄な点がたくさん残っているため、辺の数の特定が困難です。ここから複数行フォーミュラを使って、直線上のポイントを省くことで(緯度もしくは経度が三連続で同じなら直線上の点とみなして省く)、最終的に辺の数(ノードの数がわかればオッケーです)を算出できます。色々と細かいところで罠があるので、気をつける必要がありました。
ちなみに、与えられたアルファベットのマップは、以下のように可視化できます。
まとめ
- 久々に歯ごたえのある問題でした。Part2でかなりさまよいました。反復マクロ2個作るも不要に・・・。
- Part1は比較的まだわかりやすかったですが、Part2は悩みました。空間ツールで結合するだけで不要な点が取り除かれるかな?とやってみたらNGで悲しかったですね・・・。
- 意外とこういうグルーピングするときはグループ作成ツールが使えます。
- Private Leaderboardでは、Part1は7位、Part2は10位という結果でした。仕事で時間が取れない!!!
- 明日に持ち越しになりそうでしたが、寝る前にギリギリ解くことができました!
コメント