Advent of CodeをAlteryxでやってみる2023_18日目

Advent of code

※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方1日目2日目3日目4日目5日目6日目7日目8日目9日目10日目11日目12日目13日目14日目15日目16日目17日目

第拾捌話 「Lavaduct Lagoon」

タイトルは「溶岩橋潟」。なんかよくわかりません。

機械部品工場は動き出しましたが、大量の溶岩が必要になります。そのために地面を掘って溶岩をためる場所を確保するようです。

掘削機の計画表があります(パズル入力)。

R 6 (#70c710)
D 5 (#0dc571)
L 2 (#5713f0)
D 2 (#d2c081)
R 2 (#59c680)
D 2 (#411b91)
L 5 (#8ceee2)
U 2 (#caa173)
L 1 (#1b58a2)
U 2 (#caa171)
R 2 (#7807d2)
U 3 (#a77fa3)
L 2 (#015232)
U 2 (#7a21e3)

この指示に従って穴をほっていくようです。Rは東、Lは西、Uは北、Dは南に進みます。その隣は進む数です。その右のカラーコードは今回は使いません。上の指示に従うと、以下のようになります。

#######
#.....#
###...#
..#...#
..#...#
###.###
#...#..
##..###
.#....#
.######

掘ったところの内側も掘ります。これにより、62立方メートルの溶岩を貯めることができます。この掘った広さがPart1の答えとなります。

Part2は、愚かなエルフが上の計画表の指示の方法を間違えていたかということで、解釈が変わります。実はカラーコードと思われていたものは、16進数でした。一番右端の数値は0~4の値を取りますが、それぞれ方向を示します。0:R、1:D、2:L、3:Uです。残りの数値は、16進数の進む距離です。つまり、「#70c710」であれば、「R 461937」となります。

これによる貯めることのできる溶岩の広さがパズルの答えとなります。

・ネ

・タ

・バ

・レ

Part1,2を解いてみる

Part1は10日目の問題と似ています。前回は空間処理で無理やり算出しました。今回も同じ手を使っています。

まず、計画表(パズルのインプット)をルートに置き換えましょう。反復マクロを使っていますが、反復入力は開始地点のポイントにしています。

計画表は通常の入力とし、反復回数でフィルタをかけて順番に処理を行っていきます。今回は、計画表の長さが反復回数なのでそれほど反復する必要はありません。RecordIDとIterativeNumber+1でフィルタをかけて一つずつ処理を行います。

マクロはシンプルです。

これにより、以下のようなポイントデータが得られます。

ここからは、内部の点も数えないといけないので、その方法を知らないため空間的に処理を行います。

まず、このポイントデータを使って、ポリゴンを作ります。

端のポイントがマッチングをかけたときに抜けるところがあるので、バッファで少しだけ広げています。

あとは、、、xとyの最小値と最大値からなる長方形の全ポイントデータを作ります。

これで、ポリゴンデータとポイントデータをマッチングさせるとほしい答えが得られます。

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

Part2です。これ、まともにやるとデータ量が爆発して手がつけられません(結論として50兆個のポイントデータを取り扱うことになります)。

結論としては、数学的に解決するのが一番の近道です。座標法(英語だと、Shoelace formula)であれば非常に簡単です。ただし、これは面積を求める公式なので、このままでは使えません。これにさらに、以下の処理が必要です。

外周の長さ÷2+1

最終的には、「面積+外周の長さ÷2+1」で答えが出ます。

ただし、Part1のマクロではポイントデータが多すぎて計算できないので、展開せず曲がるポイントのみのデータに展開します。

これに持っていくまでのデータを作る必要があります。まず、入力データ(計画表)は、以下のようにします。

フォーミュラツールで作りますが、HexToNumber関数が使えます。

これを展開するマクロは以下のとおりです。

むしろPart1よりシンプルです。これにより以下のように展開されます。

このデータを使って公式に当てはめていきましょう。

下側が測量法です。

測量法の計算はめちゃくちゃ簡単で、以下のような式になります。

[Row-1:x]*[y]-[Row-1:y]*[x]

最終的には以下のようなワークフローになります。

まとめ

  • Part1は10日目にやった問題と近く、オアシス問題でした。
  • 一方、Part2はまたもやまともにやると爆発する問題でした。いかに展開せずにやるか、、、今年のAoCはこういう問題多い気がします。
  • 正直、公式(測量法)知らないと無理でした・・・。インターネットは役に立つ。
  • Private Leaderボードでは、Part1は2位、Part2は4位でした。最速の人でも4時間30分でした。

コメント

タイトルとURLをコピーしました