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

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日目

解けました!(2023/12/24)

第弐拾壱話「Step Counter」

タイトルは「ステップカウンター」。

ストーリーとしては、前回飛行船を捕まえることができ、庭師の農場に到着しました。エルフが歩数を増やしたいとのことで協力を求めてきています。

以下のような地図があります。「#」は岩、「.」は空間、「S」がスタート地点です。

...........
.....###.#.
.###.##..#.
..#.#...#..
....#.#....
.##..S####.
.##..#...#.
.......##..
.##.#.####.
.##..##.##.
...........

エルフはSから開始しますが、まず1歩目を歩きます基本的に上下左右に動きますが、岩(#)があるとそちらにはいけません。到達可能なところに丸をつけてみましょう。

...........
.....###.#.
.###.##..#.
..#.#...#..
....#O#....
.##.OS####.
.##..#...#.
.......##..
.##.#.####.
.##..##.##.
...........

次は二歩目です。前回丸がついたところから一歩動きます。すべての丸がついているところから動くと仮定します。

...........
.....###.#.
.###.##..#.
..#.#O..#..
....#.#....
.##O.O####.
.##.O#...#.
.......##..
.##.#.####.
.##..##.##.
...........

これを繰り返し、64歩では丸の数がいくつになるか、がPart1のクイズの答えです。

Part2では、地図が無限に広がります。Part1で使った地図の境界を超えて外に行こうとすると、同じマップが現れます(ゼルダの伝説みたいな感じですね)。26501365歩後の丸の数をカウントします。

・ネ

・タ

・バ

・レ

Part1,2を解いてみる

こちらも未解決事件です。Part1は解きましたが、Part2が解けていません。正確に言うと、最終的には手計算で解けそうですがBaseAの意義に反するので一旦Pendingにしています。

Part1自体はオアシス問題です。以下のようなマクロでさくっと解けます(20分以内に解けました)。

現在地点(◯のついている位置情報)を持っておき、単純に上下左右のポイントを作り、MAPと結合した上で#でなければそのまま繰り返す形になります。

ワークフローは以下のような形です。

Part2は、MAPが無限に続くため、MapNoを示すフィールドを追加しています。これは、x方向、y方向2つのMapNoというフィールドを追加し、境界を超えるときにこのMapNoを±1しています。その際、右側に行けば、地図の左側に出てくるようにx,y座標に変換をかけます。これで基本的にはマクロとしては完成します。実質Part1のマクロにフォーミュラツールを一つ追加したくらいです。

ただ、これを単に反復しても、時間がかかりすぎます(そもそもDesignerで設定できないくらいの回数を回す必要があります)。そのため、これをもとに分析を行い、パターン解析を行う必要があります。

追記(2023/12/25):完全ネタバレです

結論としては二次関数を解きました。なぜ二次関数を解くのか、は、おいといて、まず、MAPのサイズは131×131の正方形です。初期のマップは真ん中から始まるので、65歩でMAPの端に到達します。その後、一歩ずつMAPが広がりますが、131歩ごとに各無限MAPの端に到達します。ですので、基本的に131歩ごとのパターンになっています。また、ラストは26501300歩ですが、65を引いて131で割ると割りきれてちょうど202300回このパターンを繰り返している、ということになります。131歩ごとに何が起きているのか、ですが、二次関数で増えています。

つまり、x、yの関係は(65、3726)、(196、33086)、(327、91672)となっています。yの値は◯の場所の数で、マクロを回すことで得られます(今回は330回くらい回してます。これ結構時間かかるんですよね)。ところで、このまま二次関数にしてもうまくいきません。65=>0、196=>1、327=>2と置き換えてax2+by+c=0の方程式を解きましょう(手で式を展開するので結構面倒です・・・a=、b=の式を作るのはそれほど難しくはないですが・・・)。2次方程式部分のワークフローは以下のとおりです。

全体は以下のとおりです。

まとめ

  • Part1は素直な問題です。Part2は、とりあえず無限MAPを攻略するワークフローの作成は必須ですが、そこからある程度まで回してパターンを解析する必要がある問題です。どこまで回すか悩ましいところですが、正直最初はわからないですよね・・・。
  • Part2、、、正直こんなのまともにやったらわからないです。Redditのヒントは偉大です。それでもDesignerで二次関数がどうしても解けなくて非常に困りました。オチとしては、xを65、196、327とそのままの値を入れるのではなく、131歩ごとという意味合いで、それぞれ0、1、2としないとだめだった、というところです。
  • Private Leaderボードで、Part1は2位(19分)、Part2は6位でした。まだPart1はリアルタイムでついていけていた感じでしょうか。これもPart2が解けている人が少ない問題です。

コメント

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