Рассчитать 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.

Поэтому счет для игрока - это их ожидаемый шанс выиграть какой-то матч в десятичном виде.

Ваша программа / функция должна принимать 2 входа: ELO игрока A и ELO игрока B и печатать / возвращать их соответствующий шанс на победу в десятичном формате. Выходные данные должны быть в сумме равны единице, и вы должны быть с точностью не менее 5 десятичных знаков ( 0.00000). После 5 десятичных разрядов у вас могут быть неточные цифры, при условии, что два выхода все равно складываются в один.

Примеры:

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, но это хорошо, потому что это после пяти десятичных разрядов, и выходные данные все равно складываются в один.

Это пример неверного вывода:

9999 9998 -> 0.5014391117091516, 0.49856088829084844

Это выглядит так, как будто это удовлетворяет требованиям на первый взгляд, но цифры суммируются 1.00000000000000004и, следовательно, выходные данные не действительны.

Конечные нули на выходе - это нормально.

Вы можете предположить, что ELO игрока всегда будет больше 0, и никто не будет иметь ELO выше 9999.

Формат ввода и вывода гибкий, но вход и выход все еще должны быть в базе 10.

Поскольку это , победит ответ с самым низким количеством байтов!


1
+1 за рейтинг ELO, хотя я был разочарован, обнаружив, что вы говорите о чем-то, что называется рейтингом Эло.
Даррен Рингер

Вы также должны добавить тестовый пример, для [9999, 998]которого большинство ответов, кажется, не дают результатов.
Emigna

@Emigna добавил, но сделал его более экстремальным;)
Okx

@Okx: Отлично. Нужно вернуться к чертежной доске, чтобы справиться с этим :)
Emigna

Кажется, что все ответы терпят неудачу, 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

@Metoniem Это странно ... это определенно связано с проблемами округления, или, может быть, как-то так 0.1 + 0.2 = 0.30000000000000004. Я посмотрю на это
Business Cat

теперь все выглядит нормально, все ответы, включая калькулятор 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

@Metoniem Да. Скорее всего, связано с тем, как плавает C-раундов. : / Я смотрю на это.
Р. Кап

Это на самом деле кажется правильным, контрольный пример может быть недействительным :(
Metoniem

1

JavaScript (ES7), 41 35 байт

Сохранено 6 байтов благодаря @Neil

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].
Нил

@ Нил Правда? Я так близорука: P Спасибо!
ETHproductions

0

Язык макросов SAS, 70 байт

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

Выходные данные - это набор данных SAS, где переменные pи qшансы игроков на победу. 11 байт можно сохранить, удалив printпроцедуру.


0

C #, 92 байта

Не самый короткий, но это C #, никогда не самый короткий ..

Golfed

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

Ungolfed

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.