Time Limit: 2 sec / Memory Limit: 1024 MB
配点: 100 点
問題文
世の中にはC/C++、Java、Pythonといった、便利で書きやすいプログラミング言語がたくさんあります。これらの言語の登場により、わかりにくいアセンブリと比べてコンピュータのハードルがぐっと下がりました。
これらとは対照的な存在が、BrainfuckやLazy K、Pietといった、いわゆる「難解プログラミング言語(Esolang)」です。これらの言語の特徴は、名前通り「非常に難解」ということです。例えば、例に上げたBrainfuckで
Hello, World!を出力するプログラムは、以下のようになります(一例)。
+++++++++[>++++++++<-]>.<+++++++++[>+++<-]>++.+++++++..+++.<+++++++++[>-------<-]>----.<+++++++++[>-<-]>---.<+++++++++[>++++++<-]>+.<+++++++++[>++<-]>++++++.+++.------.--------.<+++++++++[>-------<-]>----.
このように、何を書いてあるかさっぱり分かりません。
Brainfuckのプログラムは 8 種類の記号のみで構成され、単一のメモリ(配列)にデータを出し入れすることで処理を進めます。メモリの参照先は「ポインタ」という変数で保持されます。 8 種類の記号それぞれの意味する処理は以下のとおりです。
>
:ポインタを 1 増やす<
:ポインタを 1 減らす+
:ポインタが指すメモリの値を 1 増やす-
:ポインタが指すメモリの値を 1 減らす.
:ポインタが指すメモリの値に対応するASCII文字を出力する,
:入力から 1 文字読み込み、ポインタが指す先にASCIIコードを代入する[
:ポインタが指すメモリの値が 0 のとき、対応する]
の直後へジャンプする]
:ポインタの指すメモリの値が 0 でないとき、対応する[
の直後へジャンプする
文字の意味が分かると、さっきのプログラムもなんとなくわかった気になりませんか? 私はなりません。
このBrainfuckを使って、 3 桁の正整数 A,\ B の和を求めるプログラムを書いてください。
ジャッジで使用されるBrainfuckインタプリタの仕様
]
や[
が見つからなかった場合、エラーを出力して終了する。,
の処理を行ったときに入力文字が存在しなかった場合、エラーを出力して終了する。
解答に必要な文字のASCIIコード一覧
'0' … 48
'1' … 49
'2' … 50
'3' … 51
'4' … 52
'5' … 53
'6' … 54
'7' … 55
'8' … 56
'9' … 57
制約
- A,\ B は 1000 未満の正整数
- A,\ B はテストケースごとにランダムに生成される
入力
この問題では直接入力は与えられないが、出力されたBrainfuckのプログラムに以下の形式で A,\ B が与えられる。
A\ B
これらが 3 桁に満たない場合は先頭に0
が追加される。例えば、48
は048
、7
は007
と入力される。また、 A と B の間のスペースは半角 1 文字である。
出力
A と B の和を出力するBrainfuckソースコードを 1 行で出力せよ。末尾以外に改行や空白を含めてはならない。また、Brainfuckのプログラムが出力する内容は、先頭に 0 があってもよいが、ひとつながりで合計 4 文字以内でなければならない。