Ключи хэша, значения которых суммируются с определенным значением - PullRequest
0 голосов
/ 17 марта 2019

У меня есть хеш:

a = {"Q1"=>1, "Q2"=>2, "Q5"=>3, "Q8"=>3}

Я хочу извлечь из него набор ключей, чтобы сумма их значений равнялась определенному числу, например 5. В таком случае выходные данные должны быть:

Q2 Q5

Пожалуйста, помогите мне, как получить это.

Ответы [ 2 ]

1 голос
/ 17 марта 2019
def find_combo(h, tot)
  arr = h.to_a
  (1..arr.size).find do |n|
    enum = arr.combination(n).find { |e| e.map(&:last).sum == tot }
    return enum.map(&:first) unless enum.nil?
  end
 end

h = {"Q1"=>1, "Q2"=>2, "Q5"=>3, "Q8"=>3}

find_combo(h, 5)   #=> ["Q2", "Q5"] 
find_combo(h, 2)   #=> ["Q2"] 
find_combo(h, 6)   #=> ["Q5", "Q8"] 
find_combo(h, 4)   #=> ["Q1", "Q5"] 
find_combo(h, 8)   #=> ["Q2", "Q5", "Q8"] 
find_combo(h, 9)   #=> ["Q1", "Q2", "Q5", "Q8"] 
find_combo(h, 10)  #=> nil 
1 голос
/ 17 марта 2019

Просто из любопытства:

hash = {"Q1"=>1, "Q2"=>2, "Q5"=>3, "Q8"=>3}
arr = hash.to_a

1.upto(hash.size).
  lazy.
  find do |i|
    res = arr.combination(i).find do |h|
      h.map(&:last).sum == 5
    end
    break res if res
  end.tap { |result| break result.to_h if result }  
#⇒ {"Q2" => 2, "Q5" => 3}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...