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