※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目、12日目、13日目、14日目、15日目、16日目、17日目、18日目、19日目
20日目です。トップの画像は12/30時点のものにしています。
タイトルは、「Grove Positioning System」。GPSもじりのタイトルでしょうか・・・。
今回の問題は、暗号化されたファイルを解く、という問題なのですが、実際は循環的なリスト内で数値を動かす問題です。
サンプルの入力データとしては、以下のようになっています。
1
2
-3
3
-2
0
4
この数字の場所は数字を移動する順番で、数字は移動する数です。縦にしているとわかりにくいので横にしてみます。
1 2 -3 3 -2 0 4
最初の1番目の場所にある1から動かしますが、右に一つ動かします。そうすると、
2 1 -3 3 -2 0 4
となります。次に、2番目にあった2を動かします。右に2つ動かします。
1 -3 2 3 -2 0 4
次は、3つ目にあった-3を左に3つ動かします。
1 2 3 -2 -3 0 4
これを一周やると
1 2 -3 4 0 3 -2
となります。この最後までやると1回のMixが終わった、ということになります。
その後、入力データのうち、0の場所を算出し、そこを起点として1000番目、2000番目、3000番目の場所にあるデータの値の合計を取得します(これらももちろん循環的なリスト内での位置となります)。
Part2は、この元のリストに復号化キーを掛け算します(811589153といった巨大な値でした)。そして、10回Mixします。求めるものはPart1と同じです。
・ネ
・
・タ
・
・バ
・
・レ
解いてみる
循環ということなので、MOD計算がメインの問題です。ただ、直感的には非常にわかりにくいです・・・。テストデータで通るように作り込んでも、テストデータは本番データのすべてのパターンが網羅できているわけではないので、本番がうまくいかない、と非常に時間がかかりました。
ちなみに、AlteryxのMOD関数はマイナスのMODを取るときにマイナスになってしまうため(他の言語も同様のものが多いようです)、そのままMODの結果を新しい場所として使うことができません。マイナスのMODを取る時は、MODの結果にMODを取っている数をプラスする必要があります。つまり、動かすデータの場所は以下のようにして決まります。
動かす数がプラスなら:MOD(元の場所+入力データ,入力データ全体の数-1)
動かす数がマイナスなら:MOD(元の場所+入力データ,入力データ全体の数-1)+入力データ全体の数-1
Part1のワークフロー:
Mixマクロ:
Part2は、Part1のロジックさえしっかりできていれば単に10回Mixするだけの問題です。
Mixマクロを10回回すマクロからMixマクロを呼び出すようにしています。
ここのマクロはPart1のマクロと同じものです。
まとめ
- 20日目はロジックが大事な問題です。ロジックができないとさっぱりです。
- クリアされている方も結構少なめです。ただ、ロジックができるかできないか、だけの問題です(データ量とかは少ないです)。
- 個人タイム:数日かけて解きました。ロジックの部分はヒントないと厳しかったです・・・(入力データの数から1引いた数でMODを取るのがポイントです)。
コメント