猪拉丁转换器

时间:2014-11-26 13:08:27

标签: ruby

我目前正在进行一项练习,其中包括将“快速棕色狐狸”改为“Hetay uickqay rownbay oxfay”

def translate(sent)
  sent = sent.downcase
  vowels = ['a', 'e', 'i', 'o', 'u']
  words = sent.split(' ')
  result = []

  words.each_with_index do |word, i|
    translation = ''
    qu = false
    if vowels.include? word[0]
      translation = word + 'ay'
      result.push(translation)
    else
      word = word.split('')
      count = 0
      word.each_with_index do |char, index|
        if vowels.include? char
          # handle words that start with 'qu'
            if char == 'u' and translation[-1] == 'q'
            qu = true
            translation = words[i][count..words[i].length] + translation + 'ay'
            result.push(translation)
            next
          end
          break
        else
          # handle words with 'qu' in middle
          if char == 'q' and translation[i-1] == 'u'
            qu = true
            translation = words[i][count +1..words[i].length] + 'ay'
            result.push(translation)
            next
          else
            translation += char
          end
          count += 1
        end
      end
      # translation of consonant words without "qu"
      if not qu
        translation = words[i][count..words[i].length] + translation + 'ay'
        result.push(translation)
      end
    end

  end
  result.join(' ')
end

puts translate("The quick brown fox")

然而,我得到了“ethay uickqay ownbray oxfay”而不是“Hetay uickqay rownbay oxfay”。

需要修正的区域在哪里?我无法确定问题所在。你能告诉我解决方案吗?

1 个答案:

答案 0 :(得分:1)

这是一种非常程序化和复杂的解决方法。我不确定您检查qu的规则是什么,因为pig latin translation rules没有提及qu作为特例:

更简单的方法是将句子拆分成一个单词数组,并根据需要转换每个单词:

def translate(sent)
  translation = sent.split(' ').map do |w|
    vowels = %w(a e i o u)
    word = w.downcase.split('')

    if vowels.include? word[0]
      "#{word}way"
    else
      "%s%say" % [word[1..-1], word[0]]
    end
  end

  translation.join(' ').capitalize
end

puts translate("The quick brown fox")
# outputs Hetay uickqay rownbay oxfay

并且,对于1.9而且可能在上面:

def translate(sent)
  translation = sent.split(' ').map do |w|
    vowels = %w(a e i o u)
    word = w.downcase.split('')

    if vowels.include? word[0]
      "#{word.join}way"
    else
      "%s%say" % [word[1..-1].join, word[0]]
    end
  end

  translation.join(' ').capitalize
end

puts translate("The quick brown fox")

显然,这两个都是例子,可以通过工作做得更好。但它们有助于说明这一点。

这可以使用mapjoin,并且可以进一步优化。这个方法和你的方法之间的关键区别在于,当你可能不需要时,你试图迭代地建立一个翻译地图。使用枚举函数,它们是使函数式编程风格更具表现力的一部分。学会思考“我如何置换此数据集以获得我想要的响应”,而不是“我需要采取哪些步骤才能获得所需的响应”。