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

Advent of code

※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方1日目2日目

第三話 「Gear Ratios」

タイトルは、「ギア比」。

ストーリーとしては、よくわからないですが、いつの間にかゴンドラ乗り場についたのですが、そのゴンドラが動いていないということで、このゴンドラを直すためにエンジンの回路図(これが今回のインプットです)の部品番号を特定する必要がある、とのことです。

サンプルのインプットはこちら。

467..114..
...*......
..35..633.
......#...
617*......
.....+.58.
..592.....
......755.
...$.*....
.664.598..

Part1では、この部品番号を特定するために、ドット以外の記号(*とか#とか数値以外の記号です)の周りにある数字が部品番号となっています。つまり、隣接した記号がない58、755は部品番号ではないとのことです。

最終的には、見つかった部品番号をすべて合計したものが解答となります。

Part2では、エンジンのギアが一つ間違っていた、とのことで、エンジンの回路図の「*」がギアを示しており、このギアの周りにある部品番号2つを乗算したものがギア比とのことです。最終的にはすべてのギアのギア比を合計すると最終的な解答となります。

上の例では、*の周りにある部品番号は、「467」と「35」、「617」、「755」と「598」です。617は一つしか無いのでギアではないとのことで無視します。

・ネ

・タ

・バ

・レ

Part1、2を解いてみる

このようなMAP系の問題は、x座標、y座標を意識して解いていく必要があります。また、可視化するのも一つの手段です。今回はそれほど難易度が高いわけではなかったので、特に可視化はしていません。

基本的には、正規表現ツールと、レコードIDツール/複数行フォーミュラ/タイルツールなどを用いて、x、y座標に分解していきましょう。以下のようなワークフローになります。

この時点では、このようなデータになります。AoCではこの形を何度も見ることになります・・・。

※よくよく見たら、xとyが逆ですね・・・。縦軸がx、横軸がyになっちゃってますが、気にしないでください・・・。

今回の問題の難しいところは、一つの数字の塊が、複数の位置情報を持っていることでしょうか。例えば、上のサンプル入力の場合、左上に467という数値がありますが、これは場所情報として、1-1、1-2、1-3と3つの場所情報が必要となります(昨年まではこのようなケースはなかったように思います)。

また、連続した数値は一つの塊になるので、これは複数行フォーミュラを使いました。これにより、以下のような数値リストを作ります。

一方で、隣接ポイントリストを作る必要があります。これには、元のポイントの上下左右斜めを以下のような設定の行生成ツールで作ります(x、y両方とも作ります)。

この隣接リストに対しては様々な条件でフィルタをかけていきます。値が記号のもののみを残し(今回は時間短縮のためどんな記号があるか特に調査せず進めたので、「.」ではなく、かつ、数字ではない、という形にしています)。以下のようなフィルタです。

REGEX_Match([Right_Input], "[0-9]") OR [Right_Input]="."

一方で、この隣接リストには隣接元の値も入っているので、隣接元が数値のみのものに絞っています。

REGEX_Match([Input], "[0-9]")

最後に、位置情報を付け加えて隣接リストは完成です。

この隣接リストと数値リストを結合すれば、あとはもうすぐゴールです。ユニークツールで数値の塊でユニークなものとし、数値を合計するとPart1は完了です。

Part2は、隣接リストでギアのみ残すので、「*」を残してフィルタします。あとは、Part1と同じで、「*」のみの隣接リストと数値リストを結合し、ユニークをとって、各数値の乗算(新機能の集計ツールのProductが役に立ちました)を取りながらカウントをとっておき、カウントが2のみのものを残して数値の合計を取ればPart2も完了です。

今回はうまく隣接リストを作れたので、Part1のアプローチからすぐにPart2のアプローチに移れました。AoCはPart1でやっていたことがうまくPart2にもハマるとかなり効率的に解決することが可能です(とはいえ、Part2はPart1を解かないとどんな問題なのかわからないので、Part1をやっているときに本当にこのアプローチで良いのか、と疑心暗鬼になったりします)。場合によっては、Part2はがらっと作り直す必要があることもあります。

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

まとめ

  • Day3でMAP問題は早くないですかね?(難易度爆上がりです)
  • MAP問題で一つのアイテムに対して複数のポイント情報を扱わなければならない問題はAoCでは初でしょうか?
  • Part1には時間がかかりましたが、Part2にそのまま適用できたので、非常に気持ちよかったです。Part2だけなら4分とトップ記録となりました。あわせて24分とまずまずの出来でしょうか(とはいえ、Day3のみでは3位)。Private Leaderboard総合でも3位です(今年は順調)。

コメント

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