如何从Ruby车手组合中提取最高driver_points并翻倍其分值
Ruby 实现车手车队组合优化与输出
核心逻辑说明
- 筛选单车队+3名车手的组合,确保总花费不超过目标预算(
target=13.5) - 对每个有效组合的车手进行调整:
- 找出
driver_points最高的车手,将其移至车手列表首位 - 计算总积分时,将该车手的积分翻倍,其余车手积分正常累加,再加上车队积分
- 找出
- 按总积分从高到低排序后,以表格形式输出结果
完整代码实现
# 模拟数据源:车队与车手数据 teams = [ { name: "Mercedes", cost: 4.0, team_points: 250 }, { name: "Red Bull", cost: 3.8, team_points: 240 }, { name: "Ferrari", cost: 3.5, team_points: 220 }, { name: "McLaren", cost: 3.2, team_points: 200 } ] drivers = [ { name: "Max Verstappen", cost: 4.5, driver_points: 300 }, { name: "Lewis Hamilton", cost: 4.2, driver_points: 280 }, { name: "Charles Leclerc", cost: 3.8, driver_points: 260 }, { name: "Lando Norris", cost: 3.0, driver_points: 220 }, { name: "Sergio Perez", cost: 3.5, driver_points: 240 }, { name: "George Russell", cost: 3.2, driver_points: 230 } ] target_budget = 13.5 # 生成所有符合预算的车队+3车手组合 valid_combinations = [] teams.each do |team| # 从车手列表中选3名的所有组合 drivers.combination(3).each do |driver_group| total_cost = team[:cost] + driver_group.sum { |d| d[:cost] } next if total_cost > target_budget # 处理车手组:找出积分最高的,移到首位 top_driver = driver_group.max_by { |d| d[:driver_points] } sorted_drivers = [top_driver] + driver_group.reject { |d| d == top_driver } # 计算总积分:车队积分 + 顶级车手积分*2 + 其余车手积分 total_points = team[:team_points] + top_driver[:driver_points] * 2 + sorted_drivers[1..-1].sum { |d| d[:driver_points] } valid_combinations << { team: team[:name], drivers: sorted_drivers.map { |d| d[:name] }, total_cost: total_cost.round(2), total_points: total_points } end end # 按总积分降序排序 sorted_combinations = valid_combinations.sort_by { |c| -c[:total_points] } # 输出表格格式结果 puts "| 排名 | 车队名称 | 车手组合(首位为积分翻倍车手) | 总花费 | 总积分 |" puts "|------|----------|--------------------------------|--------|--------|" sorted_combinations.each_with_index do |comb, idx| puts "| #{idx+1} | #{comb[:team]} | #{comb[:drivers].join(' / ')} | #{comb[:total_cost]} | #{comb[:total_points]} |" end
代码解释
- 数据源模拟:定义了车队和车手的基础数据,包含名称、花费、积分三个核心字段
- 组合筛选:通过
combination(3)生成所有3名车手的组合,结合车队花费判断是否符合预算 - 车手调整与积分计算:用
max_by找出积分最高的车手,重组车手列表后计算总积分(顶级车手积分翻倍) - 排序与输出:按总积分降序排列后,用Markdown表格格式打印结果
内容的提问来源于stack exchange,提问作者ldthompson
相关产品推荐
相关产品推荐

