Ваша задача - рассчитать ожидаемый шанс на победу для 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.
Поскольку это код-гольф , победит ответ с самым низким количеством байтов!
[9999, 998]
которого большинство ответов, кажется, не дают результатов.9999, 1
включая мой собственный, поэтому я не могу опубликовать его :-(Ответы:
Желе , 9 байт
Попробуйте онлайн! или просмотреть все контрольные примеры.
Входные данные - это массив,
[Ra, Rb]
а выходные данные - это массив[Ea, Eb]
.объяснение
источник
Python 3,
5547 байт-8 байт благодаря @math_junkie
источник
1/(1+10**(x/400))for x in [b-a,a-b]
MATL, 11 байт
Принимает ввод как список и выводит список.
источник
CJam , 23 байта
Некоторые другие 23-байтовые решения:
Попробуйте онлайн!
объяснение
источник
9999, 1
:(0.1 + 0.2 = 0.30000000000000004
. Я посмотрю на этоC, 63 байта
Определяет (довольно наивный) параметризованный макрос
M
, самый короткий рабочий подход, о котором я мог подумать, но, вероятно, все еще не самый короткий. Таким образом, любые предложения по гольфу очень ценятся.В любом случае, это возвращает 2 значения с плавающей запятой,
E_b
иE_a
, соответственно.Попробуйте онлайн!
источник
9999, 1
JavaScript (ES7),
4135 байтСохранено 6 байтов благодаря @Neil
источник
a=>b=>[b=1/(1+10**((b-a)/400)),1-b]
.Язык макросов SAS, 70 байт
Выходные данные - это набор данных SAS, где переменные
p
иq
шансы игроков на победу. 11 байт можно сохранить, удаливprint
процедуру.источник
C #, 92 байта
Не самый короткий, но это C #, никогда не самый короткий ..
Golfed
Ungolfed
источник
q, 26 байтов
пример
источник