คำนวณคะแนน 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 แม้ว่าฉันรู้สึกผิดหวังที่พบว่าคุณกำลังพูดถึงสิ่งที่เรียกว่าการให้คะแนน Elo แทน
Darren Ringer

คุณควรเพิ่มกรณีทดสอบ[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

@ Mantiem มันแปลกมาก ... มันมีบางอย่างที่เกี่ยวข้องกับการปัดเศษหรืออาจจะเป็นอย่าง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ตามลำดับ

ลองออนไลน์!


Fails on9999, 1
Metoniem

@Metoniem Yup มีแนวโน้มมากที่สุดที่จะทำอย่างไรกับรอบ C ลอย : / ฉันกำลังมองหามัน
R. Kap

ดูเหมือนว่าจะถูกต้องจริงกรณีทดสอบอาจไม่ถูกต้อง :(
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]เพียงแค่เขียน
Neil

@ นีลจริงเหรอ? ฉันสายตาสั้นมาก: 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 # ไม่เคยสั้นที่สุด ..

แข็งแรงเล่นกอล์ฟ

   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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.