UNPKG

texas-without-memcpy

Version:

Texas Hold'em hand evaluator for node.js.

144 lines 50.2 kB
<!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">&#182;</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">&#182;</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">&#39;underscore&#39;</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">&#39;fs&#39;</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">&#39;crypto&#39;</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">&#39;compress-buffer&#39;</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">&#182;</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">&#182;</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">&#182;</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">&#39;23456789TJQKAc♣d♦h♥s♠&#39;</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">&#182;</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">&#39;Two&#39;</span><span class="p">,</span> <span class="s1">&#39;Three&#39;</span><span class="p">,</span> <span class="s1">&#39;Four&#39;</span><span class="p">,</span> <span class="s1">&#39;Five&#39;</span><span class="p">,</span> <span class="s1">&#39;Six&#39;</span><span class="p">,</span> <span class="s1">&#39;Seven&#39;</span><span class="p">,</span> <span class="s1">&#39;Eight&#39;</span><span class="p">,</span> <span class="s1">&#39;Nine&#39;</span><span class="p">,</span> <span class="s1">&#39;Ten&#39;</span><span class="p">,</span> <span class="s1">&#39;Jack&#39;</span><span class="p">,</span> <span class="s1">&#39;Queen&#39;</span><span class="p">,</span> <span class="s1">&#39;King&#39;</span><span class="p">,</span> <span class="s1">&#39;Ace&#39;</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">&#182;</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">&#39;Clubs&#39;</span><span class="p">,</span> <span class="s1">&#39;Diamonds&#39;</span><span class="p">,</span> <span class="s1">&#39;Hearts&#39;</span><span class="p">,</span> <span class="s1">&#39;Spades&#39;</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">&#182;</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">&#39;Invalid&#39;</span><span class="p">,</span> <span class="s1">&#39;High Card&#39;</span><span class="p">,</span> <span class="s1">&#39;One Pair&#39;</span><span class="p">,</span> <span class="s1">&#39;Two Pairs&#39;</span><span class="p">,</span> <span class="s1">&#39;Three of a Kind&#39;</span><span class="p">,</span> <span class="s1">&#39;Straight&#39;</span><span class="p">,</span> <span class="s1">&#39;Flush&#39;</span><span class="p">,</span> <span class="s1">&#39;Full House&#39;</span><span class="p">,</span> <span class="s1">&#39;Four of a Kind&#39;</span><span class="p">,</span> <span class="s1">&#39;Straight Flush&#39;</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">&#182;</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">&#39;/HandRanks.dat.gz&#39;</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">&#182;</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">&#182;</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">&#39;number&#39;</span><span class="p">)</span> <span class="k">return</span> <span class="nx">card</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="nx">card</span> <span class="o">&lt;=</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">&#39;string&#39;</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">&gt;&gt;</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">&#39;number&#39;</span> <span class="o">||</span> <span class="nx">posRank</span> <span class="o">&gt;=</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">&lt;</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">&#182;</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">&gt;&gt;</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">&amp;</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">&#182;</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">&#182;</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">&lt;&lt;</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">&gt;</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">&lt;&lt;</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">&#182;</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">&lt;</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">&lt;</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">&gt;&gt;</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">&#182;</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">&#182;</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">&#182;</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">&lt;</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">&lt;=</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">&lt;</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">&#182;</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">&lt;</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">&lt;</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">&#182;</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">&lt;</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">&lt;</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">&gt;</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">&lt;</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">&#182;</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">&lt;</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">&#182;</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">&#39; of &#39;</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">&#182;</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">&lt;&lt;</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">&#182;</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">&lt;&lt;</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">&#182;</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">&#182;</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">&lt;=</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">&lt;=</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">&lt;=</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">&lt;=</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">&lt;=</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">&lt;=</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">&lt;=</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">&gt;&gt;</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">&lt;</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">&#39;: &#39;</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">&#39;Total: &#39;</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">&#39;ms&#39;</span><span class="p">);</span> <span class="p">}