Next Favorite Alphabet

2 secs 1024 MB
Uniden's icon Uniden

原案:Uniden

解説:RedSpica

まず「Brainfuckで解く」という制限を外して,普通の競技プログラミングの問題として考えてみましょう.するとこの問題は「c=S[i]c=S[i]となるiiに対してS[i+1]S[i+1]を出力せよ」となります.

そして,以下の命題が得られます.

c=S[i]c=S[i] \Leftrightarrow ord(c)\mathbf {ord}(c)- ord(S[i])=0\mathbf{ord}(S[i])=0

ただし,ord\mathbf{ord}は文字コードを返す関数です.この命題を利用して以下のようなコードが書くことができると思います.

実装例(Python)
c=input()
S=input()
i=0
while ord(c)-ord(S[i]):
    i+=1
print(S[i+1])

ではこれをBrainfuckで実装するとどのようになるでしょうか.Brainfuckでも先ほどのPythonのコードとほぼ同じように「SSを先頭から入力していく.今見ている(入力を受け取った)文字がccと一致するならばループを終了し次に受け取った文字をそのまま入力する,一致しない場合は繰り返す」という流れになります.

実装上の注意として,ccS[i]S[i]を比較する際にccを毎回どこかに保存しておくようにしてください(詳しくは実装を見てください).

実装例(Brainfuck)
>,                 //2番目のポインタにcを入力する
>,[-]              // 改行を読み取って廃棄
+
[
	,          //3番目のポインタにS_iを入力する
	<[<+>>-<-] //1番目のポインタにcをコピーしながら,3番目のポインタからord(c)を引く
	<[>+<-]    //2番目のポインタにcをコピーする
	>>         //ord(S_i)とord(c)の差が0かどうか判定する。 0の場合はループ終了
]
,.                 //答えとなる文字を入出力