You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby实现F1梦幻车队组合:限定1车队+5车手的求和筛选

问题解决方案

一、实现1支车队+5名车手的组合筛选逻辑

要满足「1支车队 + 5名车手,总价格≤20」的规则,核心是用Ruby的combination方法生成车手的5人组合,再结合每个车队计算总价筛选。具体代码实现如下:

示例代码

require 'net/http'
require 'json'

@url = 'HIDDEN URL AS HAS NO RELEVANCE'
@uri = URI(@url)
@response = Net::HTTP.get(@uri)
@fantasy = JSON.parse(@response)

# 从API数据中拆分车队和车手价格(可根据实际API结构调整分类规则)
data = @fantasy.first
# 定义车队名称集合(后续新增车队只需在此添加)
team_names = ["Mercedes", "Ferrari"]
# 提取车队价格并转为浮点数
team_prices = data.slice(*team_names).values.map(&:to_f)
# 提取车手价格(排除车队后的剩余数据)并转为浮点数
driver_prices = data.except(*team_names).values.map(&:to_f)

target_budget = 20
valid_combinations = []

# 遍历每个车队,生成5名车手的所有组合并筛选总价
team_prices.each do |team_price|
  driver_prices.combination(5) do |driver_group|
    total_cost = team_price + driver_group.sum
    valid_combinations << [team_price, *driver_group] if total_cost <= target_budget
  end
end

# 输出符合条件的组合
p valid_combinations

代码说明

  • slice(*team_names):从API数据中批量提取指定车队的价格,避免手动逐个键取值;
  • except(*team_names):自动提取所有车手的价格,新增车手无需修改代码;
  • combination(5):生成车手列表中所有不重复的5人组合;
  • 遍历车队+组合求和:对每个车队+车手组合计算总价,仅保留≤20的结果。

二、手动存入Array是否为最优方式?

不是最优方式,手动硬编码键名(如@fantasy.first["Mercedes"])的扩展性极差,新增车队/车手都需要修改代码。更优的实现方式如下:

优化方向

  • 结构化分类数据:如果API返回的本身就有teams和drivers的分层结构,直接按结构提取即可;
  • 维护可扩展的分类集合:像示例中定义team_names数组,新增车队只需在集合中添加名称,无需修改数据提取逻辑;
  • 模块化封装逻辑:将数据获取、分类、筛选拆分为独立方法,代码更易维护和修改;
  • 统一数值转换:用map(&:to_f)批量转换价格类型,不用逐个处理每个键的值。

优化后的模块化示例

require 'net/http'
require 'json'

# 可扩展的车队名称集合
TEAM_NAMES = ["Mercedes", "Ferrari", "Red Bull", "McLaren"]

def fetch_fantasy_data(url)
  uri = URI(url)
  response = Net::HTTP.get(uri)
  JSON.parse(response).first
end

def parse_teams_and_drivers(data)
  team_prices = data.slice(*TEAM_NAMES).values.map(&:to_f)
  driver_prices = data.except(*TEAM_NAMES).values.map(&:to_f)
  [team_prices, driver_prices]
end

def find_valid_lineups(teams, drivers, budget)
  valid_lineups = []
  teams.each do |team|
    drivers.combination(5) do |drivers_group|
      valid_lineups << [team, *drivers_group] if team + drivers_group.sum <= budget
    end
  end
  valid_lineups
end

# 主流程
url = 'HIDDEN URL AS HAS NO RELEVANCE'
data = fetch_fantasy_data(url)
teams, drivers = parse_teams_and_drivers(data)
valid_lineups = find_valid_lineups(teams, drivers, 20)

p valid_lineups

内容的提问来源于stack exchange,提问作者Liam Thompson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:40:26