Oblicz oczekiwaną ocenę ELO

11

Twoim zadaniem jest obliczenie oczekiwanej szansy wygranej dla 2 graczy w każdej grze, każdy z własną oceną ELO . Gracz A ma ELO R a, a gracz B ma ELO R b

Oczekiwany wynik dla Gracza A (E a ) to: 1 / (1 + 10 (R b - R a ) / 400 ). Podobne jest równanie dla Gracza B (E b ): 1 / (1 + 10 (R a - R b ) / 400 ).

Jeśli chcesz wersji do skopiowania: 1 / (1 + 10^((a-b) / 400))

E a + E b powinny być równe 1.

Dlatego wynikiem dla gracza jest spodziewana szansa na wygraną w części dziesiętnej.

Twój program / funkcja powinna przyjąć 2 dane wejściowe, ELO Gracza A i ELO Gracza B, i wydrukować / zwrócić odpowiednią szansę na wygraną w formacie dziesiętnym. Dane wyjściowe muszą się sumować do jednego, a dokładność musi wynosić co najmniej 5 miejsc po przecinku ( 0.00000). Po 5 miejscach dziesiętnych możesz mieć niedokładne cyfry, pod warunkiem, że dwa wyjścia nadal będą sumować się do jednego.

Przykłady:

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

W ostatnim przypadku testowym niektóre odpowiedzi wykorzystują potęgowanie naukowe w celu przedstawienia wartości. To nie jest poprawne.

Możesz zobaczyć tutaj przypadek testowy 3, który 0.557312nie jest całkiem dokładny, ponieważ 2powinien być a 1, ale jest w porządku, ponieważ jest po pięciu miejscach dziesiętnych, a wyniki wciąż sumują się do jednego.

To jest przykład niepoprawnego wyjścia:

9999 9998 -> 0.5014391117091516, 0.49856088829084844

Wygląda na to, że spełnia wymagania na pierwszy rzut oka, ale liczby się sumują 1.00000000000000004i dlatego wynik nie jest prawidłowy.

Końcowe zera w danych wyjściowych są w porządku.

Możesz założyć, że ELO gracza będzie zawsze większe od 0 i nikt nie będzie miał ELO wyższego niż 9999.

Format wejściowy i wyjściowy jest elastyczny, ale dane wejściowe i wyjściowe muszą nadal znajdować się w bazie 10.

Ponieważ jest to , wygrywa odpowiedź o najniższej liczbie bajtów!

Okx
źródło
1
+1 za ocenę ELO, mimo że byłem rozczarowany tym, że mówisz o czymś o nazwie ocena Elo.
Darren Ringer
Należy również dodać przypadek testowy, dla [9999, 998]którego większość odpowiedzi wydaje się nieudana.
Emigna
@Emigna dodaje, ale uczyniło to bardziej ekstremalnym;)
Okx
@Okx: Nicea. Musisz wrócić do deski kreślarskiej, aby sobie z tym poradzić :)
Emigna
Wygląda na to, że wszystkie odpowiedzi zawodzą, w 9999, 1tym moje, więc nie mogę tego opublikować :-(
Metoniem

Odpowiedzi:

5

Galaretka , 9 bajtów

÷400⁵*÷S$

Wypróbuj online! lub Wyświetl wszystkie przypadki testowe.

Dane wejściowe to tablica, [Ra, Rb]a dane wyjściowe to tablica [Ea, Eb].

Wyjaśnienie

÷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))]
mile
źródło
@Okx To jest notacja naukowa. Jestem pewien, że wiesz, co to jest, ponieważ właśnie edytowałeś wyzwanie wymagające standardowej notacji po tym, jak początkowo powiedziałeś, że format wejścia / wyjścia zależy od nas.
mile
Czy spojrzałeś na inne wyjście? To 1.0!
Okx
3

Python 3, 55 47 bajtów

lambda a,b:[1/(1+10**(x/400))for x in[b-a,a-b]]

-8 bajtów dzięki @math_junkie

Trelzevir
źródło
Dlaczego nie wykorzystać do zrozumienia:1/(1+10**(x/400))for x in [b-a,a-b]
ćpun matematyki
@math_junkie Nazywa się to „ rozumieniem listy
mbomb007
3

MATL, 11 bajtów

10i400/^ts/

Pobiera dane wejściowe jako listę i wyświetla listę.

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
B. Mehta
źródło
1

CJam , 23 bajty

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

Inne 23 bajtowe rozwiązania:

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

Wypróbuj online!

Wyjaśnienie

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
Business Cat
źródło
Nie 9999, 1
działa
@Metoniem To dziwne ... to na pewno ma coś wspólnego z problemami z zaokrąglaniem, a może coś w rodzaju 0.1 + 0.2 = 0.30000000000000004. Przyjrzę się temu
Business Cat
teraz wygląda dobrze, WSZYSTKIE odpowiedzi, w tym kalkulator Google, zwracają ten sam wynik co kod. Jestem pewien, że przypadek testowy jest nieprawidłowy :(
Metoniem
1

C, 63 bajty

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

Definiuje (raczej naiwne) sparametryzowane makro M, najkrótsze działające podejście, jakie mogłem wymyślić, ale prawdopodobnie nadal nie najkrótsze. Jako takie, wszelkie sugestie dotyczące gry w golfa są bardzo mile widziane.

W każdym razie zwraca 2 wartości zmiennoprzecinkowe E_bi E_aodpowiednio.

Wypróbuj online!

R. Kap
źródło
Nie 9999, 1
działa
@Metoniem Yup. Najprawdopodobniej ma to związek z pływaniem pocisków C. : / Patrzę na to.
R. Kap
Właściwie wydaje się być poprawny, przypadek testowy może być nieprawidłowy :(
Metoniem
1

JavaScript (ES7), 41 35 bajtów

Zaoszczędź 6 bajtów dzięki @Neil

a=>b=>[b=1/(1+10**((b-a)/400)),1-b]
ETHprodukcje
źródło
Ponieważ Ea + Eb = 1, po prostu napisz a=>b=>[b=1/(1+10**((b-a)/400)),1-b].
Neil
@Neil Naprawdę? Jestem taki krótkowzroczny: P Dzięki!
ETHprodukcje
0

SAS Macro Language, 70 bajtów

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

Dane wyjściowe to zestaw danych SAS, w którym zmienne pi qszanse graczy na wygraną. 11 bajtów można zapisać, usuwając printprocedurę.

J_Lard
źródło
0

C #, 92 bajty

Nie najkrótszy, ale C #, nigdy najkrótszy ..

Grał w golfa

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

Nie golfił

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

q, 26 bajtów

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

Przykład

q){1%1+10 xexp(y-x;x-y)%400}[1200;2100]
0.0055919673088347735 0.99440803269116518
skeevey
źródło