Electronic Stationの1問目(Brackets)

ブログすっかりごぶさたでしたが、
Homeが終わって無料でやれるのが疎らだったので思わず課金してしまったりしてる程度に、
CheckiOは続けています。Electronic Stationの前半は比較的簡単でしたので足早に。

py.checkio.org

数式が正しいか判別する問題ですね。
とりあえず数式のうち括弧以外の要素を削除して、
閉じれた括弧は消すって感じでやってみようと思って色々やってて、
結局

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==[""]

なるほどですね。
大枠の考え方はリファクタリング後のものと近いですが書き方は全然スマート。

うむ、頑張ろう。