计算ELO等级预期分数


11

您的任务是计算某些游戏中两名玩家的预期获胜机会,每个玩家都有自己的ELO评分。玩家A有ELO R a,玩家B有ELO R b

玩家A的预期得分(E a)为:1 /(1 + 10 (R b -R a)/ 400)。玩家B(E b)有一个类似的方程:1 /(1 + 10 (R a -R b)/ 400)。

如果您想要一个更可复制的版本: 1 / (1 + 10^((a-b) / 400))

E a + E b应该等于1。

因此,玩家的分数是他们赢得比赛的预期机会(以十进制表示)。

您的程序/功能应采用2个输入,即玩家A的ELO和玩家B的ELO,并打印/返回它们各自以十进制格式获胜的机会。输出必须加一,并且您必须精确到至少5个小数位(0.00000)。小数点后5位后,如果两个输出仍加起来为1,则您的数字可能不正确。

例子:

1200 2100 -> 0.005591967 0.994408033
1 1 -> 0.5 0.5
60 20 -> 0.557312 0.442688
9999 9998 -> 0.501439 0.498561
9999 1 -> 0.999999 0.000001

在最终测试用例中,一些答案使用科学的幂表示值。这是无效的。

您可以在此处的测试用例3中看到0.557312不太准确,因为2应当是a 1,但这很好,因为它在小数点后五位并且输出仍加起来为1。

这是无效输出的示例:

9999 9998 -> 0.5014391117091516, 0.49856088829084844

乍一看似乎满足要求,但是数字加起来等于0 1.00000000000000004,因此输出无效。

在输出中尾随零即可。

您可以假设玩家的ELO始终大于0,并且没有人的ELO大于9999。

输入和输出格式很灵活,但是输入和输出必须仍然以10为底。

因为这是,所以具有最低字节数的答案将获胜!


1
ELO等级为+1,即使我很失望地发现您在谈论Elo等级。
达伦·林格

您还应该添加[9999, 998]大多数答案似乎都无法解决的测试用例。
Emigna '17

@Emigna添加了,但变得更加极端了;)
Okx

@Okx:很好。需要回到制图板上来处理那个问题:)
Emigna

似乎所有答案都9999, 1包括我自己的所有答案都失败了,所以我不能发布它:-(
Metoniem

Answers:


5

果冻,9字节

÷400⁵*÷S$

在线尝试!查看所有测试用例。

输入是一个数组[Ra, Rb],输出是一个数组[Ea, Eb]

说明

÷400⁵*÷S$  Input: array [Ra, Rb]
÷400       Divide each by 400, makes [Ra/400, Rb/400]
    ⁵*     Raise 10 to that power, makes [10^(Ra/400), 10^(Rb/400)]
        $  Monadic chain operating on previous result
      ÷      Divide each by
       S     The sum of the whole
           Makes [10^(Ra/400)/(10^(Ra/400) + 10^(Rb/400)),
                  10^(Rb/400)/(10^(Ra/400) + 10^(Rb/400))]
               = [1/(1 + 10^((Rb-Ra)/400)), 1/(1 + 10^((Ra-Rb)/400))]


@Okx这是科学计数法。我确定您知道这是什么,因为您最初只是说输入/输出格式由我们决定之后才编辑挑战以要求标准符号。
英里

您是否看过其他输出?是1.0!
Okx


3

MATL,11个字节

10i400/^ts/

将输入作为列表并输出列表。

10       % push number literal
i        % push input
400      % push number literal
/        % divide the list (by 400)
^        % power (10^list, element wise)
t        % duplicate the list
s        % sum the second one
/        % divide by the sum
         % (implicit) convert to string and display

1

CJam,23个字节

XAq~_W%\.m400df/f#:)f/p

其他一些23字节的解决方案:

q~_W%\.m400df{/A\#)W#}p
Aq~_W%\.m400df/f{#)W#}p

在线尝试!

说明

X                        Push 1
 A                       Push 10
  q~                     Push an eval the input, a list containing 2 numbers
    _W%                  Duplicate the list and reverse it
       \                 Swap top stack elements, so the order of answers matches the input
        .m               Vectorized subtraction: computes Ra - Rb and Rb - Ra
          400d           Push 400.0 (must be a double, otherwise / performs integer division)
              f/         Divide both values by 400
                f#       Raise 10 to the power of both numbers
                  :)     Increment both numbers
                    f/   Divide 1 by both numbers
                      p  Output the list nicely

失败:9999, 1
Metoniem

@Metoniem这很奇怪...它肯定与舍入问题有关,或者也许与之有关0.1 + 0.2 = 0.30000000000000004。我会考虑它
商务猫

现在看起来确实不错,所有答案(包括Google的计算器)都返回与您的代码相同的结果。我很确定测试用例无效:(
Metoniem

1

C,63字节

#define M(a,b)1/(1+pow(10,(a-b)/400.)),1/(1+pow(10,(b-a)/400.))

定义了一个(相当简单的)参数化宏M,这是我能想到的最短的工作方法,但可能仍然不是最短的。这样,任何打高尔夫球的建议都会受到赞赏。

无论如何,这将分别返回2个浮点值E_bE_a

在线尝试!


失败9999, 1
-Metoniem

@Metoniem是的。最可能与C轮的浮动方式有关。:/我正在研究它。
R. Kap

实际上似乎是正确的,测试用例可能无效:(
Metoniem

1

JavaScript(ES7),41 35字节

@Neil节省了6个字节

a=>b=>[b=1/(1+10**((b-a)/400)),1-b]

由于Ea + Eb = 1,所以只写a=>b=>[b=1/(1+10**((b-a)/400)),1-b]
尼尔

@Neil真的吗?我是如此近视:P谢谢!
ETHproductions'2

0

SAS宏语言,70字节

%macro e(a,b);data t;p=1/(1+10**((&b-&a)/400));q=1-p;proc print%mend;

输出是SAS数据集,其中变量pq是玩家获胜的机会。删除该print步骤可以节省11个字节。


0

C#,92个字节

不是最短的,但它是C#,从不最短。

打高尔夫球

   static double[]f(int a,double b){b=1/(1+System.Math.Pow(10,(a-b)/400d));return new[]{1-b,b};

不打高尔夫球

static double[] f(int a, double b)
{
    b = 1/(1 + System.Math.Pow(10, (a - b)/400d));
    return new[] {1 - b, b};
}

0

q,26个字节

{1%1+10 xexp(y-x;x-y)%400}

q){1%1+10 xexp(y-x;x-y)%400}[1200;2100]
0.0055919673088347735 0.99440803269116518
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.