# Valid Parentheses
#
# Дана строка s, состоящая только из символов '(', ')', '{', '}', '[', ']'.
# Напиши функцию is_valid(s), которая возвращает true, если строка валидна,
# и false иначе.
#
# Строка валидна, если:
#   1) каждая открывающая скобка закрывается скобкой того же типа;
#   2) скобки закрываются в правильном порядке;
#   3) каждой закрывающей скобке предшествует открывающая того же типа.
#
# Примеры:
#   is_valid("()")      →  true
#   is_valid("()[]{}")  →  true
#   is_valid("(]")      →  false
#   is_valid("([])")    →  true
#
# Ограничения:
#   1 <= s.length <= 10^4
#   s состоит только из символов '()[]{}'

def is_valid(s)
  stack = []

  s.chars.each do |char|
    if openning?(char)
      stack.push(char)
    else
      return false unless matches?(stack.last, char)

      stack.pop
    end
  end

  stack.empty? || false
end

def openning?(char)
  ['{', '(', '['].include? char
end

def matches?(a, b)
  [
    ['{', '}'],
    ['(', ')'],
    ['[', ']']
  ].include?([a, b])
end
