Advent of CodeをAlteryxでやってみる20日目

Advent of code

※過去記事はこちら。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を取るのがポイントです)。

解答ワークフローダウンロード

コメント

タイトルとURLをコピーしました