Electronic Stationの1問目(Brackets)
ブログすっかりごぶさたでしたが、
Homeが終わって無料でやれるのが疎らだったので思わず課金してしまったりしてる程度に、
CheckiOは続けています。Electronic Stationの前半は比較的簡単でしたので足早に。
数式が正しいか判別する問題ですね。
とりあえず数式のうち括弧以外の要素を削除して、
閉じれた括弧は消すって感じでやってみようと思って色々やってて、
結局
def checkio(expression):
brackets = "() {} "
expression_brackets = ""
for i in list(expression) :
if brackets.count(i) > 0 :
expression_brackets += i
if len(expression_brackets) < 1 :
return True
if len(expression_brackets) %2 != 0 :
return False
while len(expression_brackets) > 1 :
for i in brackets.split(" "):
if expression_brackets.find(i) > -1 :
deleted = expression_brackets.replace(i, "")
expression_brackets = deleted
break
else :
if i == brackets.split(" ")[2] :
return False
expression_brackets = ""
return True
で、解けました。
あまり綺麗ではないのでリファクタリング。。。
純粋に左カッコと右カッコを別に判別して、
左カッコがでてきた順にappend()して、
右カッコがでてきた順にpop()する感じとかでどうだろう。
def checkio(expression):
brackets_open = ["(","{","["]
brackets_close = [")","}","]"]
expression_brackets =
for i in expression :
if i in brackets_open:
expression_brackets.append(i)
elif i in brackets_close:
if len(expression_brackets) < 1 or expression_brackets.pop() != brackets_open[brackets_close.index(i)]:
return False
return True if expression_brackets == [] else False
まぁ、少しマシになりましたかね。
支持率No1は
def checkio(data):
stack=[""]
brackets={"(":")","[":"]","{":"}"}
for c in data:
if c in brackets:
stack.append(brackets[c])
elif c in brackets.values() and c!=stack.pop():
return False
return stack==[""]
なるほどですね。
大枠の考え方はリファクタリング後のものと近いですが書き方は全然スマート。
うむ、頑張ろう。