如何在 Ruby 中对世界杯小组表进行排序

2024-03-27

我正在编写一种算法来根据比赛数据创建世界杯小组表并对其进行排序。因此,给出以下匹配数据:

[
  { id: 1, home_team: "Honduras", away_team: "Chile", home_score: 0, away_score: 1 },
  { id: 2, home_team: "Spain", away_team: "Switzerland", home_score: 0, away_score: 1 },
  { id: 3, home_team: "Chile", away_team: "Switzerland", home_score: 1, away_score: 0 },
  { id: 4, home_team: "Spain", away_team: "Honduras", home_score: 2, away_score: 0 },
  { id: 5, home_team: "Chile", away_team: "Spain", home_score: 1, away_score: 2 },
  { id: 6, home_team: "Honduras", away_team: "Switzerland", home_score: 0, away_score: 0 }
]

我的程序将产生这个(顺序很重要):

[{ goals_for: 4, goals_against: 2, goal_diff: 2,  points: 6, name: "Spain" },
 { goals_for: 3, goals_against: 2, goal_diff: 1,  points: 6, name: "Chile" },
 { goals_for: 1, goals_against: 1, goal_diff: 0,  points: 4, name: "Switzerland" },
 { goals_for: 0, goals_against: 3, goal_diff: -3, points: 1, name: "Honduras" }]

这很好,除非存在双向或三向平局。那么标准就变得复杂了。这里按优先顺序排列:

  1. 最大点数
  2. 最大进球差距
  3. Greatest goals for
    • 如果有平局,则使用以下内容
  4. 平局球队之间的比赛中最多得分
  5. 平局球队之间比赛的最大进球差异
  6. 平局球队之间比赛的最大进球数
  7. 抽签

Question

我的排序函数满足前三个标准。我如何更改它以考虑存在双向或三向关系的情况?

  def sort
    teams.sort_by! do |team|
      [ team[:points], team[:goal_diff], team[:goals_for] ]
    end.reverse!
  end

3 向领带示例

[
  { id: 1, home_team: "Algeria", away_team: "Slovenia", home_score: 2, away_score: 1 },
  { id: 2, home_team: "USA", away_team: "Slovenia", home_score: 5, away_score: 1 },
  { id: 3, home_team: "England", away_team: "Slovenia", home_score: 4, away_score: 0 },
  { id: 4, home_team: "Algeria", away_team: "USA", home_score: 3, away_score: 0 },
  { id: 5, home_team: "USA", away_team: "England", home_score: 2, away_score: 0 },
  { id: 6, home_team: "England", away_team: "Algeria", home_score: 3, away_score: 2 }
]

此示例将根据标准 1(分)淘汰斯洛文尼亚。

其余三队的排名则根据subset的比赛数据。该子集应仅包括平局球队之间的比赛。在这种情况下,我们将使用包括阿尔及利亚、英格兰和美国在内的所有比赛重建表格。我们排除涉及斯洛文尼亚的比赛。

该表应如下所示:

| POS | TEAM        | GF | GA | GD | POINTS |
| 1   | Algeria     | 5  | 3  |  2 | 3      |
| 3   | England     | 3  | 4  | -1 | 3      |
| 2   | USA         | 2  | 3  | -1 | 3      |

阿尔及利亚凭借净胜球获胜(标准 5)。英格兰位居第二是因为goals for高于美国(标准 6)。

我的程序实际上输出了这个,这是不正确的,因为它没有对关系做任何事情,并在标准 3 处停止。

[ { goals_for: 7, goals_against: 4, goal_diff: 3, points: 6, name: "England" },
  { goals_for: 7, goals_against: 4, goal_diff: 3, points: 6, name: "Algeria" },
  { goals_for: 7, goals_against: 4, goal_diff: 3, points: 6, name: "USA" },
  { goals_for: 2, goals_against: 11, goal_diff: -9, points: 0, name: "Slovenia" }]

这是完整的程序:

