もうクリスマスイブはとっくに終わり、大晦日になってしまった。しかし各種プログラミングパズルは勉強になる。 淡々とやっていくしかなかろう。
5 日目: Sunny with a Chance of Asteroids
サンタを乗せた宇宙船が火星に近づくに連れて、宇宙船内の気温は上がり続けているようだ。 そこで俺は、 Thermal Environment Supervision Terminal (TEST) 、つまり宇宙船内の温度管理システムをサポートするように、 宇宙船のコンピュータを改造する必要がある。
1 問目:コンピュータを実装できるなら、改造もできる。
TEST(温度管理システム) 用の診断プログラムは 2日目 で作った 「コンピュータ」から動かす。
なので、「コンピュータ」を改造しなければならない。
改造するポイントは2つある。
まず 2 つの制御コードを追加する。制御コード 3 と 4 だ。
それぞれ、ユーザ入力と出力をサポートさせる。
制御コード 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 です。