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
相关产品推荐
相关产品推荐