class Calculator
  attr_reader :games, :teams

  def initialize(games)
    defaults = { goals_for: 0, goals_against: 0, goal_diff: 0, points: 0 }
    @games = games
    @teams = games.each_with_object([]) do |game, arr|
      arr.push({ name: game[:home_team] }.merge!(defaults))
      arr.push({ name: game[:away_team] }.merge!(defaults))
    end.uniq
  end

  def build_table
    build
    sort
    return teams
  end

private

  def build
    games.each do |game|
      if game[:home_score].present? && game[:away_score].present?
        home_team = teams.detect { |team| team[:name] == game[:home_team] }
        away_team = teams.detect { |team| team[:name] == game[:away_team] }

        home_team[:goals_for]     += game[:home_score]
        home_team[:goals_against] += game[:away_score]

        away_team[:goals_for]     += game[:away_score]
        away_team[:goals_against] += game[:home_score]

        home_team[:goal_diff] = home_team[:goals_for] - home_team[:goals_against]
        away_team[:goal_diff] = away_team[:goals_for] - away_team[:goals_against]

        if game[:home_score] > game[:away_score]
          home_team[:points] += 3
        elsif game[:home_score] < game[:away_score]
          away_team[:points] += 3
        else
          home_team[:points] += 1
          away_team[:points] += 1
        end
      end
    end
  end

  def sort
    teams.sort_by! { |team| [ team[:points], team[:goal_diff], team[:goals_for] ] }.reverse!
  end
end

您有一组明确定义的规则来确定团队的排序方式。一种方法是编写一个排序例程,一次执行一个规则,并在找到获胜者时进行短路:

def compare_points(a, b)
  a[:points] <=> b[:points]
end

def compare_goal_diff(a, b)
  a[:goal_diff] <=> b[:goal_diff]
end

def compare_teams(a, b)
  comparison = compare_points(a, b)
  return comparison unless comparison.zero?

  comparison = compare_goal_diff(a, b)
  return comparison unless comparison.zero?
  # Repeat for each type of comparison
  # ...
  comparison.zero? ? flip_coin : comparison
end

teams.sort! { |a, b| compare_teams(a, b) }.reverse!

比较单个值(如点)时,比较运算符<=>足够。对于更复杂的比较,您需要深入研究@games数组来确定获胜者,例如:

  def compare_points_from_matches_between(a, b)
    # Hand-waving follows
    # case
    # when team A has fewer points than team B in their meetings
    #   -1
    # when team B has fewer points than team A in their meetings
    #   1
    # else
    #   0
    # end
  end

根据您的规则应用每个比较。在每个步骤中,如果比较非零,则返回该值;否则您将继续下一步。最后,如果比较仍然为零,则掷硬币。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ruby 中对世界杯小组表进行排序 的相关文章

