1

我正在尝试解决Test-First Ruby 课程中的“猪拉丁问题”。

在这个程序中,我基本上试图用以下规则翻译一个字符串:

  1. 如果单词以元音开头,则在单词末尾添加“ay”。
  2. 如果单词以辅音开头,请将其移至单词末尾,然后在单词末尾添加“ay”音。

为此,我编写了以下运行良好的代码:

def translate(word)
  words=word.split(" ")
  words.each do |x|
    if ["a","e","i","o","u"].include?x[0,1]
      x << ("ay")
    else
      x << ("#{x[0,1]}ay")
      x[0,1]=""
    end
  end
  words.join(" ")
end

但是,问题还指出,在翻译开头有2个或3个辅音的单词时,应该将它们全部移到单词的末尾,然后加上“ay”。

为此,我在语句中结束了一个until循环:else

def translate(word)
  words=word.split(" ")
  words.each do |x|
    if ["a","e","i","o","u"].include?x[0,1]
      x << ("ay")
    else
      until ["a","e","i","o","u"].include?x[0,1]
        x << ("#{x[0,1]}")
        x[0,1]=""
      end
      x << ("#{x[0,1]}ay")
    end
  end
  words.join(" ")
end

这给了我这个结果:

translate("the bridge over the river kwai")
=> "etheay idgebriay overay etheay iverriay aikwaay"

因此,它会until额外运行一次循环,并将单词中的第一个元音也添加到末尾。但是,它不会从第一个位置删除这个元音。

我究竟做错了什么?

4

2 回答 2

4

就是这一行:x << ("#{x[0,1]}ay")

您已经从单词的开头刮掉了辅音,使其以元音开头,然后将该元音 ( "#{x[0,1]}") 与 . 一起添加到末尾ay

所以,x << ("#{x[0,1]}ay")用just替换x << "ay"它应该可以工作。

于 2013-09-17T18:37:31.107 回答
3

注意:从技术上讲,这不是答案

您的原始代码不是很地道。您正在运行while循环并就地改变字符串。你在好的 ruby​​ 代码中看不到这一点。我可以给你一个改进的版本吗?

def vowel?(str)
  ["a","e","i","o","u"].include?(str)
end

def translate_word(word)
  first_vowel_idx = word.chars.find_index{|c| vowel?(c)}
  leading_consonants = word[0..first_vowel_idx-1]
  rest_of_the_word = word[first_vowel_idx..-1]
  rest_of_the_word + leading_consonants + 'ay'
end

def translate(sentence)
  words = sentence.split(" ")
  words.map{|w| translate_word(w) }.join(" ")
end

translate("the bridge over the river kwai") # => "ethay idgebray overoveray ethay iverray aikway"
于 2013-09-17T18:51:08.720 回答