ईएलओ रेटिंग अपेक्षित स्कोर की गणना करें


11

अपने काम के लिए कुछ खेल में 2 खिलाड़ियों के लिए जीतने की संभावना की गणना करने के लिए है, प्रत्येक अपने स्वयं के ELO रेटिंग के साथ । प्लेयर एक ELO आर है एक और खिलाड़ी बी है ELO आर बी

प्लेयर एक (ई के लिए उम्मीद स्कोर एक ): 1 / (1 + 10 (आर बी - आर एक ) / 400 )। प्लेयर B (E b ) के लिए समान समीकरण है : 1 / (1 + 10 (R - a - R b ) / 400 )।

यदि आप एक अधिक अनुकूलनीय संस्करण चाहते हैं: 1 / (1 + 10^((a-b) / 400))

एक + ई 1 के बराबर होना चाहिए।

इसलिए, एक खिलाड़ी के लिए स्कोर दशमलव में कुछ मैच जीतने की उनकी संभावित संभावना है।

आपके प्रोग्राम / फंक्शन में 2 इनपुट, प्लेयर A का ELO और प्लेयर B का ELO लेना चाहिए, और दशमलव प्रारूप में जीतने के लिए अपने संबंधित अवसर को प्रिंट / वापस करना चाहिए। आउटपुट को एक तक जोड़ना होगा , और आपको कम से कम 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ए होना चाहिए 1, लेकिन यह ठीक है क्योंकि यह पांच दशमलव स्थानों के बाद है और आउटपुट अभी भी एक में जोड़े जाते हैं।

यह अमान्य आउटपुट का एक उदाहरण है:

9999 9998 -> 0.5014391117091516, 0.49856088829084844

ऐसा लगता है कि यह पहली नज़र में आवश्यकताओं को संतुष्ट करता है, लेकिन संख्याएँ जोड़ते हैं 1.00000000000000004और इसलिए आउटपुट मान्य नहीं है।

आउटपुट में ट्रेलिंग जीरो ठीक है।

आप मान सकते हैं कि किसी खिलाड़ी का ELO हमेशा 0 से अधिक होगा, और किसी का ELO 9999 से अधिक नहीं होगा।

इनपुट और आउटपुट प्रारूप लचीला है, लेकिन इनपुट और आउटपुट अभी भी बेस 10 में होना चाहिए।

जैसा कि यह , सबसे कम बाइट गिनती के साथ जवाब जीत जाएगा!


1
ईएलओ रेटिंग के लिए +1, भले ही मुझे यह देखकर निराशा हुई हो कि आप इसके बजाय एलो रेटिंग नामक किसी चीज़ के बारे में बात कर रहे हैं।
डैरेन रिंगर

आपको उस परीक्षण मामले को भी जोड़ना चाहिए [9999, 998]जिसके अधिकांश उत्तर विफल होने लगते हैं।
एमिगा

@Emigna गयी, लेकिन इसे और अधिक चरम बना दिया;)
ओकेक्स

@ ऑक्स: नाइस। ड्राइंग बोर्ड पर वापस जाने के लिए उस एक :) को संभालने की आवश्यकता है
Emigna

ऐसा लगता है कि सभी उत्तर 9999, 1मेरे अपने सहित विफल हैं, इसलिए मैं इसे पोस्ट नहीं कर सकता :-(
मेटोनीम

जवाबों:


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 है!
ओकेक्स


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

सीजेएम , 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 अजीब है ... यह निश्चित रूप से गोल मुद्दों के साथ कुछ करना है, या शायद कुछ ऐसा कैसे 0.1 + 0.2 = 0.30000000000000004। मैं इस पर गौर करेंगे
बिजनेस बिल्ली

यह वास्तव में अब ठीक लग रहा है, Google के कैलकुलेटर सहित सभी उत्तर आपके कोड के समान परिणाम देते हैं। मुझे पूरा यकीन है कि परीक्षण का मामला अमान्य है :(
मेटोनीम

1

सी, 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, क्रमशः।

इसे ऑनलाइन आज़माएं!


विफल रहता है9999, 1
मेटोनीम

@ मेतोनीम युप। सबसे अधिक संभावना है कि सी राउंड कैसे तैरता है। : / मैं इसे देख रहा हूँ।
आर। काप।

यह वास्तव में सही प्रतीत होता है, परीक्षण का मामला अमान्य हो सकता है :(
मेटोनीम

1

जावास्क्रिप्ट (ईएस 7), 41 35 बाइट्स

6 बाइट्स @Neil की बदौलत बची

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

चूंकि ईए + ईबी = 1, बस लिखें a=>b=>[b=1/(1+10**((b-a)/400)),1-b]
नील

@ नील सच में? मैं बहुत छोटा हूँ: धन्यवाद!
ETHproductions

0

एसएएस मैक्रो भाषा, 70 बाइट्स

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

आउटपुट एसएएस डेटा सेट है जहां चर pऔर qखिलाड़ियों के जीतने की संभावना है। 11 बाइट्स को printप्रक्रिया को हटाकर बचाया जा सकता है ।


0

सी #, 92 बाइट्स

सबसे छोटा नहीं, लेकिन यह C # है, सबसे छोटा कभी नहीं ।।

golfed

   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

क्यू, 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.