随机推荐

  • 如何使用自定义比较器对通用列表进行排序?

    我有点像 Delphi 新手 我不明白如何调用 TList of Records 的 Sort 方法以便按升序整数值对记录进行排序 我有一个类似如下的记录 type TMyRecord record str1 string str2 str
  • 音频音量标准化时的动态范围压缩[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经问过音量标准化 https stackoverflow com questions 12481524 audio volume
  • 向平静图添加颜色条

    这是我在此的头一篇博文 我正在使用 calmap 绘制漂亮的日历图来分析一些数据 日历图使用颜色图来显示日期之间的对比 我遇到的问题是 calmap 没有提供友好的工具来显示与日历图相关的颜色条 我想知道你们中是否有人能解决这个问题 理想的
  • Google Cloud Endpoint 不断抛出“意外的流结束”异常

    有谁知道为什么 Google Cloud Endpoint 不断抛出异常unexpected end of stream甚至在我的应用程序引擎实例实际到达之前就出现异常 当我调用端点时 我不断收到以下错误 在大多数地方 错误会在每次其他调用
  • 在一张图中绘制多个箱线图

    我将数据保存为 csv文件有 12 列 第 2 列到第 11 列 标记为F1 F2 F11 are features Column one包含label这些功能要么good or bad 我想绘制一个boxplot of 所有这 11 个功
  • MuiThemeProvider.render():必须返回有效的 React 元素(或 null)

    我正在使用 Material UI 和 React 来创建一个下拉菜单 如果我将下拉组件保留在我的src app js一切都呈现良好 但是 如果我将其移至单独的文件中 fruits js我收到以下错误 MuiThemeProvider re
  • 包装递归函数总是一个好的做法吗?

    我正在使用递归函数来计算从一个节点开始到另一个给定的一组规则 例如 最小 最大 确切的停止次数 的图表中可能的遍历次数 我想知道调用调用递归函数而不是直接调用它的包装函数是否是一个好习惯 大多数时候我看到人们使用包装函数 只是想知道为什么以
  • 在与 WebPack 捆绑在一起的 Visual Studio 中调试 JavaScript 代码

    我是 JS 开发新手 在 Visual Studio 2013 中调试 JS 代码时遇到问题 我们的 Web 应用程序的 JS 部分由 WebPack 捆绑到单个 app bundle js 文件中 每次任何 js 文件更改时 该文件都会自
  • 关于 .Equals() 与 == 运算符以及基元与对象比较的混淆

    考虑这段代码 int a 0 short b 0 int c 0 object a1 a object b1 b object c1 c Console WriteLine 1 comparing primitives int vs sho
  • 有什么好的 javascript 库可以实现跨浏览器和打印机友好的页面吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Karma 用于自动用户交互测试?

    我正在测试一个设置Karma http karma runner github io Mocha http visionmedia github io mocha 其中一件事是这个可能 要做的是在各种浏览器上测试用户交互 包括Phantom
  • QT-creator 中架构 x86_64 的未定义符号

    我刚刚开始使用 C 正在学习如何使用 QT 创建者作为 IDE 所以我怀疑这可能非常简单 但我可能会遗漏一些东西 我安装了apollo MQ并安装了apache CMS C 消息服务 http activemq apache org cms
  • 访问链接后,Firefox 有选择地跳过状态更改或 a:visited 样式

    单击具有常见 href 的链接 本地页面或网站 后 并且href加载成功 FF2和IE7都会显示 带有 a visited 样式的链接 对于带有 href javascript anyfunc 的链接 IE7 的工作方式如上 而 FF2 不
  • 比较两个数据库之间的数据模型的选项?

    我需要确定 2 个数据库之间的数据模型差异 DB1 和 DB2 我需要一种方法来识别丢失 额外的数据库对象和命名差异 您是否可以推荐用于此目的的 sproc 或免费工具 要比较两个数据库架构 您可以使用 Visual Studio 2015
  • 具有平方像素的 ImageView(无插值)

    我有一个 9X11 像素的位图 代表一个迷宫 路径为绿色 墙壁为黑色 开始为橙色 结束为蓝色 它的矩阵是 int map new int 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 0
  • 将数字字段中带有逗号的数据导入到 redshift 中

    我正在使用 SQL 将数据导入 redshiftCOPY陈述 数据在数字字段中包含逗号千位分隔符COPY声明拒绝 The COPY语句有许多选项来指定字段分隔符 日期和时间格式以及 NULL 值 但是我没有看到任何指定数字格式的内容 我是否
  • ExpressJS 服务器 - 如何处理多个域

    我在 Express 上闲逛了一下 我想知道 最正确 的方法是处理链接到同一服务器的多个域 假设我们有 foo com bar net baz com 这一切都指向111 222 333 444 该机器正在运行 NodeJS 和 Expre
  • ClickOnce 无法在 Internet Explorer 9 中运行

    My 单击一次 http en wikipedia org wiki ClickOnce部署曾经完美地工作 但它在 Internet Explorer 9 中停止工作 它只显示桌面应用程序XML 文件 它仍然有效谷歌浏览器 http en
  • “bundle exec rake db:migrate”有什么作用?

    根据我的研究 bundle exec 负责在包的上下文中执行命令 无论如何 我还不太明白它对于命令的作用有何不同rake db migrate与相比bundle exec rake db migrate 例如 在我的例子中 我执行了第一个命
  • 如何在 Ruby 中对世界杯小组表进行排序

    我正在编写一种算法来根据比赛数据创建世界杯小组表并对其进行排序 因此 给出以下匹配数据 id 1 home team Honduras away team Chile home score 0 away score 1 id 2 home