もうクリスマスイブはとっくに終わり、大晦日になってしまった。しかし各種プログラミングパズルは勉強になる。 淡々とやっていくしかなかろう。

5 日目: Sunny with a Chance of Asteroids

サンタを乗せた宇宙船が火星に近づくに連れて、宇宙船内の気温は上がり続けているようだ。 そこで俺は、 Thermal Environment Supervision Terminal (TEST) 、つまり宇宙船内の温度管理システムをサポートするように、 宇宙船のコンピュータを改造する必要がある。

1 問目:コンピュータを実装できるなら、改造もできる。

TEST(温度管理システム) 用の診断プログラムは 2日目 で作った 「コンピュータ」から動かす。

なので、「コンピュータ」を改造しなければならない。

改造するポイントは2つある。

まず 2 つの制御コードを追加する。制御コード 34 だ。 それぞれ、ユーザ入力と出力をサポートさせる。 制御コード 3 は続く 1 つの数字を引数とする。これは、ユーザ入力を保存する先のアドレスを意味する。 制御コード 4 も同様に続く 1 つの数字を引数とし、指定されたアドレスの数値を出力する。

なので、例えば次のプログラム、 3,0,4,0,99 は、ユーザからの入力を受け付け、それを出力して終了する。

次に、パラメタモードをサポートさせる必要がある。

それぞれの制御コードのパラメタは、パラメターモードによってハンドルされる。 モードは 0, 1 の 2 種類あり、モード 0 は位置モードで実装済だ。 このモードでは、パラメタを位置情報としてコンピュータは処理をする。

今回追加するのはモード 1 で、これは即座モードとなる。 このモードでは、パラメタをそのままパラメタとして使う。

パラメタは制御コードと同じように保存される。 制御コードは2桁の整数で、1桁目と2桁目。つまり 1 の位と 10 の位で表される。 パラメタモードはパラメタごとの 1 桁ずつ、制御コードからみて右から左に読んで行く。 つまり、パラメタが 3 つあるオペコードの場合、最初のパラメタのモードは 100 の位に、 2 番目のパラメタのモードは 1000 の位に、最後のパラメタモードは 10000 の位に表される。 特に定義されていない場合は 0 とみなす。

つまり、例えば次のプログラム 1002,4,3,4,33 の場合、制御コードが 02 であり、 最初のパラメタのモードが 0 、2番目のパラメタのモードが 1 、そして 最後のパラメタのモードは、定義されていないので 0 扱いとなる。

制御コード 02 は乗算、最初のパラメタは位置モードなので 4 番目の数、つまり 33。 2 番目のパラメタは即時モードなので 3 自身。最後のパラメタは位置モードなので 4 番目の数に 乗算結果である 33 * 3 = 99 を保存し、プログラム自身は 1002,4,3,4,99 となる。

さて、TEST は最初の入力に、宇宙船の空調システムの ID を要求します。今回は、 1 です。