Почему мой цикл while зависает? Я забыл шаг?

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

Это латинская свинья :) В общем. Если вы поместите слово в переменную... или два слова, оно должно перевести эти слова на то, что называется поросячьей латынью. Поросячья латынь берет такое слово, как hello, и заменяет его на ellohay. В свиной латыни слова должны начинаться с гласной. Так что у вас может быть даже слово «закрыто» и должно быть написано «osedclay». Я решил подойти к этому с помощью цикла while. В то время как моя проверка rspec работает с первыми двумя проверками... кажется, что она застревает в бесконечном цикле, когда начинает проверять третье слово (которое оказывается "вишня")

Кто-нибудь думает?

def translate(word)
separated = word.split("")
while separated[0] !=("a" || "e" || "i" || "o" || "u")
    letter = separated.shift
    separated << letter
    separated
end
    word = separated.join("")
    word + "ay"
end

person NicholasJay    schedule 04.09.2013    source источник


Ответы (1)


Оператор != работает не так, как вы думаете.

while separated[0] !=("a" || "e" || "i" || "o" || "u")

Строка выше эквивалентна

while separated[0] != 'a'

Если в вашем слове нет «а», цикл бесконечен. Вы должны переписать свое условие

while !'aeiou'.include?(separated[0])

Я знаю, я буду использовать регулярные выражения...

Вот несколько более короткая версия метода

def translate(word)
  # you can make one-liner out of it.
  leading_consonants_regex = /^([bcdfghjklmnpqrstvwxyz]+)(.*)/
  word.sub(leading_consonants_regex, '\\2\\1ay')
end

translate('sheep') # => "eepshay"
translate('dog') # => "ogday"
translate('closed') # => "osedclay"
translate('cherry') # => "errychay"
person Sergio Tulentsev    schedule 04.09.2013