K - えそらんぐ Editorial /

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インタプリタの仕様
  • メモリの要素数は 1024 で、ポインタは 0 以上 1024 未満の整数値を取る。
  • メモリの各要素は -128 以上 128 未満の整数値を取る。
  • はじめ、メモリの各要素の値やポインタは 0 である。
  • ポインタやメモリの値が下限のときに 1 減らすと、上限の値に置き換えられる。上限を超えた場合も同様である。
  • 対応する移動先の][が見つからなかった場合、エラーを出力して終了する。
  • ,の処理を行ったときに入力文字が存在しなかった場合、エラーを出力して終了する。
  • 8 種類の各処理を行った合計回数が 2^{20} 回を超えた場合、エラーを出力して終了する。

解答に必要な文字のASCIIコード一覧
'0' … 48
'1' … 49
'2' … 50
'3' … 51
'4' … 52
'5' … 53
'6' … 54
'7' … 55
'8' … 56
'9' … 57

制約

  • A,\ B1000 未満の正整数
  • A,\ B はテストケースごとにランダムに生成される

入力

この問題では直接入力は与えられないが、出力されたBrainfuckのプログラムに以下の形式で A,\ B が与えられる。

A\ B

これらが 3 桁に満たない場合は先頭に0が追加される。例えば、480487007と入力される。また、 AB の間のスペースは半角 1 文字である。

出力

AB の和を出力するBrainfuckソースコードを 1 行で出力せよ。末尾以外に改行や空白を含めてはならない。また、Brainfuckのプログラムが出力する内容は、先頭に 0 があってもよいが、ひとつながりで合計 4 文字以内でなければならない。


解説

解説