アナゴルの「Turing Machine」
1週間前からPythonを覚え始めたので、久し振りににアナゴルをやってみました。「Turing Machine」という問題がdeadlineを過ぎて、残念ながら2位で終了しました。
最初に作ったコードがこれです。
import sys r=list(sys.stdin) t=['']*999 k=500 s=4 while s>0:t[k],d,c=r[int(t[k]or 0)+1][s:s+3];k+=ord(d)-61;s=ord(c)*4-256 print''.join(t)
で、試行錯誤しているうちにうっかり名無しでSubmitしてしまったのがこれ。
import sys r=list(sys.stdin) p=500 t=['']*p*2 s='A' while'#'<s:t[p],d,s=r[int(t[p]or 0)+1][ord(s)-64<<2:][:3];p+=ord(d)-61 print''.join(t)
両方とも138バイトですが、2番目の方がちょっとスマートな感じです。
1位のhallvaboさんのコードを見ると、リストtに文字列ではなく整数で文字コードを入れていました。このやり方だと最後に文字列に変換しなければならないので長くなってしまうのですが、他の部分のおかげで136バイトと私よりも2Bytes短くなっています。どこが短いのかというと、まず標準入力からの読み込みでsysモジュールを使わずに「list(open('/dev/fd/0')」となっていました。うーん、知らなかった。あと、「ord(s)-64<<2」の所が「ord(s)%8*4」と、ここでも2Bytes少なくなっていました。なるほど。
というわけで、書き直したのが以下のコードです。
r=list(open('/dev/fd/0')) p=500 t=['']*p*2 s='A' while'#'<s:t[p],d,s=r[int(t[p]or 0)+1][ord(s)%8*4:][:3];p+=ord(d)-61 print''.join(t)
これで133バイトです。