ELO評価の予想スコアを計算する


11

あなたの仕事は、あるゲームで2人のプレイヤーがそれぞれの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に等しくなければなりません。

したがって、プレーヤーのスコアは、ある試合に勝つと予想される10進数のチャンスです。

プログラム/関数は、プレイヤーAのELOとプレイヤーBのELOの2つの入力を受け取り、それぞれのチャンスを10進形式で印刷/返します。出力合計で1つでなければならず、少なくとも小数点以下5桁まで正確である必要があります(0.00000)。小数点以下5桁を超えると、2つの出力の合計が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 では、がa で0.557312ある2必要があるため、あまり正確ではありませんが、1小数点以下5桁であり、出力が1になるため、これは問題ありません。

これは無効な出力の例です:

9999 9998 -> 0.5014391117091516, 0.49856088829084844

これは一見要件を満たしているように見えますが、数字が合計される1.00000000000000004ため、出力は無効です。

出力の末尾のゼロは問題ありません。

プレイヤーのELOは常に0より大きく、だれも9999を超えるELOを持たないと想定できます。

入力と出力の形式は柔軟ですが、入力と出力は10進数のままでなければなりません。

これはであるため、バイトカウントが最小の答えが勝ちます!


1
代わりにEloレーティングと呼ばれるものについて話していることに失望しましたが、ELOレーティングについては+1です。
ダレンリンガー

また、[9999, 998]ほとんどの回答が失敗したと思われるテストケースを追加する必要があります。
エミグナ

@Emignaが追加しましたが、もっと極端にしました;)
Okx

@Okx:いいね。図面ボードに戻ってその1つを処理する必要があります:)
エミグナ

9999, 1私自身も含めてすべての回答が失敗するようですので、投稿できません:-(
Metoniem

回答:


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それは奇妙です...それは間違いなく丸めの問題、または多分方法のような何かに関係しています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_bを返しますE_a

オンラインでお試しください!


失敗9999, 1
メトニエム

@Metoniemうん。ほとんどの場合、Cが浮動小数点を丸める方法に関係しています。:/調べています。
R.ガプス

それは実際に正しいようです、テストケースは無効かもしれません:(
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

0

SASマクロ言語、70バイト

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

出力は、変数pqあり、プレイヤーが勝つチャンスであるSASデータセットです。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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.