【问题标题】:The pig latin translation猪拉丁语翻译
【发布时间】:2013-09-17 18:31:35
【问题描述】:

我正在尝试解决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”。

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

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 循环,并将单词中的第一个元音也添加到末尾。但是,它不会从第一个位置删除这个元音。

我做错了什么?

【问题讨论】:

    标签: ruby


    【解决方案1】:

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

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

    所以,只需将 x &lt;&lt; ("#{x[0,1]}ay") 替换为 x &lt;&lt; "ay",它应该可以工作。

    【讨论】:

    • 另外,在这种情况下,您可以去掉那里的if
    【解决方案2】:

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

    您的原始代码不是很地道。您正在运行 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"
    

    【讨论】:

    • 我喜欢你的方法,但会倾向于用c =~ /[aeiou]/ 替换vowel?(c)
    • @CarySwoveland:如何更通用?它只做一件事(并为其命名)。
    • c =~ /[aeiou]/ 也可写为 c[/[aeiou]/] 但 Sergio 对可读性提出了很好的观点。速度是使用正则表达式的原因,而不是遍历元音数组,牺牲可读性。
    • 我在您发表评论之前删除了我给出的原因。考虑到您只调用了一次vowel?(c),并且我建议的替换很简短且同样易于理解(不是吗?),我认为那里不需要一种方法。绝对是一个好点,和品味问题。 (我确实给了你 10 分。:-|)@theTinMan:谢谢你的评论,尤其是第一条——我不知道。
    • @CarySwoveland:在以前的代码版本中,vowel? 被多次使用。现在可以内联了,是的。但我还是会犹豫。这是一个很好的抽象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多