Let's try Short Coding!

Short Coding ~職人達の技法~


まだ読み終えていませんが,かなり影響を受けています.これほどまでに著者の思いが伝わってくる技術書に出会ったのは,久しぶりです.


自分もがんばって勉強しようと思い,
anarchy golf - Bracket Matching
に挑戦してみました.


Pythonである理由は,特にありません.この問題を選んだ理由も,特にありません.


最初に書いたコードは,300バイトくらいで,「170なんて無理!」と思いましたが,そのあと,唸りながら必死で考えて,何とか173バイトにまで縮まりました.
もう Try & Error の嵐です.

def p(r):
 if r:print r
 l=raw_input();s=[];m="failed at: "
 while l:i="<{[(>}])".find(l[0]);s+=[i]*(i<4or i-s.pop()!=4and p(m+l));l=l[1:]
 p(["yes",m+"EOL"][len(s)>0])
p(0)


処理の概要としては,

1文字ずつ読み取り
閉じカッコでなければスタックへ(i<4)
閉じカッコがきたら,開始カッコとマッチしているか判定(i-s.pop()!=4:マッチしていないとTrue)
  マッチしていなければ(Trueなら)エラー(p(m+l))
  マッチしていれば(Falseなら)次へ(and の右側は評価されず,s+=[i]*0になるのでスタックにも積まれない)
スタックが空ならOK,空でなければEOL表示

といった感じです.


"4" という数字が出現する理由は,"<{[(>}])" の並びによるためです(対応するカッコのindex差が 4 ).
(最初は文字コードを使っていたのですが,カッコを並べて眺めていたら,「あっ」てな感じで)


結果表示については,"print" を1つだけに抑えたいがため,自身の再帰により,全ての表示を行うようにしています.

表示するということは,1行分の判定が終了したことになるからです.


なんだかヘロヘロになってしまいました.もっと修行して体力をつけないと・・・.