如何仅通过多个 objects 的唯一组合进行迭代?

How to iterate only through unique combinations of multiple objects?

标题有点傻。

我正在开发一个用户可以出价的项目。生成的项目可以独占或分配给最多 3 个用户。一个用户可以独家下注 20 美元,另外 3 个用户可以同意进行 3 路拆分,每人只需支付 10 美元,结果是 30 美元,击败第一个出价者。

我需要 运行 通过可能有十几个同意三方拆分的不同投标人的列表来确定获胜的三人组合:

Rza                              =>  # loses
ODB + Gza                        =>  # loses
InspectahDeck + Ghostface + ODB  =>  # wins

或者

Rza                              => 0,000 # wins
ODB + Gza                        =>  # loses
InspectahDeck + Ghostface + ODB  =>  # loses

我只有一个Bidobjects的数组,属于各种各样的用户。我的目标是查看那些希望与其他人分开的人的所有可能组合,看看谁能排在首位。

我尝试做类似的事情:

bids.each do |bid1|
 bids.each do |bid2|
  bids.each do |bid3|
  # Fill a hash here, but only if the permutation of the bids is unique
  end
 end
end

我遇到了困难,因为它看起来效率极低并且有大量重复项,有时相同的出价会出现两次。我需要一些帮助或提示以指明正确的方向。

我真的被难住了。

提前致谢。

PS:另一个棘手的细节:每个投标人可以设置多个投标。所以同一个人可以有 1 个独占,1 个 2-way 和 1 个 3-way。

假设你有这样的事情:

class Bid
  attr_accessor :user   # link to the user
  attr_accessor :price  # dollar amount
  attr_accessor :way    # 1 means 1-way, 2 means 2-way, 3 means 3-way
end

获得各种最高赌注:

best_1_way  = bids.select{|bid| bid.way == 1}.max
best_2_ways = bids.select{|bid| bid.way == 2}.sort[-2,2]
best_3_ways = bids.select{|bid| bid.way == 3}.sort[-3,3]

获取总价:

total_1_way_price = best_1_way.price
total_2_ways_price = best_2_ways.map(&:price).inject(&:+)
total_3_ways_price = best_3_ways.map(&:price).inject(&:+)

比较这三项,你就赢了。

如果您有很多出价并且想要优化:

all_1_ways, all_2_ways, all_3_ways = 
  bids.group_by{|bid| bid.way }.values_at(1,2,3)