Tính toán xếp hạng ELO Điểm mong đợi


11

Nhiệm vụ của bạn là tính toán cơ hội chiến thắng dự kiến ​​cho 2 người chơi trong một số trò chơi, mỗi người có Xếp hạng ELO của riêng họ . Người chơi A có ELO R a và người chơi B có ELO R b

Điểm dự kiến ​​cho Người chơi A (E a ) là: 1 / (1 + 10 (R b - R a ) / 400 ). Có một phương trình tương tự cho Người chơi B (E b ): 1 / (1 + 10 (R a - R b ) / 400 ).

Nếu bạn muốn có một phiên bản dễ uốn hơn: 1 / (1 + 10^((a-b) / 400))

E a + E b nên bằng 1.

Do đó, điểm số cho một người chơi là cơ hội chiến thắng dự kiến ​​của họ trong một số trận đấu, tính bằng số thập phân.

Chương trình / chức năng của bạn phải có 2 đầu vào, ELO của Người chơi A và ELO của Người chơi B và in / trả lại cơ hội tương ứng của họ để giành chiến thắng ở định dạng thập phân. Đầu ra phải thêm tối đa một và bạn phải chính xác đến ít nhất 5 chữ số thập phân ( 0.00000). Sau 5 chữ số thập phân, bạn có thể có các chữ số không chính xác, với điều kiện hai đầu ra vẫn cộng với một.

Ví dụ:

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

Trong trường hợp thử nghiệm cuối cùng, một số câu trả lời sử dụng lũy ​​thừa khoa học để biểu thị giá trị. Điều này không hợp lệ.

Bạn có thể thấy trong trường hợp thử nghiệm 3 ở đây 0.557312không hoàn toàn chính xác, bởi vì 2nên là a 1, nhưng điều này là tốt vì nó nằm sau năm chữ số thập phân và các đầu ra vẫn cộng với một.

Đây là một ví dụ về đầu ra không hợp lệ:

9999 9998 -> 0.5014391117091516, 0.49856088829084844

Điều này có vẻ như đáp ứng các yêu cầu thoạt nhìn, nhưng các con số cộng lại 1.00000000000000004và do đó đầu ra không hợp lệ.

Trailing zeroes trong đầu ra là tốt.

Bạn có thể cho rằng ELO của người chơi sẽ luôn lớn hơn 0 và không ai có ELO cao hơn 9999.

Định dạng đầu vào và đầu ra là linh hoạt, nhưng đầu vào và đầu ra vẫn phải ở cơ sở 10.

Vì đây là , câu trả lời có số byte thấp nhất sẽ giành chiến thắng!


1
+1 cho xếp hạng ELO, mặc dù tôi đã thất vọng khi thấy bạn đang nói về một thứ gọi là xếp hạng Elo.
Darren Ringer

Bạn cũng nên thêm trường hợp kiểm tra [9999, 998]mà hầu hết các câu trả lời dường như không thành công.
Emigna

@Emigna đã thêm, nhưng làm cho nó cực hơn;)
Okx

@Okx: Đẹp đấy. Cần quay lại bảng vẽ để xử lý cái đó :)
Emigna

Dường như tất cả các câu trả lời đều thất bại 9999, 1kể cả của riêng tôi, vì vậy tôi không thể đăng nó :-(
Metoniem

Câu trả lời:


5

Thạch , 9 byte

÷400⁵*÷S$

Hãy thử trực tuyến! hoặc Xem tất cả các trường hợp thử nghiệm.

Đầu vào là một mảng [Ra, Rb]và đầu ra là một mảng [Ea, Eb].

Giải trình

÷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 Đó là ký hiệu khoa học. Tôi chắc chắn bạn biết nó là gì vì bạn vừa chỉnh sửa thử thách để yêu cầu ký hiệu chuẩn sau khi bạn nói định dạng đầu vào / đầu ra ban đầu tùy thuộc vào chúng tôi.
dặm

Bạn đã nhìn vào đầu ra khác? Đó là 1.0!
Okx


3

MATL, 11 byte

10i400/^ts/

Lấy đầu vào dưới dạng danh sách và xuất ra danh sách.

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 byte

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

Một số giải pháp 23 byte khác:

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

Hãy thử trực tuyến!

Giải trình

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
Thất

@Metoniem Thật kỳ lạ ... nó chắc chắn có liên quan đến các vấn đề làm tròn, hoặc có thể là một cái gì đó như thế nào 0.1 + 0.2 = 0.30000000000000004. Tôi sẽ xem xét nó
Business Cat

bây giờ nó thực sự trông ổn, TẤT CẢ các câu trả lời bao gồm cả máy tính của Google đều trả về kết quả giống như mã của bạn. Tôi khá chắc chắn trường hợp kiểm tra không hợp lệ :(
Metoniem

1

C, 63 byte

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

Xác định một macro tham số (khá ngây thơ) M, cách tiếp cận làm việc ngắn nhất tôi có thể nghĩ đến nhưng có lẽ vẫn không phải là ngắn nhất. Như vậy, bất kỳ đề nghị chơi golf được đánh giá rất cao.

Dù sao, điều này trả về 2 giá trị dấu phẩy động E_bE_a, tương ứng.

Hãy thử trực tuyến!


9999, 1
Thất

@Metoniem Yup. Nhiều khả năng phải làm với cách vòng C nổi. : / Tôi đang xem xét nó.
R. Kap

Nó thực sự có vẻ đúng, trường hợp thử nghiệm có thể không hợp lệ :(
Metoniem

1

JavaScript (ES7), 41 35 byte

Đã lưu 6 byte nhờ @Neil

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

Vì Ea + Eb = 1, chỉ cần viết a=>b=>[b=1/(1+10**((b-a)/400)),1-b].
Neil

@Neil Thật sao? Tôi rất thiển cận: P Cảm ơn!
Sản xuất ETH

0

Ngôn ngữ Macro SAS, 70 byte

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

Đầu ra là tập dữ liệu SAS trong đó các biến pqlà cơ hội chiến thắng của người chơi. 11 byte có thể được lưu bằng cách loại bỏ printthủ tục.


0

C #, 92 byte

Không phải ngắn nhất, nhưng đó là C #, không bao giờ là ngắn nhất ..

Chơi gôn

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

Ung dung

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 byte

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

Thí dụ

q){1%1+10 xexp(y-x;x-y)%400}[1200;2100]
0.0055919673088347735 0.99440803269116518
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.