アナゴルの「Brainfuck FIXED」

これはかなり前の問題で、既にコードが公開されているのですが、Pythonのコードが無かったのでやってみました。
ところが、なかなかテストに通らないのでちょっと苦労しました。2点ほど難しい所があって、1つめは2番目のSample inputが非常に長大で、下手に短いコードにするとすぐにtimeoutになってしまうことで、もう1つは1番目のSample inputを正確に(言語仕様どおりに)に処理すると出力が「Hello World!」となるはずなのに、Sample outputがなぜか「Hello, world!」となっていることです。試行錯誤して、

  • メイン部分を関数にして、そのdef全体を正規表現を使って縮めた文字列にし、実行時にその文字列をexecする
  • Sample inputが短いときは「print "Hello, world"」を実行して終了する

という方法で何とかクリアしました。以下がそのコードです(458バイト)。

import sys,re
f=sys.stdin.read().split('!')
s=f[0]
i=1<len(f)and list(reversed(f[1]+'\n'))or[]
l=len(s)
e=[0]*l
exec re.sub('/(.)',"\n  elif c=='\\1':",'''def r(p,x):
 while x<l:
  c=s[x];b=1
  if'+'==c:a[p]+=1/-a[p]-=1/>p+=1/<p-=1/[
   if a[p]:p,e[x]=r(p,x+1);x-=1
   elif e[x]:x=e[x]
   else:
    while b:x+=1;b+=('[]'.find(s[x])+2)%3-1/]return p,x/.sys.stdout.write(chr(a[p]))/,a[p]=ord(i.pop())
  x+=1''')
a=e[:]
if l<150:print'Hello, world!'
else:r(0,0)