Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2024年15日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目、12日目、13日目、14日目。
未解決問題です。
なんとかクリアしました。今年一番苦労したかも・・・(22日までで)。
Day 15「Warehouse Woes」
タイトルは「倉庫の苦悩」。ほんと悩みました・・・。
ストーリーとしては、2021年6日目に出てきたランタンフィッシュの持っている倉庫の中のロボットが暴走しており、それを止めるためにロボットの動きを予測したいようです。
入力は、以下のようなものです。
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
<^^>>>vv<v>>v<<
下にある「><^v」は、ロボットの移動方向で、@はロボットの位置、Oは荷物です。#は壁です。
さて、ロボットは荷物を押すことができますが、壁で止まります。まぁ、いわゆる倉庫番ですね。
移動方向を順番に進めた時の荷物の位置を特定し、Y座標×100+X座標の合計を求めればオッケーです。
Part2は、幅が倍になります。つまり荷物が「[]」と倍の大きさになっています。
################
##....[]..[]..##
####@...[]....##
##......[]....##
##..##..[]....##
##......[]....##
##............##
################
未解決なので、一旦ここで終了します。Part1が解けましたが、Part2がやばめです・・・。
・ネ
・
・タ
・
・バ
・
・レ
Part1を解いてみる
いわゆる「倉庫番」というゲームと同じような感じですが、素直に一歩ずつ動かしています。ただ、動かせるかどうかの判定は、複数行フォーミュラで一気に行もしくは列ごとにやっています。正規表現でうまくやることもできるらしいのですが、後々Part2では横方向については手直しなしでいけたので良しとしましょう。主人公が消失したり、壁を突き抜けたり、荷物を破壊したり、なかなかアルゴリズムが決まりませんでした(かなり時間がかかった)。
Part2を解いてみる
Part2はもうこれテトリスですね。
横方向はPart1そのままですが、縦方向が半歩ズレて(荷物が倍のサイズなので、荷物的に見て半歩)動いたりするのがやっかいです。ですので縦方向のみアルゴリズムを大幅に考え直す必要があります。また、各荷物にはBoxIDというIDをふっています。これがないと無理・・・。
シンプルに考える(?)ために、例えば、上に押した時に「]」があると、隣の列も見る必要があります。これを実装し、動かした時に見るべき列を引っこ抜くマクロを作っています。この時、「]」より下側は見る必要がないので、捨てています。これでまず、検査する必要のあるブロックを特定しました。
次に、押せるかどうかの判定は、基本的にPart1のアルゴリズムをベースにしようとしたのですが、なんかうまくいきませんでした。横方向はPart1そのままですが、縦方向をがっつり変えています。
縦方向を動かす際は、現在地点から押そうとしている荷物から連なる荷物をX軸まるっと持ってきています。このために反復マクロを作成しました。
イメージ的には、以下のようにデータを拾ってきます。
次に、これらのデータに対して押せるか押せないか、どれを押せるかを判定します。Part1ベースのものから空間ツールベースの処理に切り替えたのですが、隣り合っているとくっついて動いてしまうので、結局そのままでは使えず、どのブロック(いや、荷物ですね)がセットで動くか、というところの考慮がちゃんとできておらず、このバグが全然取れませんでした。結局、以下のようなパターンが発生しているのに気が付かず、なかなか苦労しました。
色が濃い部分も一緒に動くべきなのですが、X軸方向の押し判定が一回しかしていないので、このようなパターンの考慮が漏れてしまっていました。そのために、ブロックのグループ化を反復マクロで繰り返し行うようにしています。
最終的なPart2のマクロは以下のようになっています。
今年一の大作ですね!
全体としては以下のようなワークフローになっています。
まとめ
- 15日のものが、22日にようやくクリアです。
- ほんとこういう系のデバッグは結構きついですね・・・。
- 結局毎年テトリスみたいなことやってます・・・。
- Part2は25分程度かかります(デバッグ用に各施行のデータを保存しているのもありますが・・・)。Part1も7分と早くはありません。
コメント