過小評価されているスチームパンク小説The Difference Engineでは、映画館に相当するものが、機械的に反転できるタイルで表示されるピクセル化された動画を配信しました。これらのタイルの動きを調整するための制御エンジンは、パンチされたカードのデッキによって制御される大きなノイズの多いマシンでした。
あなたの仕事は、そのようなエンジンをエミュレートし、入力ファイルで指定されたピクセル化されたアニメーションを表示することです。入力は固定幅形式の行で構成されますが、行末を示すのに便利なものは何でも想定できます。形式は次のとおりです。
SSSSYYxxXXOA
SSSS: 4 digit sequence no. may be padded by blanks or all blank
YY: the y coordinate affected by this line (descending, top is 0, bottom is m-1)
xx: the starting x coordinate
XX: the ending x coordinate
O: hexadecimal opcode
A: argument (0 or 1)
入力は明示的に順序付けされます(カードデッキを床に落とした場合は、この部分に感謝します)。つまり、プログラムは、ソートフィールドとしてシーケンスフィールドを使用して、入力行の安定したソートを実行する必要があります。同じシーケンス番号を持つ行は、元の相対的な順序を維持する必要があります。(実際の行番号をキーに追加すると、不安定なソートで動作するはずです。)空白のシーケンスフィールドは、任意の数値よりも低いと解釈される必要があります(ascii照合シーケンス)。
単一のステートメント行は単一のy座標にのみ影響を与えますが、x値の連続した範囲を指定できます。単一のピクセルに影響を与えるために、終了x値は空白のままにするか、初期値と同じにすることができます。
オペコードは、ラスタロップとして使用されるユニバーサルバイナリ関数コードを指定する16進数です。引数は0または1です。実行されるラスター操作は
pixel = pixel OP argument infix expression
--or--
OP(pixel, argument) function call expression
したがって、ピクセルの元の値はUBFテーブルにXとして入り、ステートメントからの引数値はYとして入ります。この関数の結果はピクセルの新しい値です。そして、この操作は、ステートメントで指定されたxx、YYからXX、YYまでの各x、yのペアに対して実行されます。xxおよびXXで指定された範囲には、両方のエンドポイントが含まれます。そう
0000 0 010F1
行0にピクセル0,1,2,3,4,5,6,7,8,9,10を設定する必要があります。
出力寸法(m x n)は少なくとも20 x 20である必要がありますが、必要に応じて大きくすることができます。しかし、穀物は表示されるはずです。ピクセル化されることになっています。グラフィカル出力とASCIIアート出力の両方が許容されます。
たとえば、ピクセル化された図の画像を作成したい場合:
# #
###
##
####
#
#### ####
# #
###
# #
# #
XORのようなビット反転操作で描画すると、画面が黒か白かに関係なく描画および消去できます。
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
このシーケンスを複製すると、図が表示されたり消えたりします。
シーケンスフィールドに異なる「ショット」を指定することで、より大きなアニメーションを順不同で構成できます。
100 016F0
101 016F0
102 016F0
103 016F0
104 016F0
105 016F0
106 016F0
107 016F0
108 016F0
109 016F0
110 016F0
111 016F0
112 016F0
113 016F0
114 016F0
115 016F0
200020261
2 0 6 661
2 1 3 561
2 2 3 461
2 3 3 661
2 4 4 461
2 5 0 361
2 5 5 861
2 6 3 361
2 6 5 561
2 8 3 561
2 9 3 361
2 9 5 561
210 3 361
210 5 561
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
300020261
3 0 6 661
3 1 3 561
3 2 3 461
3 3 3 661
3 4 4 461
3 5 0 361
3 5 5 861
3 6 3 361
3 6 5 561
3 8 3 561
3 9 3 361
3 9 5 561
310 3 361
310 5 561
00020261
0 6 661
1 3 561
2 3 461
3 3 661
4 4 461
5 0 361
5 5 861
6 3 361
6 5 561
8 3 561
9 3 361
9 5 561
10 3 361
10 5 561
生産:
これはコードゴルフなので、最短のプログラム(バイト数)が勝ちます。エンジンがクリック音を鳴らす場合、ボーナス(-50)。
x
座標は常に包括的ですか?