Hitung Skor ELO Rating yang Diharapkan

11

Tugas Anda adalah untuk menghitung peluang yang diharapkan untuk menang untuk 2 pemain dalam beberapa permainan, masing-masing dengan ELO Rating mereka sendiri . Pemain A memiliki ELO R a dan pemain B memiliki ELO R b

Skor yang diharapkan untuk Pemain A (E a ) adalah: 1 / (1 + 10 (R b - R a ) / 400 ). Ada persamaan yang sama untuk Player B (E b ): 1 / (1 + 10 (R a - R b ) / 400 ).

Jika Anda ingin versi yang lebih mudah disalin: 1 / (1 + 10^((a-b) / 400))

E a + E b harus sama dengan 1.

Oleh karena itu, skor untuk pemain adalah peluang yang diharapkan untuk memenangkan pertandingan, dalam desimal.

Program / fungsi Anda harus mengambil 2 input, ELO Player A, dan ELO Player B, dan mencetak / mengembalikan peluang masing-masing untuk menang dalam format desimal. Output harus berjumlah satu, dan Anda harus akurat hingga setidaknya 5 tempat desimal ( 0.00000). Setelah 5 tempat desimal, Anda mungkin memiliki angka yang tidak akurat, asalkan dua output masih menambahkan hingga satu.

Contoh:

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

Dalam kasus tes akhir, beberapa jawaban menggunakan eksponensial ilmiah untuk mewakili nilai. Ini tidak valid

Anda dapat melihat dalam test case 3 di sini yang 0.557312tidak cukup akurat, karena 2harus a 1, tetapi ini baik-baik saja karena setelah lima tempat desimal dan output masih menambahkan hingga satu.

Ini adalah contoh dari output yang tidak valid:

9999 9998 -> 0.5014391117091516, 0.49856088829084844

Ini kelihatannya memenuhi persyaratan pada pandangan pertama, tetapi jumlahnya bertambah hingga 1.00000000000000004dan oleh karena itu outputnya tidak valid.

Membuntuti nol dalam output baik-baik saja.

Anda dapat mengasumsikan ELO pemain akan selalu lebih besar dari 0, dan tidak ada yang akan memiliki ELO lebih tinggi dari 9999.

Format input dan output fleksibel, tetapi input dan output masih harus di base 10.

Karena ini adalah , jawaban dengan jumlah byte terendah akan menang!

Okx
sumber
1
+1 untuk peringkat ELO, meskipun saya kecewa menemukan Anda berbicara tentang sesuatu yang disebut peringkat Elo.
Darren Ringer
Anda juga harus menambahkan test case [9999, 998]yang sepertinya gagal dijawab oleh sebagian besar jawaban.
Emigna
@Emigna menambahkan, tetapi membuatnya lebih ekstrem;)
Okx
@Okx: Bagus. Perlu kembali ke papan gambar untuk mengatasinya :)
Emigna
Tampaknya semua jawaban gagal 9999, 1termasuk saya sendiri, jadi saya tidak dapat mempostingnya :-(
Metoniem

Jawaban:

5

Jelly , 9 byte

÷400⁵*÷S$

Cobalah online! atau Lihat semua kasus uji.

Input adalah sebuah array [Ra, Rb]dan output adalah sebuah array [Ea, Eb].

Penjelasan

÷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))]
mil
sumber
@Okx Itu adalah notasi ilmiah. Saya yakin Anda tahu apa itu karena Anda baru saja mengedit tantangan untuk memerlukan notasi standar setelah Anda awalnya mengatakan format input / output terserah kami.
mil
Apakah Anda melihat output lainnya? Ini 1,0!
Okx
3

Python 3, 55 47 byte

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

-8 byte berkat @math_junkie

Trelzevir
sumber
Mengapa tidak menggunakan untuk pemahaman:1/(1+10**(x/400))for x in [b-a,a-b]
pecandu matematika
@math_junkie Ini disebut " daftar pemahaman "
mbomb007
3

MATL, 11 byte

10i400/^ts/

Mengambil input sebagai daftar dan menampilkan daftar.

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
sumber
1

CJam , 23 byte

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

Beberapa solusi 23 byte lainnya:

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

Cobalah online!

Penjelasan

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
Kucing Bisnis
sumber
Gagal pada 9999, 1:(
Metoniem
@ Metoniem Aneh ... pasti ada hubungannya dengan masalah pembulatan, atau mungkin sesuatu seperti bagaimana 0.1 + 0.2 = 0.30000000000000004. Saya akan memeriksanya
Bisnis Kucing
sekarang benar-benar terlihat baik-baik saja, SEMUA jawaban termasuk kalkulator Google mengembalikan hasil yang sama dengan kode Anda. Saya yakin test case tidak valid :(
Metoniem
1

C, 63 byte

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

Mendefinisikan makro parameterisasi (agak naif) M, pendekatan kerja terpendek yang dapat saya pikirkan tetapi mungkin masih bukan yang terpendek. Karenanya, setiap saran golf sangat dihargai.

Bagaimanapun, ini mengembalikan 2 nilai floating point, E_bdan E_a, masing-masing.

Cobalah online!

R. Kap
sumber
Gagal9999, 1
Metoniem
@Metoniem Yup. Kemungkinan besar berkaitan dengan bagaimana putaran C mengapung. : / Aku sedang menyelidikinya.
R. Kap
Tampaknya benar, test case mungkin tidak valid :(
Metoniem
1

JavaScript (ES7), 41 35 byte

Disimpan 6 byte berkat @Neil

a=>b=>[b=1/(1+10**((b-a)/400)),1-b]
Produksi ETH
sumber
Karena Ea + Eb = 1, tulis saja a=>b=>[b=1/(1+10**((b-a)/400)),1-b].
Neil
@Neil Benarkah? Saya sangat rabun: P Terima kasih!
ETHproduksi
0

SAS Macro Language, 70 byte

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

Output adalah kumpulan data SAS di mana variabel pdan qpeluang pemain untuk menang. 11 byte dapat disimpan dengan menghapus printprosedur.

J_Lard
sumber
0

C #, 92 byte

Bukan yang terpendek, tapi itu C #, tidak pernah yang terpendek ..

Golf

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

Tidak disatukan

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

q, 26 byte

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

Contoh

q){1%1+10 xexp(y-x;x-y)%400}[1200;2100]
0.0055919673088347735 0.99440803269116518
skeevey
sumber