2015-12-26 2 views
-1

Мне нужна помощь по написанию метода, который принимает строку, и возвращает true, если буква «z» появляется в трех письмах после a " а». Вы можете предположить, что строка содержит только строчные буквы. вот что у меня есть:ruby ​​возвращает true, если строка содержит «a», а затем «z»

def nearby_az(string) 
string.downcase! 
i = 0 
    while i < string.length 
     if (string[i] == "a" && string[i] == "z") 
      true 
     else 
      false 
     end 
    end 
end 

puts('nearby_az("baz") == true: ' + (nearby_az('baz') == true).to_s) 
puts('nearby_az("abz") == true: ' + (nearby_az('abz') == true).to_s) 
puts('nearby_az("abcz") == true: ' + (nearby_az('abcz') == true).to_s) 
puts('nearby_az("a") == false: ' + (nearby_az('a') == false).to_s) 
puts('nearby_az("z") == false: ' + (nearby_az('z') == false).to_s) 
puts('nearby_az("za") == false: ' + (nearby_az('za') == false).to_s) 
+0

Ваше текущее выражение всегда будет ложным. Вы не можете иметь значение одновременно как a, так и z. – Makoto

ответ

3

Регулярное выражение было бы лучшим для этого. Попробуйте

def nearby_az(string) 
    (string =~ /a.{0,2}z/) != nil 
end 

EDIT: в соответствии с «если утверждение требуется требование» :)

def nearby_az(string) 
    if (string =~ /a.{0,2}z/) != nil 
     return true 
    end 
    return false 
end 

Путь этот код работает он ищет строку ввода для «а». После этого период указывает, что у вас может быть любой символ. После этого у вас есть {0,2}, который является модификатором периода, указывающего, что у вас может быть от 0 до 2 любого символа. После этого у вас должно быть «z», и это соответствует вашему, должно быть z в трех символах «a».

Я сохранил это регулярное выражение для regex101 here, чтобы вы могли попробовать различные входы, а также изменить регулярное выражение, чтобы лучше понять его.

+0

окончание regexp с z woud будет еще лучше –

+0

Yup, small typo - thx :) –

+0

, если следующий код может быть записан в выражении if, было бы лучше, потому что это то, что требует мой инструктор. спасибо, и если вы тоже это объясните, потому что я новичок и хотел бы понять, как работает код. спасибо @ Martin Konecny: (string = ~ /a.{0,2}z/)! = nil –

1

Чтобы исправить ваш код вам нужно:

  • приращение я в конце цикла.
  • поиска г письма в течение 3 следующих букв
  • возвращающих когда условие выполняется
  • возвращения ложным при выходе из цикла

Вот что он должен выглядеть следующим образом:

def nearby_az(string) 
    string.downcase! 
    i = 0 
    while i < string.length do 
     return true if string[i] == "a" && string[i+1,3].include?(?z) 
     i+=1 
    end 
    return false 
end 
Смежные вопросы