※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目、12日目、13日目、14日目、15日目、16日目、17日目、18日目、19日目、20日目
21日目です。改めてPart2が解けたので、トップの画像は解けた時点のものにしています。

タイトルは、「Monkey Math」。猿数学ですね・・・。
今回の問題は、方程式を解く問題です。
サンプルの入力データとしては、以下のようになっています。
root: pppw + sjmn
dbpl: 5
cczh: sllz + lgvd
zczc: 2
ptdq: humn - dvpt
dvpt: 3
lfqf: 4
humn: 5
ljgn: 2
sjmn: drzm * dbpl
sllz: 4
pppw: cczh / lfqf
lgvd: ljgn * ptdq
drzm: hmdt - zczc
hmdt: 32
ストーリー的には、各行はそれぞれの猿らしく、左のラベルは猿のラベルです。数字が書かれている猿はその数字を叫び、計算式の猿は計算式を叫ぶそうです。計算式になっている部分は、各ラベルの猿が数字を叫べば、計算結果を叫ぶそうです。
まぁ、方程式を解きましょう、ということです。
Part1はrootと書かれた猿の叫ぶ数字を当てる問題。
Part2は、少し条件が変わり、humnとラベルのついた猿はなんと自分自身のことで、このhumnとラベルのついた猿の叫ぶ数字を求める必要があります(今humnについている数字は偽物の数字とのこと)。また、rootの猿は+演算子になっていますが、実は=だったということになっています。
・ネ
・
・タ
・
・バ
・
・レ
解いてみる
Part1はとにかくがんばって結合もしくは検索置換ツールでひたすら数字に置き換えていく問題です。反復マクロが組めれば問題ないかと思います。メインのワークフローは非常にシンプルです。
Part1のワークフロー:

Replaceマクロ:
基本的に検索置換ツールを二段階でかましているだけです。つまり、方程式の右辺の部分に猿が2匹いるのでそれぞれに対して検索置換をしています。
マクロの半分は終了条件用(Ending Conditionと記載のある部分)です。反復マクロは繰り返し出力にデータが流れなくなると終わるため、終了条件をうまく設定し、反復をやめたいところで繰り返し出力にデータを流さないようなフィルタ条件をうまく設定してあげる必要があります。

さて、Part2です。条件が変わります。条件が変わったRootとhumnのレコードは一旦外してPart1で行ったReplaceマクロにかけていきます。これで、可能な限り猿に数字を与えることができます。
その後、rootについて2匹の猿は同じ番号ということがわかるので、Replaceマクロで得られた結果から同じ猿を探し、番号を特定します(基本的にどちらかの猿の答えが出るようになっているようです)。その後は、左辺側に値が入り、右辺側にある猿に対して一次方程式を解くことで猿の番号が次々に判明するようになっているので、それに対応したロジックを組んで完了しました。これがReverseマクロです。
Reverseマクロ:

もう少しシンプルなマクロにすることもできるのですが、IF文が少し深くなるのでやめました(3つくらいツール減らせます)。
Part2のワークフローは以下のような感じです。

最初、humnを含む一次方程式を作ってみたのですが、あまりにもカッコが大量について複雑な計算になり、分析することができなかったので一時放置していたのですが、ブログを書く際に改めて問題の解説などしているうちにやり方をひらめいた、ということです・・・。
まとめ
- 21日目は後半戦では比較的解きやすい問題だったように思います(自分はPart2でかなり引っかかりましたが)。
- Part1はすんなり行って、Part2がどうか、といったところでしょうか・・・。
- 個人タイム:数日かけて解きました。
コメント