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

Advent of code

Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2024年20日目です。

※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方1日目2日目3日目4日目5日目6日目7日目8日目9日目10日目11日目12日目13日目14日目15日目16日目17日目18日目19日目

Day 20「Race Condition」

タイトルは、「レースコンディション」。

ストーリとしては、なぜかレースに参加させられることになったそうです(なんだこの強制イベントは、、、結構クソゲーぽいですね)。毎度おなじみのMAPが与えられます(Sがスタート、Eがゴール、「.」は通れる道、#は壁)。

###############
#...#...#.....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..E#...#...#
###.#######.###
#...###...#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############

レースなのに、移動は上下左右に動くと1ピコ秒かかる、ということで、さらには一本道なので競争にもなんにもならないのですが、チート(不正行為)を行えるようになったようです。2ピコ秒だけ壁を通過できるのですが、チート終了時は通常のルートに戻る必要があります。

Part1では、チートすることで節約できる時間を出力し、100ピコ秒節約できるチートがいくつあるかを探します。

Part2では、チートできる時間が20ピコ秒に延長されました。

・ネ

・タ

・バ

・レ

Part1、2を解いてみる

とにかく、スタートからゴールまでのルートを取得する必要があります。一本道なのでなんちゃらアルゴリズムは不要で、まぁ、単純な反復マクロです。

楽をしたくなってきたので、次のポイントを探す時のポイント作成マクロを作りました・・・。そして、なんと今回のマクロはこれだけです!あとは素のワークフローで勝負できます。

あとから気づいたのですが、Part2の考え方はPart1でも適用できます。

Part1では、できあがったルートに対して、隣接ポイントを作成し、さらにその直線の先のポイントを作成しました。これを歩行(?)ルートとがっちゃんこしました。これで、チートポイントが確定しますが、巻き戻るチートもでてきてしまうので、歩行ルートの経過秒数を比較して、がっちゃんこできたポイントがチート前のポイントよりあとのポイントだけ抽出しています。しかしこれでは壁を通過しているかどうかわからないため、元のルートの隣接ポイントが壁かどうか、さらに壁のデータとがっちゃんこして、できたところが最終的なチートポイントです。

これ、Part2ではPart1のアルゴリズムは使えないので、別のアルゴリズムになっています。

Part2では、各歩行ポイントに対してマンハッタン距離が20以内のルートがチートの候補ポイントとなります(20ステップ以内に元のルートに戻ってこないといけないため)。単純に歩行ルートをデカルト結合し、マンハッタン距離が20以内で、結合先が各ポイントより時系列的にあとのポイントを抽出します。あとは節約できる秒数ですが、時間の差分からさらにマンハッタン距離を引いたものです。

Part2の20を2にすれば、Part1にも適合します。

まとめ

  • チートをどうやって実現するかの発想がでないと非常に難しいですね
  • 発想さえ出れば実装は難しくない問題でした
  • 完全に後追いでやってるので、Private Leaderboardのことは忘れましょう。

コメント

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