Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2024年17日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目、10日目、11日目、12日目、13日目、14日目、15日目、16日目。
途中とばしているのと、順番ぐちゃぐちゃになってきたので、いかにも後半戦って感じですね・・・(14日目以降がボロボロです)。
Day 17「Chronospatial Computer」
タイトルは「時間空間コンピュータ」。
ストーリー的には、小さなハンドヘルドデバイスが3ビットコンピューターに変わったとのことです。インプットデータは以下のようになっていますが、このコンピューターはA、B、Cという3つのレジスタを持っていて、数値の羅列が命令となり、動作します。
Register A: 729
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0
Programという部分が実際の命令文で、2文字が1セットです。1文字目がOpecodeと呼ばれる命令、2文字目がOperandと呼ばれるパラメータです。
命令文は、0~7の数字で、それぞれの処理内容が定められています。その処理により、上記インプットを入れれば動作するようなロジックを作る必要があります。命令文の5がデータを出力するものとなっていて、このプログラムが終了した時に出力される数字のカンマ区切りのものがパズルの答えです。
Part2は、出力される数字がプログラムの数字と同じになるように、レジスタAの値を求める、というものです。
・ネ
・
・タ
・
・バ
・
・レ
Part1,2を解いてみる
Part1は、問題文通りひたすらロジックを組むだけです。が、なかなかこれわかりにくいですね・・・。実際のところ、組めばわかりますが最後の手前にJump文が入っていて、レジスタAの値が0になるまで最初に戻る、というものになっています。自分がまとめたものは以下のとおりです。
レジスタAは、プログラムの計算により徐々に減っていくようになっています。つまり、以下のような感じになります。
やたら問題文は複雑でしたが、マクロの中身は意外とシンプルです。
工夫した点としては、プログラムによって出力先が異なるので、一旦「A:xxxx」みたいな形で出しておいて、複数フィールドフォーミュラを使って該当するフィールド名に対して値を更新する、という方法を取っています。これだと結構計算式がスッキリします。
Part2は、いくつかレジスタAの値を変えてみて動きを確認する必要があります。パターンが見えてきたら、一桁ずつ正解になるまでレジスタAの値を求めていきます。基本的に8進数の3bitごとに求めていけばよいです。雰囲気を掴むには、プログラムのステップごとにレジスタの値などの動きを出力してみるのが良いです。
以下のような雰囲気のものを見ることができると思います。
Part2側は、複雑になっています。一番上側のマクロは反復マクロで、すべての桁に対してマッチングを行うようにしています。
その中身にはバッチマクロが入っており、プログラムと該当する桁が一致するかどうか、Aレジスタの値のすべてのパターン(8パターン)を試します。中身はPart1のマクロが入っており、結果をそのまま出力させています。
正直こんなの組まずに、一つずつおっかけた方が楽でしたね・・・。
ワークフローは以下の通りとなります。
まとめ
- Part1は注意深く作ればそれほどむつかしいことはないですが、問題文の意味が読み取りづらいので、書いてることと答えがしっかりあうのかどうか、確認しながらやらないと危ないかもしれないです
- Part2は、Aレジスタが大きい方の値から順にプログラムと答えがあうかどうか、を行っています。1桁ずつ見るとうまくいかないので、1桁マッチングさせたら、そのAレジスタの値にさらに次の桁を足していくとうまくいきます。10進数だと桁ごとにやればいいのでしょうが、8進数なので10進数で考えるとズレます・・・。
- Part1は当日できましたが、Part2は間に合わず後日・・・。
コメント