※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目。
第九話 「Mirage Maintenance」
タイトル「蜃気楼のメンテナンス」。
ストーリーとしては、幽霊の地図を超えて、オアシスに到着したようです。見上げると、上空に金属でできた浮島が浮いています。
ところで、オアシスは不安定なようで、分析をする必要があるようです。その変化のデータは以下のようなインプットデータとなっています。
0 3 6 9 12 15
1 3 6 10 15 21
10 13 16 21 30 45
各行は、多くの値とそれがどんなふうに変化しているかという履歴となっています。オアシスを保護するために、値の予測をする必要があります。つまり、上のデータの各行の予測値を求める必要があります。予測値は、以下のように求めることができます。
最初のレポートは、「0 3 6 9 12 15」となっています。これは各ステップで3ずつ足されています。つまり差分を取ると「3 3 3 3 3」となります。次のステップでは、「0 0 0 0」となります。整理すると以下のとおりです。
0 3 6 9 12 15
3 3 3 3 3
0 0 0 0
予測値は、
0 3 6 9 12 15 B
3 3 3 3 3 A
0 0 0 0 0
一番右下に0を加えて、A、Bと予測していきます。
Aは、3+0で3となります。Bは、3+15で18となります。
2つ目のレポートは同様に、28、3つ目は68となります。これらを足すと、144が得られます。これがパズルの結果です。
Part2は、この逆で、左側の予測値を求めます。3つ目のレポートは、以下のとおりです。
5 10 13 16 21 30 45
5 3 3 5 9 15
-2 0 2 4 6
2 2 2 2
0 0 0
答えは5。レポート1は-3、レポート2は、0。これらを合計すると、2となります。
・ネ
・
・タ
・
・バ
・
・レ
Part1,2を解いてみる
基本的には今回も反復マクロとなります。差分を取った結果に対してまた差分を取っていく、という反復マクロを使っていきます。反復条件は、すべての差分がゼロになった場合、もしくはCountDistincsが1になった場合でも反復完了になります。
基本的には全部のデータを縦持ちにします。
最終的に欲しいものは、以下の赤い部分の合計です。
10 13 16 21 30 45 A
3 3 5 9 15
0 2 4 6
2 2 2
0 0
これ、それぞれの行にて、隣接行のInput同士のDifをそれぞれ取り、、、以下の赤い部分を各ループで取得しておけば、、、あとで合計すればほぼ答えになります(最後、Inputの一番最後の数字も足し込む必要があります)。
マクロとしては以下の通りの反復マクロです。A Outputが赤い部分を抽出するための部分です。
ループ脱出条件は、DifのNonNullでの重複カウントが1のときとしています。
Part2は、インプットの順番を逆転させればほかは何も変える必要はありません。
まとめ
- 初期の段階では、本当に必要なものがよくわからずなんとなく作っていたので、冗長なワークフローになっていました。
- Part1はPrivate Leaderボードで3位(36分)でしたが、Part2で時間を取られ、最終順位は9位(デバッグもいくつか手間取りました)。全体で1時間21分です。Part1がしっかり理解できていて、逆にすればオッケー的な発想があればPart2は5分かからずできるものだっただけに、ちょっと残念です。
- Private Leaderボード全体では、最速の人は37分で解いています。自分がPart1解く間にPart2までほぼ終わっているとは驚異的です。
コメント