texas-without-memcpy
Version:
Texas Hold'em hand evaluator for node.js.
144 lines • 50.2 kB
HTML
<!DOCTYPE html> <html> <head> <title>texas.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> texas.js </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">¶</a> </div> <p>Texas Hold'em hand evaluator for <a href="http://nodejs.org/">node.js</a>.</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <p><em>Dependencies</em>: <a href="http://documentcloud.github.com/underscore/">underscore.js</a>,
<a href="http://github.com/egorFiNE/node-compress-buffer/">compress-buffer</a>.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'underscore'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'fs'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">crypto</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'crypto'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">gzip</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'compress-buffer'</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <h2>Definitions</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>Standard deck size.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">deckSize</span> <span class="o">=</span> <span class="mi">52</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>Card abbreviations.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">chars</span> <span class="o">=</span> <span class="s1">'23456789TJQKAc♣d♦h♥s♠'</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">abbr</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">object</span><span class="p">(</span><span class="nx">chars</span><span class="p">,</span> <span class="nx">_</span><span class="p">.</span><span class="nx">range</span><span class="p">(</span><span class="nx">chars</span><span class="p">.</span><span class="nx">length</span><span class="p">));</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>Card ranks.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">ranks</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Two'</span><span class="p">,</span> <span class="s1">'Three'</span><span class="p">,</span> <span class="s1">'Four'</span><span class="p">,</span> <span class="s1">'Five'</span><span class="p">,</span> <span class="s1">'Six'</span><span class="p">,</span> <span class="s1">'Seven'</span><span class="p">,</span>
<span class="s1">'Eight'</span><span class="p">,</span> <span class="s1">'Nine'</span><span class="p">,</span> <span class="s1">'Ten'</span><span class="p">,</span> <span class="s1">'Jack'</span><span class="p">,</span> <span class="s1">'Queen'</span><span class="p">,</span> <span class="s1">'King'</span><span class="p">,</span> <span class="s1">'Ace'</span><span class="p">];</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <p>Card suits.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">suits</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Clubs'</span><span class="p">,</span> <span class="s1">'Diamonds'</span><span class="p">,</span> <span class="s1">'Hearts'</span><span class="p">,</span> <span class="s1">'Spades'</span><span class="p">];</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>Types of hand.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">hands</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Invalid'</span><span class="p">,</span> <span class="s1">'High Card'</span><span class="p">,</span> <span class="s1">'One Pair'</span><span class="p">,</span> <span class="s1">'Two Pairs'</span><span class="p">,</span>
<span class="s1">'Three of a Kind'</span><span class="p">,</span> <span class="s1">'Straight'</span><span class="p">,</span> <span class="s1">'Flush'</span><span class="p">,</span> <span class="s1">'Full House'</span><span class="p">,</span>
<span class="s1">'Four of a Kind'</span><span class="p">,</span> <span class="s1">'Straight Flush'</span><span class="p">];</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>Loads the look-up table.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">buffer</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="nx">__dirname</span> <span class="o">+</span> <span class="s1">'/HandRanks.dat.gz'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">evaluator</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Int32Array</span><span class="p">(</span><span class="nx">gzip</span><span class="p">.</span><span class="nx">uncompress</span><span class="p">(</span><span class="nx">buffer</span><span class="p">));</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <h2>Internal Functions</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>Parses the formatted card to get its numeric code.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">getCode</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">card</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">card</span> <span class="o">==</span> <span class="s1">'number'</span><span class="p">)</span>
<span class="k">return</span> <span class="nx">card</span> <span class="o">>=</span> <span class="mi">1</span> <span class="o">&&</span> <span class="nx">card</span> <span class="o"><=</span> <span class="nx">deckSize</span> <span class="o">?</span> <span class="nx">card</span> <span class="o">:</span> <span class="kc">undefined</span><span class="p">;</span> <span class="c1">// Already codified</span>
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">card</span> <span class="o">!=</span> <span class="s1">'string'</span> <span class="o">||</span> <span class="nx">card</span><span class="p">.</span><span class="nx">length</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">undefined</span><span class="p">;</span> <span class="c1">// Invalid input</span>
<span class="kd">var</span> <span class="nx">posRank</span> <span class="o">=</span> <span class="nx">abbr</span><span class="p">[</span><span class="nx">card</span><span class="p">[</span><span class="mi">0</span><span class="p">]];</span>
<span class="kd">var</span> <span class="nx">posSuit</span> <span class="o">=</span> <span class="p">(</span><span class="nx">abbr</span><span class="p">[</span><span class="nx">card</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="o">-</span> <span class="nx">ranks</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">>></span> <span class="mi">1</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">posRank</span> <span class="o">!=</span> <span class="s1">'number'</span> <span class="o">||</span> <span class="nx">posRank</span> <span class="o">>=</span> <span class="nx">ranks</span><span class="p">.</span><span class="nx">length</span> <span class="o">||</span> <span class="nx">posSuit</span> <span class="o"><</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">undefined</span><span class="p">;</span> <span class="c1">// Invalid characters</span>
<span class="k">return</span> <span class="nx">posRank</span> <span class="o">*</span> <span class="nx">suits</span><span class="p">.</span><span class="nx">length</span> <span class="o">+</span> <span class="nx">posSuit</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">};</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>Helper function to create card formatters.</p> </td> <td class="code"> <div class="highlight"><pre><span class="kd">var</span> <span class="nx">filter</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">format</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">card</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">card</span> <span class="o">=</span> <span class="nx">getCode</span><span class="p">(</span><span class="nx">card</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">card</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">undefined</span><span class="p">;</span>
<span class="nx">card</span><span class="o">--</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">format</span><span class="p">({</span><span class="nx">rank</span><span class="o">:</span> <span class="nx">card</span> <span class="o">>></span> <span class="mi">2</span><span class="p">,</span> <span class="nx">suit</span><span class="o">:</span> <span class="nx">card</span> <span class="o">&</span> <span class="mi">3</span><span class="p">});</span>
<span class="p">};</span>
<span class="p">};</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <h2>Main Functions</h2> </td> <td class="code"> <div class="highlight"><pre><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Creates a new shuffled deck.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">deck</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">format</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">res</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">deckSize</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">buffer</span> <span class="o">=</span> <span class="nx">crypto</span><span class="p">.</span><span class="nx">randomBytes</span><span class="p">(</span><span class="nx">deckSize</span> <span class="o"><<</span> <span class="mi">2</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">pos</span> <span class="o">=</span> <span class="nx">res</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">pos</span> <span class="o">></span> <span class="mi">0</span><span class="p">;</span> <span class="nx">pos</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">rand</span> <span class="o">=</span> <span class="nx">buffer</span><span class="p">.</span><span class="nx">readUInt32LE</span><span class="p">(</span><span class="nx">pos</span> <span class="o"><<</span> <span class="mi">2</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="nx">pos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">temp</span> <span class="o">=</span> <span class="nx">res</span><span class="p">[</span><span class="nx">pos</span><span class="p">];</span>
<span class="nx">res</span><span class="p">[</span><span class="nx">pos</span><span class="p">]</span> <span class="o">=</span> <span class="nx">res</span><span class="p">[</span><span class="nx">rand</span><span class="p">];</span>
<span class="nx">res</span><span class="p">[</span><span class="nx">rand</span><span class="p">]</span> <span class="o">=</span> <span class="nx">temp</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">return</span> <span class="nx">format</span> <span class="o">?</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">res</span><span class="p">,</span> <span class="nx">format</span><span class="p">)</span> <span class="o">:</span> <span class="nx">res</span><span class="p">;</span>
<span class="p">},</span>
</pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <p>Evaluates the 5 to 7 card hands.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">evaluate</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">cards</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">res</span> <span class="o">=</span> <span class="nx">deckSize</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">c</span> <span class="o"><</span> <span class="nx">cards</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">c</span><span class="o">++</span><span class="p">)</span>
<span class="nx">res</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">res</span> <span class="o">+</span> <span class="nx">getCode</span><span class="p">(</span><span class="nx">cards</span><span class="p">[</span><span class="nx">c</span><span class="p">])];</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">cards</span><span class="p">.</span><span class="nx">length</span> <span class="o"><</span> <span class="mi">7</span><span class="p">)</span>
<span class="nx">res</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">res</span><span class="p">];</span>
<span class="k">return</span> <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="nx">hands</span><span class="p">[</span><span class="nx">res</span> <span class="o">>></span> <span class="mi">12</span><span class="p">],</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">res</span><span class="p">};</span>
<span class="p">},</span>
</pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <p>Sorts the set of cards.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">sort</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">cards</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">sortBy</span><span class="p">(</span><span class="nx">cards</span><span class="p">,</span> <span class="nx">getCode</span><span class="p">);</span>
<span class="p">},</span>
</pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">¶</a> </div> <p>Calculates the exact odds.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">odds</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">hands</span><span class="p">,</span> <span class="nx">table</span><span class="p">,</span> <span class="nx">dead</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>Preprocesses the input data.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">table</span> <span class="o">=</span> <span class="nx">table</span> <span class="o">?</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">table</span><span class="p">,</span> <span class="nx">getCode</span><span class="p">)</span> <span class="o">:</span> <span class="p">[];</span>
<span class="nx">dead</span> <span class="o">=</span> <span class="nx">dead</span> <span class="o">?</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">dead</span><span class="p">,</span> <span class="nx">getCode</span><span class="p">)</span> <span class="o">:</span> <span class="p">[];</span>
<span class="nx">hands</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">hands</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">hand</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">hand</span><span class="p">,</span> <span class="nx">getCode</span><span class="p">);</span>
<span class="p">});</span>
<span class="kd">var</span> <span class="nx">res</span> <span class="o">=</span> <span class="nx">deckSize</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">c</span> <span class="o"><</span> <span class="nx">table</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">c</span><span class="o">++</span><span class="p">)</span>
<span class="nx">res</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">res</span> <span class="o">+</span> <span class="nx">table</span><span class="p">[</span><span class="nx">c</span><span class="p">]];</span>
<span class="kd">var</span> <span class="nx">deck</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">chain</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">deckSize</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)).</span><span class="nx">difference</span><span class="p">(</span><span class="nx">table</span><span class="p">)</span>
<span class="p">.</span><span class="nx">difference</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">flatten</span><span class="p">(</span><span class="nx">hands</span><span class="p">)).</span><span class="nx">difference</span><span class="p">(</span><span class="nx">dead</span><span class="p">).</span><span class="nx">value</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">player</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">hands</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">hand</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">evaluator</span><span class="p">[</span><span class="nx">res</span> <span class="o">+</span> <span class="nx">hand</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">+</span> <span class="nx">hand</span><span class="p">[</span><span class="mi">1</span><span class="p">]];</span>
<span class="p">});</span>
<span class="kd">var</span> <span class="nx">combinations</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">n</span><span class="p">,</span> <span class="nx">k</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">k</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">callback</span><span class="p">(</span><span class="nx">res</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">while</span> <span class="p">(</span><span class="nx">n</span> <span class="o"><</span> <span class="nx">deck</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">parcial</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">res</span> <span class="o">+</span> <span class="nx">deck</span><span class="p">[</span><span class="nx">n</span><span class="o">++</span><span class="p">]];</span>
<span class="nx">combinations</span><span class="p">(</span><span class="nx">n</span><span class="p">,</span> <span class="nx">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">parcial</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">};</span>
</pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">¶</a> </div> <p>Calculates the outcome of each play.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">remaining</span> <span class="o">=</span> <span class="mi">5</span> <span class="o">-</span> <span class="nx">table</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">plays</span> <span class="o">=</span> <span class="nx">deck</span><span class="p">.</span><span class="nx">length</span> <span class="o">/</span> <span class="nx">remaining</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">c</span> <span class="o"><</span> <span class="nx">remaining</span><span class="p">;</span> <span class="nx">c</span><span class="o">++</span><span class="p">)</span>
<span class="nx">plays</span> <span class="o">*=</span> <span class="p">(</span><span class="nx">deck</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="nx">c</span><span class="p">)</span> <span class="o">/</span> <span class="nx">c</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">values</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">(</span><span class="nx">hands</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">p</span> <span class="o"><</span> <span class="nx">hands</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">p</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">s</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">values</span><span class="p">[</span><span class="nx">p</span><span class="p">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Int32Array</span><span class="p">(</span><span class="nx">plays</span><span class="p">);</span>
<span class="nx">combinations</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">remaining</span><span class="p">,</span> <span class="nx">player</span><span class="p">[</span><span class="nx">p</span><span class="p">],</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">values</span><span class="p">[</span><span class="nx">p</span><span class="p">][</span><span class="nx">s</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="nx">res</span><span class="p">;</span>
<span class="p">});</span>
<span class="p">}</span>
</pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">¶</a> </div> <p>Determines the results.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">wins</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Int32Array</span><span class="p">(</span><span class="nx">hands</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">splits</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Int32Array</span><span class="p">(</span><span class="nx">hands</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">s</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">s</span> <span class="o"><</span> <span class="nx">plays</span><span class="p">;</span> <span class="nx">s</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">winner</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">p</span> <span class="o"><</span> <span class="nx">hands</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">p</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="nx">p</span><span class="p">][</span><span class="nx">s</span><span class="p">]</span> <span class="o">></span> <span class="nx">values</span><span class="p">[</span><span class="nx">winner</span><span class="p">[</span><span class="mi">0</span><span class="p">]][</span><span class="nx">s</span><span class="p">])</span>
<span class="nx">winner</span> <span class="o">=</span> <span class="p">[</span><span class="nx">p</span><span class="p">];</span>
<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">values</span><span class="p">[</span><span class="nx">p</span><span class="p">][</span><span class="nx">s</span><span class="p">]</span> <span class="o">==</span> <span class="nx">values</span><span class="p">[</span><span class="nx">winner</span><span class="p">[</span><span class="mi">0</span><span class="p">]][</span><span class="nx">s</span><span class="p">])</span>
<span class="nx">winner</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">p</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">winner</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">wins</span><span class="p">[</span><span class="nx">winner</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">p</span> <span class="o"><</span> <span class="nx">winner</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">p</span><span class="o">++</span><span class="p">)</span>
<span class="nx">splits</span><span class="p">[</span><span class="nx">winner</span><span class="p">[</span><span class="nx">p</span><span class="p">]]</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-21">¶</a> </div> <p>Formats odds output.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">odds</span> <span class="o">=</span> <span class="p">[];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">p</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">p</span> <span class="o"><</span> <span class="nx">hands</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">p</span><span class="o">++</span><span class="p">)</span>
<span class="nx">odds</span><span class="p">[</span><span class="nx">p</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="nx">win</span><span class="o">:</span> <span class="nx">wins</span><span class="p">[</span><span class="nx">p</span><span class="p">]</span> <span class="o">/</span> <span class="nx">plays</span><span class="p">,</span> <span class="nx">split</span><span class="o">:</span> <span class="nx">splits</span><span class="p">[</span><span class="nx">p</span><span class="p">]</span> <span class="o">/</span> <span class="nx">plays</span><span class="p">};</span>
<span class="k">return</span> <span class="nx">odds</span><span class="p">;</span>
<span class="p">},</span>
</pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-22">¶</a> </div> <p>Formats the card to extended text.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">extended</span><span class="o">:</span> <span class="nx">filter</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">card</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">ranks</span><span class="p">[</span><span class="nx">card</span><span class="p">.</span><span class="nx">rank</span><span class="p">]</span> <span class="o">+</span> <span class="s1">' of '</span> <span class="o">+</span> <span class="nx">suits</span><span class="p">[</span><span class="nx">card</span><span class="p">.</span><span class="nx">suit</span><span class="p">];</span>
<span class="p">}),</span>
</pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-23">¶</a> </div> <p>Formats the card to abbreviated text.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">abbr</span><span class="o">:</span> <span class="nx">filter</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">card</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">chars</span><span class="p">[</span><span class="nx">card</span><span class="p">.</span><span class="nx">rank</span><span class="p">]</span> <span class="o">+</span> <span class="nx">chars</span><span class="p">[(</span><span class="nx">card</span><span class="p">.</span><span class="nx">suit</span> <span class="o"><<</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nx">ranks</span><span class="p">.</span><span class="nx">length</span><span class="p">];</span>
<span class="p">}),</span>
</pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-24">¶</a> </div> <p>Formats the card to unicode text.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">unicode</span><span class="o">:</span> <span class="nx">filter</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">card</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">chars</span><span class="p">[</span><span class="nx">card</span><span class="p">.</span><span class="nx">rank</span><span class="p">]</span> <span class="o">+</span> <span class="nx">chars</span><span class="p">[(</span><span class="nx">card</span><span class="p">.</span><span class="nx">suit</span> <span class="o"><<</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nx">ranks</span><span class="p">.</span><span class="nx">length</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
<span class="p">}),</span>
</pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-25">¶</a> </div> <p>Parses the formatted card to get its numeric code.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">code</span><span class="o">:</span> <span class="nx">getCode</span><span class="p">,</span>
</pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-26">¶</a> </div> <p>Benchmarks the evaluator within all possible 7 card hands.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">benchmark</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">freq</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Int32Array</span><span class="p">(</span><span class="nx">hands</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">start</span> <span class="o">=</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span><span class="p">();</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">c1</span> <span class="o"><=</span> <span class="nx">deckSize</span><span class="p">;</span> <span class="nx">c1</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">r1</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">deckSize</span> <span class="o">+</span> <span class="nx">c1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c2</span> <span class="o">=</span> <span class="nx">c1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">c2</span> <span class="o"><=</span> <span class="nx">deckSize</span><span class="p">;</span> <span class="nx">c2</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">r2</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">r1</span> <span class="o">+</span> <span class="nx">c2</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c3</span> <span class="o">=</span> <span class="nx">c2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">c3</span> <span class="o"><=</span> <span class="nx">deckSize</span><span class="p">;</span> <span class="nx">c3</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">r3</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">r2</span> <span class="o">+</span> <span class="nx">c3</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c4</span> <span class="o">=</span> <span class="nx">c3</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">c4</span> <span class="o"><=</span> <span class="nx">deckSize</span><span class="p">;</span> <span class="nx">c4</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">r4</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">r3</span> <span class="o">+</span> <span class="nx">c4</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c5</span> <span class="o">=</span> <span class="nx">c4</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">c5</span> <span class="o"><=</span> <span class="nx">deckSize</span><span class="p">;</span> <span class="nx">c5</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">r5</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">r4</span> <span class="o">+</span> <span class="nx">c5</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c6</span> <span class="o">=</span> <span class="nx">c5</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">c6</span> <span class="o"><=</span> <span class="nx">deckSize</span><span class="p">;</span> <span class="nx">c6</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">r6</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">r5</span> <span class="o">+</span> <span class="nx">c6</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">c7</span> <span class="o">=</span> <span class="nx">c6</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">c7</span> <span class="o"><=</span> <span class="nx">deckSize</span><span class="p">;</span> <span class="nx">c7</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">r7</span> <span class="o">=</span> <span class="nx">evaluator</span><span class="p">[</span><span class="nx">r6</span> <span class="o">+</span> <span class="nx">c7</span><span class="p">];</span>
<span class="nx">freq</span><span class="p">[</span><span class="nx">r7</span> <span class="o">>></span> <span class="mi">12</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span>
<span class="kd">var</span> <span class="nx">finish</span> <span class="o">=</span> <span class="nb">Date</span><span class="p">.</span><span class="nx">now</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">total</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">key</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">key</span> <span class="o"><</span> <span class="nx">hands</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">key</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">total</span> <span class="o">+=</span> <span class="nx">freq</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">hands</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">+</span> <span class="s1">': '</span> <span class="o">+</span> <span class="nx">freq</span><span class="p">[</span><span class="nx">key</span><span class="p">]);</span>
<span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Total: '</span> <span class="o">+</span> <span class="nx">total</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">((</span><span class="nx">finish</span> <span class="o">-</span> <span class="nx">start</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'ms'</span><span class="p">);</span>
<span class="p">}