Добавить пропущенные скобки в заданную строку - PullRequest
1 голос
/ 03 февраля 2020

В настоящее время я столкнулся с одной проблемой, когда я добавил пропущенные скобки в строку. Если есть открытая скобка без закрывающей скобки, то мы должны добавить закрывающую скобку после первого найденного знака вопроса или периода.

Вот мой код

def fix_para(input) 
  opening = input.count("(")
  closing = input.count(")")
  valid_str = ""
  input.split(//).each do |c|
    if c == "("
      opening = opening - 1
      valid_str << c
    elsif c == ")"
      closing = closing - 1
      valid_str << c
    elsif c == "?" || c == "."
      valid_str << c
      closing = closing - 1 if closing > 0
      valid_str << ")"
    else
      valid_str << c
    end
  end
  valid_str
end

Этот код работает нормально для входной строки:

"(((Hey) how are you? how is it going."

, но не с:

"Hey how are you? (Is (your) name Larry?"

Чего мне не хватает?

Вот две примерные строки с ожидаемым выводом:

fix_para "Hey how are you? (Is (your) name Larry?"
  #=> "Hey how are you? (Is (your) name Larry?)"

fix_para "(((Hey) how are you? how is it going."
  #=> "(((Hey) how are you?) how is it going.)"

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Проблема с вашим кодом заключается в том, что вам нужно отслеживать количество неразрывных левых скобок, когда вы шагаете по символам строки, слева направо, число, которое может увеличиваться или уменьшаться. Вы можете получить желаемые строки следующим образом.

def add_closing_parens(str)
  n = 0 
  s = str.each_char.with_object('') do |c,s|
    s << c
    case c
    when '('
      n += 1
    when ')'
      n -= 1
    when '?', '.', '!'
      if n > 0
        s << ')'
        n -= 1
      end
    end
  end
  n.zero? ? s : nil      
end

n - это число оставленных паренов, которые еще не были закрыты. Я добавил восклицательный знак, так как он может завершить предложение.

add_closing_parens "Hey how are you? (Is (your) name Larry?"
  #=> "Hey how are you?) (Is (your) name Larry?)" 
add_closing_parens "(((Hey) how are you? how is it going."
  #=> "(((Hey) how are you?) how is it going.)"
add_closing_parens "((Hey (how (are) you? What's happenin? Wow!"
  #=> "((Hey (how (are) you?) What's happenin?) Wow!)"
add_closing_parens "Hey how (are) you? (What's (happenin? Wow!"
  #=> "Hey how (are) you? (What's (happenin?) Wow!)"

str = "(((Hey (how (are) you? What's happenin? Wow!"
add_closing_parens str
  #=> nil

Если вы хотите добавить пропущенные правые скобки в конце, замените две последние строки на:

end << ')' * n

после чего:

add_closing_parens str
  #=> "(((Hey (how (are) you?) What's happenin?) Wow!))" 
0 голосов
/ 03 февраля 2020

Если все, что вам нужно, это добавить соответствующее число закрывающих скобок в конец строки, я думаю, это будет работать:

def fix_para(input)
  opening = input.count("(")
  closing = input.count(")")
  return input unless opening > closing

  input + ')' * (opening - closing)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...