Travis build: 1026

This commit is contained in:
30secondsofcode
2018-01-04 12:34:15 +00:00
parent 3373ddb57f
commit 91da9ba80d
2 changed files with 53 additions and 12 deletions

View File

@ -2825,19 +2825,31 @@ distance(1, 1, 2, 3); // 2.23606797749979
### elo
Computes the new ratings between two opponents using the [Elo rating system](https://en.wikipedia.org/wiki/Elo_rating_system). It takes an array
of two pre-ratings and returns an array containing two post-ratings.
The winner's rating is the first element of the array.
Computes the new ratings between two or more opponents using the [Elo rating system](https://en.wikipedia.org/wiki/Elo_rating_system). It takes an array
of pre-ratings and returns an array containing post-ratings.
The array should be ordered from best performer to worst performer (winner -> loser).
Use the exponent `**` operator and math operators to compute the expected score (chance of winning)
of each opponent and compute the new rating for each. Omit the second argument to use the default
K-factor of 32, or supply a custom K-factor value.
of each opponent and compute the new rating for each. Loop through the ratings, using each permutation to compute the post-Elo rating for each player in a pairwise fashion. Omit the second argument to use the default K-factor of 32, or supply a custom K-factor value. For details on the third argument, see the last example.
```js
const elo = ([a, b], kFactor = 32) => {
const elo = ([...ratings], kFactor = 32, selfRating) => {
const [a, b] = ratings;
const expectedScore = (self, opponent) => 1 / (1 + 10 ** ((opponent - self) / 400));
const newRating = (rating, i) => rating + kFactor * (i - expectedScore(i ? a : b, i ? b : a));
return [newRating(a, 1), newRating(b, 0)];
const newRating = (rating, i) =>
(selfRating || rating) + kFactor * (i - expectedScore(i ? a : b, i ? b : a));
if (ratings.length === 2) {
return [newRating(a, 1), newRating(b, 0)];
} else {
for (let i = 0; i < ratings.length; i++) {
let j = i;
while (j < ratings.length - 1) {
[ratings[i], ratings[j + 1]] = elo([ratings[i], ratings[j + 1]], kFactor);
j++;
}
}
}
return ratings;
};
```
@ -2845,8 +2857,16 @@ const elo = ([a, b], kFactor = 32) => {
<summary>Examples</summary>
```js
// Standard 1v1s
elo([1200, 1200]); // [1216, 1184]
elo([1200, 1200], 64); // [1232, 1168]
// 4 player FFA, all same rank
elo([1200, 1200, 1200, 1200]).map(Math.round); // [1246, 1215, 1185, 1154]
/*
For teams, each rating can adjusted based on own team's average rating vs.
average rating of opposing team, with the score being added to their
own individual rating by supplying it as the third argument.
*/
```
</details>

View File

@ -569,13 +569,34 @@ document<span class="token punctuation">.</span>body<span class="token punctuati
</pre><label class="collapse">Show examples</label><pre class="language-js"><span class="token function">digitize</span><span class="token punctuation">(</span><span class="token number">123</span><span class="token punctuation">);</span> <span class="token comment">// [1, 2, 3]</span>
</pre><button class="primary clipboard-copy"><img src="clipboard.svg" alt="clipboard">&nbsp;Copy to clipboard</button></div></div><div class="card fluid"><h3 id="distance" class="section double-padded">distance</h3><div class="section double-padded"><p>Returns the distance between two points.</p><p>Use <code>Math.hypot()</code> to calculate the Euclidean distance between two points.</p><pre class="language-js"><span class="token keyword">const</span> <span class="token function-variable function">distance</span> <span class="token operator">=</span> <span class="token punctuation">(</span>x0<span class="token punctuation">,</span> y0<span class="token punctuation">,</span> x1<span class="token punctuation">,</span> y1<span class="token punctuation">)</span> <span class="token operator">=></span> Math<span class="token punctuation">.</span><span class="token function">hypot</span><span class="token punctuation">(</span>x1 <span class="token operator">-</span> x0<span class="token punctuation">,</span> y1 <span class="token operator">-</span> y0<span class="token punctuation">);</span>
</pre><label class="collapse">Show examples</label><pre class="language-js"><span class="token function">distance</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">);</span> <span class="token comment">// 2.23606797749979</span>
</pre><button class="primary clipboard-copy"><img src="clipboard.svg" alt="clipboard">&nbsp;Copy to clipboard</button></div></div><div class="card fluid"><h3 id="elo" class="section double-padded">elo</h3><div class="section double-padded"><p>Computes the new ratings between two opponents using the <a href="https://en.wikipedia.org/wiki/Elo_rating_system">Elo rating system</a>. It takes an array of two pre-ratings and returns an array containing two post-ratings. The winner's rating is the first element of the array.</p><p>Use the exponent <code>**</code> operator and math operators to compute the expected score (chance of winning) of each opponent and compute the new rating for each. Omit the second argument to use the default K-factor of 32, or supply a custom K-factor value.</p><pre class="language-js"><span class="token keyword">const</span> <span class="token function-variable function">elo</span> <span class="token operator">=</span> <span class="token punctuation">([</span>a<span class="token punctuation">,</span> b<span class="token punctuation">],</span> kFactor <span class="token operator">=</span> <span class="token number">32</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
</pre><button class="primary clipboard-copy"><img src="clipboard.svg" alt="clipboard">&nbsp;Copy to clipboard</button></div></div><div class="card fluid"><h3 id="elo" class="section double-padded">elo</h3><div class="section double-padded"><p>Computes the new ratings between two or more opponents using the <a href="https://en.wikipedia.org/wiki/Elo_rating_system">Elo rating system</a>. It takes an array of pre-ratings and returns an array containing post-ratings. The array should be ordered from best performer to worst performer (winner -&gt; loser).</p><p>Use the exponent <code>**</code> operator and math operators to compute the expected score (chance of winning) of each opponent and compute the new rating for each. Loop through the ratings, using each permutation to compute the post-Elo rating for each player in a pairwise fashion. Omit the second argument to use the default K-factor of 32, or supply a custom K-factor value. For details on the third argument, see the last example.</p><pre class="language-js"><span class="token keyword">const</span> <span class="token function-variable function">elo</span> <span class="token operator">=</span> <span class="token punctuation">([</span><span class="token operator">...</span>ratings<span class="token punctuation">],</span> kFactor <span class="token operator">=</span> <span class="token number">32</span><span class="token punctuation">,</span> selfRating<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
<span class="token keyword">const</span> <span class="token punctuation">[</span>a<span class="token punctuation">,</span> b<span class="token punctuation">]</span> <span class="token operator">=</span> ratings<span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token function-variable function">expectedScore</span> <span class="token operator">=</span> <span class="token punctuation">(</span>self<span class="token punctuation">,</span> opponent<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token number">1</span> <span class="token operator">/</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">+</span> <span class="token number">10</span> <span class="token operator">**</span> <span class="token punctuation">((</span>opponent <span class="token operator">-</span> self<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">400</span><span class="token punctuation">));</span>
<span class="token keyword">const</span> <span class="token function-variable function">newRating</span> <span class="token operator">=</span> <span class="token punctuation">(</span>rating<span class="token punctuation">,</span> i<span class="token punctuation">)</span> <span class="token operator">=></span> rating <span class="token operator">+</span> kFactor <span class="token operator">*</span> <span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token function">expectedScore</span><span class="token punctuation">(</span>i <span class="token operator">?</span> a <span class="token punctuation">:</span> b<span class="token punctuation">,</span> i <span class="token operator">?</span> b <span class="token punctuation">:</span> a<span class="token punctuation">));</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token function">newRating</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">),</span> <span class="token function">newRating</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)];
<span class="token keyword">const</span> <span class="token function-variable function">newRating</span> <span class="token operator">=</span> <span class="token punctuation">(</span>rating<span class="token punctuation">,</span> i<span class="token punctuation">)</span> <span class="token operator">=></span>
<span class="token punctuation">(</span>selfRating <span class="token operator">||</span> rating<span class="token punctuation">)</span> <span class="token operator">+</span> kFactor <span class="token operator">*</span> <span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token function">expectedScore</span><span class="token punctuation">(</span>i <span class="token operator">?</span> a <span class="token punctuation">:</span> b<span class="token punctuation">,</span> i <span class="token operator">?</span> b <span class="token punctuation">:</span> a<span class="token punctuation">));</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>ratings<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">2</span><span class="token punctuation">) {</span>
<span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token function">newRating</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">),</span> <span class="token function">newRating</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)];
}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> ratings<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">) {</span>
<span class="token keyword">let</span> j <span class="token operator">=</span> i<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span>j <span class="token operator">&lt;</span> ratings<span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">) {
[</span>ratings<span class="token punctuation">[</span>i<span class="token punctuation">],</span> ratings<span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]]</span> <span class="token operator">=</span> <span class="token function">elo</span><span class="token punctuation">([</span>ratings<span class="token punctuation">[</span>i<span class="token punctuation">],</span> ratings<span class="token punctuation">[</span>j <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]],</span> kFactor<span class="token punctuation">);</span>
j<span class="token operator">++</span><span class="token punctuation">;
}
}
}</span>
<span class="token keyword">return</span> ratings<span class="token punctuation">;
};</span>
</pre><label class="collapse">Show examples</label><pre class="language-js"><span class="token function">elo</span><span class="token punctuation">([</span><span class="token number">1200</span><span class="token punctuation">,</span> <span class="token number">1200</span><span class="token punctuation">]);</span> <span class="token comment">// [1216, 1184]</span>
</pre><label class="collapse">Show examples</label><pre class="language-js"><span class="token comment">// Standard 1v1s</span>
<span class="token function">elo</span><span class="token punctuation">([</span><span class="token number">1200</span><span class="token punctuation">,</span> <span class="token number">1200</span><span class="token punctuation">]);</span> <span class="token comment">// [1216, 1184]</span>
<span class="token function">elo</span><span class="token punctuation">([</span><span class="token number">1200</span><span class="token punctuation">,</span> <span class="token number">1200</span><span class="token punctuation">],</span> <span class="token number">64</span><span class="token punctuation">);</span> <span class="token comment">// [1232, 1168]</span>
<span class="token comment">// 4 player FFA, all same rank</span>
<span class="token function">elo</span><span class="token punctuation">([</span><span class="token number">1200</span><span class="token punctuation">,</span> <span class="token number">1200</span><span class="token punctuation">,</span> <span class="token number">1200</span><span class="token punctuation">,</span> <span class="token number">1200</span><span class="token punctuation">]).</span><span class="token function">map</span><span class="token punctuation">(</span>Math<span class="token punctuation">.</span>round<span class="token punctuation">);</span> <span class="token comment">// [1246, 1215, 1185, 1154]</span>
<span class="token comment">/*
For teams, each rating can adjusted based on own team's average rating vs.
average rating of opposing team, with the score being added to their
own individual rating by supplying it as the third argument.
*/</span>
</pre><button class="primary clipboard-copy"><img src="clipboard.svg" alt="clipboard">&nbsp;Copy to clipboard</button></div></div><div class="card fluid"><h3 id="factorial" class="section double-padded">factorial</h3><div class="section double-padded"><p>Calculates the factorial of a number.</p><p>Use recursion. If <code>n</code> is less than or equal to <code>1</code>, return <code>1</code>. Otherwise, return the product of <code>n</code> and the factorial of <code>n - 1</code>. Throws an exception if <code>n</code> is a negative number.</p><pre class="language-js"><span class="token keyword">const</span> <span class="token function-variable function">factorial</span> <span class="token operator">=</span> n <span class="token operator">=></span>
n <span class="token operator">&lt;</span> <span class="token number">0</span>
<span class="token operator">?</span> <span class="token punctuation">(()</span> <span class="token operator">=></span> <span class="token punctuation">{</span>