Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2024年14日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目、12日目、13日目。
Day 14「Restroom Redoubt」
タイトルは「トイレの要塞」。
ストーリーとしては、歴史家がトイレに行きたがっていますが、警備ロボットでいっぱいのようです。そこで、ロボットの場所を予測することにしました。
今回は以下のようなアウトプットが与えられます。
p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3
pは最初の位置、vは速度(1秒間に進む距離)です。それぞれ左側がx座標、右側がy座標側です。また、このフィールドの広さは、横が11、縦が7で、それぞれつながっています。つまり、x軸の場所10のところから右へ1進むと、左側のx座標が0のところに移動します。
上のインプット例は、以下のような初期位置となります。数値はそこにあるロボットの数です。
1.12.......
...........
...........
......11.11
1.1........
.........1.
.......1...
これを使って100秒後の場所を出します。
......2..1.
...........
1..........
.11........
.....1.....
...12......
.1....1....
ここで最終的な答えに至るためには、上の結果を4つの象限に分割し、それぞれの象限に存在するロボットの数を取得し、すべてをかけ合わせる必要があります。なお、真ん中の行と列にあるロボットは無視します。
..... 2..1.
..... .....
1.... .....
..... .....
...12 .....
.1... 1....
上の例だと、左上は1、右上は3、左下は4、右下は1です。
最終的にはパズルの入力を使い解く必要がありますが、この時101 x 103のサイズの中を移動します。
Part2は、ロボットの配置がちょうどクリスマスツリーのようになるための秒数を求めます(これはイースターエッグらしいです)。
・ネ
・
・タ
・
・バ
・
・レ
Part1を解いてみる
いわゆるスクロールする系はちょっとやっかいですが、基本的にMOD計算で位置を特定することができます。ただ、MOD計算する時に、マイナス方向に進む場合は要注意です。
今回は、経過時間分のレコードを行生成ツールで作成し、それぞれ複数行フォーミュラで計算しました。この場合、最後の行が最後のポジションです。
Part1はマイナスのMODだけちゃんと計算できればあまり問題ありません。
Part2を解いてみる
Part2は、検討もつかないかと思いますが、いくつかの方法があるようです。私はイースターエッグに着目した方法で解いていますが、数百パターンを出力してみて、直線のパターンに着目し、ある程度検討をつけて目視で探す、とか方程式で解ける、などの方法があるようです。
目視+パターン作成法
目視で確認すると、最初は28秒後にほかとは異なるそれっぽいパターンが出てきます。
以下は初期状態。
28秒後の状態。直線的なものが出てきています。
次は86秒。
これを500まで見ていくと以下のようなことがわかります。
SecCountが時間ですが、これだけ見てもわからないので、パターン出現間の差分を取ったのがDiff列です。さらにDiffをそれぞれ足すと規則的に101と103が出てきます。もう一度Diffをよく見ると、偶数レコードは58、60、62、64と2ずつ増えています。一方で、奇数レコードは、43、41、39、37と2ずつ減っています。ということは、パターンが現れる秒数を逆算できそうです。
最初に出てくるパターンをパターンAとし、もう一つをBとすると、それぞれAとBが出てくる間隔は
A:56+2n
B:45-2n
という式になります。つまり、実際の値は以下のとおりです。
A=>B=>A=>Bという風にこの時間を初期値28に対して足していくと、以下のような表になります。
101×103=10403秒でパターンが一周するので、10403秒以内のこれで作られる表の経過時間のどこかに答えがある、ということになります。これを使えば、だいたい200枚の可視化を行うことで発見が可能です。
結論としては、
という絵が発見できれば完了です。
分散/標準偏差法
このように特異的な現象は、多くのポイントが集まっている、ということになります。つまり分散や標準偏差が小さくなる、ということになります。各施行(秒数)のX軸とY軸の分散をそれぞれとり、合計すると、確かに該当の秒数は一番小さくなります。
パターン見つけるやり方でもみたことのある秒数がちゃんと出てますね!
イースターエッグ法
・ネ
・
・タ
・
・バ
・
・レ
イースターエッグとして、ロボットがまったく重ならない瞬間があり、これが答えの秒数です。
最終的なワークフローは以下のとおりです。Part2は、一番ロボットの位置がユニークだった系?とか思ってカウントして一番多いものを選びましたが、ちゃんと500でした。
下側の方は、パターンマッチング法用のワークフローです。
まとめ
- 久しぶりにMODやったらマイナスMODの扱いに悩んで時間を浪費しました。たまにしかやらないと忘れます・・・。
- イースターエッグは、、、まぁ、イースターエッグなので見つけたもの勝ちですかね・・・
- みなさんがマッチング法などでやってたので、やってみました。過去に似たようなのやってるのでなんとなくすんなりパターンが掴めました。でもこれ、、、答え知ってたから結構すんなりでしたが、知らない状態だと半信半疑でやらないといけないので結構辛いですよね。
- 結局、今回のような問題は、分散/標準偏差が一番良いのでは?という結論でしょうか・・・。
- Private Leaderboardでは、Part1は時間かけすぎて4位、Part2は2位となりました。
コメント