括弧の組み合わせを入れる変数名が微妙だったが、key_to_valueにすると確かに分かりやすい。
# @param {String} s
# @return {Boolean}
def is_valid(brackets)
open_to_close = {
'(' => ')',
'{' => '}',
'[' => ']'
}
opens = []
brackets.each_char do |bracket|
if open_to_close.keys.include?(bracket)
opens << bracket
elsif open_to_close.values.include?(bracket)
open = opens.pop
return false if bracket != open_to_close[open]
else
raise ArgumentError, "Unexpected bracket: #{bracket}"
end
end
opens.size == 0
end変更点は以下
- String#each_charを使った
- popして判定する部分を副作用のある処理を条件式に利用しないようにした
- 自分も読むときだと分けられているほうが好みなので
open_to_close.keysやopen_to_close.valuesを変数にいれないようにした- 解いた時の気持ちを振り返ってみると、変数にいれた理由はHashMap(RubyだとHash)の命名
parenthesis_combinationsが微妙だったのでparenthesis_combinations.keys等だとなんか気持ち悪いな…、という感覚があったことが理由かも。なのでopen_to_closeにすれば変数に入れななくても良い。
- 解いた時の気持ちを振り返ってみると、変数にいれた理由はHashMap(RubyだとHash)の命名