Calcular pontuação esperada da classificação ELO


11

Sua tarefa é calcular a chance esperada de ganhar para 2 jogadores em algum jogo, cada um com sua própria classificação ELO . O jogador A tem ELO R a e o jogador B tem ELO R b

A pontuação esperada para o jogador A (E a ) é: 1 / (1 + 10 (R b - R a ) / 400 ). Há uma equação semelhante para o jogador B (E b ): 1 / (1 + 10 (R um - R b ) / 400 ).

Se você deseja uma versão mais copiável: 1 / (1 + 10^((a-b) / 400))

E a + E b deve ser igual a 1.

Portanto, a pontuação de um jogador é a chance esperada de ganhar alguma partida, em decimal.

Seu programa / função deve receber 2 entradas, ELO do Jogador A e ELO do Jogador B, e imprimir / retornar sua respectiva chance de ganhar no formato decimal. A saída deve somar uma e você precisa ter pelo menos 5 casas decimais ( 0.00000). Depois de 5 casas decimais, você pode ter dígitos imprecisos, desde que as duas saídas ainda somam uma.

Exemplos:

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

No caso de teste final, algumas respostas usam exponenciação científica para representar o valor. Isto não é válido.

Você pode ver aqui no caso de teste 3 que 0.557312não é muito preciso, porque 2deveria ser um 1, mas isso é bom porque ocorre depois de cinco casas decimais e as saídas ainda somam uma.

Este é um exemplo de saída inválida:

9999 9998 -> 0.5014391117091516, 0.49856088829084844

Parece que ele satisfaz os requisitos à primeira vista, mas os números somam 1.00000000000000004e, portanto, a saída não é válida.

Os zeros à direita na saída estão corretos.

Você pode presumir que a ELO de um jogador sempre será maior que 0 e que ninguém terá uma ELO maior que 9999.

O formato de entrada e saída é flexível, mas a entrada e a saída ainda devem estar na base 10.

Como se trata de , a resposta com a menor contagem de bytes vencerá!


1
+1 para a classificação ELO, mesmo que eu tenha ficado desapontado ao descobrir que você está falando de algo chamado classificação Elo.
Darren campainha

Você também deve adicionar o caso de teste para o [9999, 998]qual a maioria das respostas parece falhar.
Emigna

@Emigna adicionado, mas tornou mais extrema;)
Okx

@ Ok: Nice. Necessidade de voltar à prancheta de desenho para lidar com isso um :)
Emigna

Parece todas as respostas falhar em 9999, 1incluindo o meu, então eu não posso postá-lo :-(
Metoniem

Respostas:


5

Geléia , 9 bytes

÷400⁵*÷S$

Experimente online! ou Exibir todos os casos de teste.

A entrada é uma matriz [Ra, Rb]e a saída é uma matriz [Ea, Eb].

Explicação

÷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))]


@ Ok Essa é uma notação científica. Tenho certeza de que você sabe o que é, pois você acabou de editar o desafio para exigir notação padrão depois que originalmente disse que o formato de entrada / saída era nosso.
miles

Você olhou para a outra saída? É 1.0!
Okx 22/02


3

MATL, 11 bytes

10i400/^ts/

Pega entrada como uma lista e gera uma lista.

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 bytes

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

Algumas outras soluções de 23 bytes:

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

Experimente online!

Explicação

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

Falha no 9999, 1:(
Metoniem 22/02

@ Metoniem Isso é estranho ... definitivamente tem algo a ver com questões de arredondamento, ou talvez algo como como 0.1 + 0.2 = 0.30000000000000004. Vou dar uma olhada nele #
Business Cat

agora parece ótimo, TODAS as respostas, incluindo a calculadora do Google, retornam o mesmo resultado que o seu código. Tenho certeza de que o caso de teste é inválido :(
Metoniem 23/02

1

C, 63 bytes

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

Define uma macro parametrizada (bastante ingênua) M, a abordagem de trabalho mais curta que eu conseguia pensar, mas provavelmente ainda não a mais curta. Como tal, todas as sugestões de golfe são muito apreciadas.

De qualquer forma, isso retorna 2 valores de ponto flutuante E_be E_a, respectivamente.

Experimente online!


Falha no9999, 1
Metoniem 22/02

@Metoniem Yup. Muito provavelmente tem a ver com a forma como C arredonda flutuadores. : / Estou investigando.
R. Kap 22/02

Na verdade, parece estar correto, o caso de teste pode ser inválido :(
Metoniem 23/02

1

JavaScript (ES7), 41 35 bytes

Guardado 6 bytes graças a @Neil

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

Desde Ea + Eb = 1, basta escrever a=>b=>[b=1/(1+10**((b-a)/400)),1-b].
Neil

@Neil Really? Eu sou tão míope: P Obrigado!
ETHproductions

0

Linguagem de Macro SAS, 70 bytes

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

Saída é um conjunto de dados SAS em que variáveis pe qsão as chances de vitória dos jogadores. 11 bytes podem ser salvos removendo o printprocedimento.


0

C #, 92 bytes

Não é o mais curto, mas é C #, nunca o mais curto ..

Golfe

   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 bytes

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

Exemplo

q){1%1+10 xexp(y-x;x-y)%400}[1200;2100]
0.0055919673088347735 0.99440803269116518
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.