※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目。
2日目です。
第二話 「Cube Conundrum」
タイトルは、「キューブの難問」。別に難問じゃなかった気がしますけど。
ストーリーとしては、前回空に大砲で打ち上げられたということになっていて、到着した場所でゲームをしましょうということになっています。
そのゲームの内容としては、袋の中にいくつかのキューブがあります。それぞれ赤、青、緑の色になっています。それを袋の中からランダムにキューブを掴んで出し、また戻すというのを何回か繰り返す、というものになっています(全然ゲームじゃないじゃん)。
その記録が今回の入力です。例えばサンプルは以下の通り。
Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
各ゲーム内の各試行は、セミコロン「;」で区切られています。
さて、今回redが12個、greenが13個、blueは14個しかないということで、この結果のうちGame3とGame4の結果は成り立ちません(総数を超えていることがあるので)。例えば、Game3では20個のredとありますが、redは12個しかありません。
入力データに対して、成立するゲームのIDの合計を取るのが、今回のPart1です。
Part2は、各ゲームで必要だった最小のキューブの数をそれぞれred、green、blueでカウントし、カウントした3つの数字を掛け算したものをすべて合計する、という問題です。Part1で使っていた各キュー部の総数は今回は関係ありません。
・ネ
・
・タ
・
・バ
・
・レ
Par1,2を解いてみる
基本的にはパースを工夫する必要があります。ゲーム内の試行回数も決まりがありませんし、red、green、redの位置もバラバラです。すべてを動的にする必要があります(そういう意味では動的なワークフローを構築する非常に良い問題ですね)。
今回は、パース後にそれぞれのキューブの色でフィールドを作ってそこにはめたかったので、正規表現ツールで以下のような表現を行いました(各試行は別々の行にしておく必要があります)。つまり、各色の単語の前に空白があり、その前の数値を取ってくるということです。
あとは、各ゲームの各試行で一度でもできないものがあるとそのゲームはNGとなるので、結合ツールをフィルタ代わりに使い、NGのゲームのみを取り除いて最終的な解答を出していきました。
Part2は、Part1よりむしろシンプルでしょうか。集計ツールのMaxで各ゲームの最大のキューブ数をそれぞれ取って計算するだけです。
初期に作成したワークフローは以下のとおりです。
なお、上記のように正規表現を使わず、列分割で頑張る方法もあります。こちらの方法はクロスタブが効果的に使えます。
なお、最初のやり方を整理すると、以下のようなツール数で解けます。さすがに最初からこれをやるには頭が相当整理されていないと難しいかと思います(初期のワークフローはとにかく解くために速度に特化して作っているので、構築に時間がかかりそうな計算式などは極力使わないようにしています)。
やはり、時間に追われると若干判断が狂いますね・・・。列分割だと結構手数が増えそうなイメージがあったのですが、実際に作ってみるとそうでもありませんでした。
まとめ
- むしろ、1日目より簡単でした。特にPart2はさくっとできたかと思います。
- 行生成と複数行フォーミュラがないのでDesigner Cloudでもできました。
- 最速の方で10分くらいでできている問題です。問題の意図を汲み取るのに若干時間がかかる問題だったかと思います。私も15分で解いています(4位)。
コメント