我目前正在进行一项练习,其中包括将“快速棕色狐狸”改为“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”。
需要修正的区域在哪里?我无法确定问题所在。你能告诉我解决方案吗?
答案 0 :(得分:1)
这是一种非常程序化和复杂的解决方法。我不确定您检查q
和u
的规则是什么,因为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")
显然,这两个都是例子,可以通过工作做得更好。但它们有助于说明这一点。
这可以使用map
和join
,并且可以进一步优化。这个方法和你的方法之间的关键区别在于,当你可能不需要时,你试图迭代地建立一个翻译地图。使用枚举函数,它们是使函数式编程风格更具表现力的一部分。学会思考“我如何置换此数据集以获得我想要的响应”,而不是“我需要采取哪些步骤才能获得所需的响应”。