我是Ruby的新手,并尝试从IOI解决this question以进行自学。
我有以下哈希和数组。 myhash有popularity of sports => cost for construction
。每个votes
值都是构造的限制。如果它小于或等于popu_cost的施工成本,它将获得投票,并将从最高人气来检查。一旦发现,无需检查其他运动。
popu_cost = {1=>8, 2=>8, 3=>7, 4=>5, 5=>2, 6=>5, 7=>2, 8=>7, 9=>2, 10=>1}
votes = [2, 8, 4, 1, 8, 2, 10, 3, 2, 2]
现在我想在votes element <= hash value
找到哈希键并添加到results[]
。例如
votes[0], max cost afford is 2. So hash index 5 since 2 is less than or equal to 2
votes[1], 8 is hash index 1 since 8 is less than or equal to 8
votes[2], 4 is hash index 5 since 2 is less than or equal to 4
votes[3], 1 is hash index 10 since 1 is less than or equal to 1
votes[4], 8 is hash index 1 since 8 is less than or equal to 8
votes[5], 2 is hash index 5 since 2 is less than or equal to 2
votes[6], 10 is hash index 1 since 8 is less than or equal to 10
votes[7], 3 is hash index 5 since 2 is less than or equal to 3
votes[8], 2 is hash index 5 since 2 is less than or equal to 2
votes[9], 2 is hash index 5 since 2 is less than or equal to 2
这应该给出[5,1,5,10,1,5,1,5,5,5]。
我尝试了以下但结果不是我的预期。
results = []
votes.each{ |ele| popu_cost.each{ |key, val|
if l <= val
results << key
end
}}
results
答案 0 :(得分:1)
您可以使用.map
和.find
轻松解决此问题,其中.map
将转化应用于每个输入元素,并输出包含每个转换结果的列表,{{1} }可用于查找.find
的第一个元素,它为给定的块产生Enumerable
。
我使用它们来执行您指定的比较,而.first
将仅返回Hash的true
,这是您感兴趣的内容。key
部分指定lambda如果找不到任何内容,则产生一个空数组,因此-> {[]}
将产生.first
。当nil
包含的值小于votes
的所有元素时,就会发生这种情况。
popu_cost
答案 1 :(得分:1)
您需要稍微修改一下代码。但首先,需要澄清这个问题。我的理解(纠正我,如果我错了)是,对于e
的每个元素votes
,您希望找到k=>v
的第一个元素popu_cost
e >= v
k
1}}和(如果找到一个)将键result
添加到数组votes
。例如,k=>v
的第一个元素是2. 2 >= v
为5=>2
的第一个元素result << 5
,popu_cost = {1=>8, 2=>8, 3=>7, 4=>5, 5=>2, 6=>5, 7=>2, 8=>7, 9=>2, 10=>1}
votes = [2, 8, 4, 1, 8, 2, 10, 3, 2, 2, 0]
results = []
votes.each do |e|
key, _ = popu_cost.find { |_, val| e >= val }
results << key if key
end
results
#=> [5, 1, 5, 10, 1, 5, 1, 5, 5, 5]
。
注意我们必须假设这是针对Ruby 1.9+的,因为我们依赖于哈希来维护其插入顺序。
以下是对代码的修改,用于创建所需的数组:
find
请注意,我已使用each
votes
。那是你的主要问题。您不希望找到满足votes
的每个元素的条件的所有哈希元素,只是第一个元素。
请注意,我为您为k=>v
提供的示例添加了零。这表明,当e >= v
的哈希没有元素result
时,{{1}}没有添加任何键。