1

如何优雅地重新排列我的代码,以便我可以获得输出{:monosyllabic=>3, :polysyllabic=>4}而不是相反?

def polysyllabic(dictionary)

  words = Hash.new(0)
  dictionary.each do |word|
  if word.scan(/[aeiou]/).size > 1
    words[:polysyllabic] += 1
  else
    words[:monosyllabic] +=1
  end
end

polysyllabic(%w(puts locker aero mass ana put pets))

编辑:是的,我认为有 3 个单音节词:mass,put,pets。我和其他一些人发音“puts”“就像“put s”,所以我想把它归类为多音节。如果我错了,请纠正我。

4

2 回答 2

1

这是您的代码的清理版本:

def polysyllabic dictionary
  dictionary.each.with_object(Hash.new(0)) do |word, h|
    h[(word.count('aeiou') > 1) ? :polysyllabic : :monosyllabic] += 1
  end
end

Ruby 后期版本中的散列保持将键添加到散列中的顺序。

p polysyllabic(%w(puts locker aero mass ana put pets))
# => {:monosyllabic=>4, :polysyllabic=>3}
p polysyllabic(%w(locker aero mass ana put pets))
# => {:polysyllabic=>3, :monosyllabic=>3}

在第一种情况下,“puts”是单音节的,它首先在散列中定义,因此散列的输出反映了这一点。在第二种情况下,'locker' 是 poly,因此首先输出。为确保输出排序,请为该行为编写一个新方法。

class Hash
  def sorted_keys
    sort.to_h
  end
end

p polysyllabic(%w(locker aero mass ana put pets)).sorted_keys
# => {:monosyllabic=>3, :polysyllabic=>3}

这对散列的数组形式进行排序,然后转换回散列。

于 2015-05-23T18:30:22.043 回答
-1
def polysyllabic(dictionary)

  words = {:monosyllabic=>0, :polysyllabic=>0}
于 2015-05-23T18:15:16.717 回答