Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2024年3日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目。
Day 03「Mull It Over」
タイトルは「じっくり考える」。
ストーリーとしては、コンピューターが壊れていてメモリがおかしくなっているとのことで、データがおかしくなっているとのことです。ただ、やりたいことは単なる掛け算とのことです。掛け算を行う命令式は「mul(x,y)」という形式になっています。
データは例えば以下のような感じです。
xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))
この中で「mul(2,4)」「mul(5,5)」「mul(11,8)」「mul(8,5)」のみが計算できます。「mul[3,7]」はカギカッコなので対象外です。
Part1ではそれぞれのmul命令を抽出し、掛け算したものを合計します。
Part2ではさらに追加の命令があり、「do()」「don’t()」が追加されています。これらの命令のあと、doの場合は計算を行う、don’tの場合は計算を行わない、ということです。最終的な結果の出し方はPart1と同じです。Part2のサンプルは以下のような形です。
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
・ネ
・
・タ
・
・バ
・
・レ
Part1,2を解いてみる
Part1は単純な正規表現の問題です。
mul\((\d+,\d+)\)
でトークン化するだけです。
問題はPart2です。途中どうやるかかなり悩んで時間を食いました。結論としては、do()で分割することで、行頭からdon’t()が見つかるまでのデータに対してPart1と同じことをすればできる、という考え方でやりました。ここで、do()で分割するのを正規表現でやるのを思いつかなかったので、do()をパイプに変換して列分割ツールで行に分割しています。あとは、それぞれの行に対して、don’t()が来るまでのデータを取得する形にしています。
初期ワークフローは以下のとおりです。
少し最適化したものは以下のとおりです。
列分割とセレクトツールを正規表現ツールでひとまとめにしています。また、Part2では、検索置換をやめてフォーミュラツール一本に絞っています。これで16ツールから14ツールに短縮しています。
まとめ
- 正規表現、ちょっと複雑になるとだめですね・・・。もう少し勉強が必要です、、、が、まぁ、今回の内容くらいならありかな、とは思います。
- Part2で、正規表現に「?」を入れ忘れていて、最短検索になっておらずに「あれ?あれ?」ってなってました・・・。普段は意識して「?」いれるのに、なんということでしょう・・・。ぽかミスが続きます。
- Private Leaderboardで、Part1は2位!だったのに、Part2は11位でした。なんかPart1,2ともにすっきり解決できないですね・・・。
コメント