Hand Analyzer Raw
Analyze 5 card Poker hands, Blackjack hands or 5+ card Cribbage hands.
by subskybox
HTML
<div id="output"/>
JavaScript
hands=["4 of a Kind", "Straight Flush", "Straight", "Flush", "High Card",
"1 Pair", "2 Pair", "Royal Flush", "3 of a Kind", "Full House" ];
output = document.getElementById('output');
var A=14, K=13, Q=12, J=11, _ = { "♠":1, "♣":2, "♥":4, "♦":8 };
//Calculates the Rank of a 5 card Poker hand using bit manipulations.
function rankPokerHand(cs,ss) {
for (var v=0,i=0,o,s; i<5; i++) {v += (o=Math.pow(2,cs[i]*4))*((v/o&15)+1);}; v %= 15;
v -= (((s=1<<cs[0]|1<<cs[1]|1<<cs[2]|1<<cs[3]|1<<cs[4]) == 0x403c)||(s/(s&-s) == 31) ? 3 : 1);
v -= (ss[0] == (ss[1]|ss[2]|ss[3]|ss[4])) * ((s == 0x7c00) ? -5 : 1);
output.innerHTML += "Hand: " + hands[v] + (s == 0x403c?" (Ace low)":"")+"<br/>";
}
//Calculates the score of a 5+ card Cribbage Hand. Assumes the cut card is last.
function rankCribbageHand(cs, ss) {
var dupsArr = [0,0,0,0,0,0,0,0,0,0,0,0,0], ccs = [], L = cs.length, points = 0, i, v, c, fc, as;
for (i = 0; i < L; i++) { ccs[i] = (cs[i]-1)%13+1; dupsArr[ccs[i]-1]++; } //Make ♠ Low
var runs = dupsArr.join("").match(/[^0]{3,}/g); //Runs - 'eval' for IE8 :(
for (i in runs) {if (i-0==i) {points+=runs[i].length*eval(runs[i].split('').join('*'));}}
for (i=0;i < 13; i++) {points+= dupsArr[i] * (dupsArr[i]-1);} //Pairs
for (i=3; i<Math.pow(2,L); i++, points += (fc==15) ? 2 : 0) { //Fifteen
for (v=i, fc=c=0; c<L && v; fc += ((1<<c&i) ? Math.min(ccs[c],10) : 0), v>>=1, c++) {}}
for (i=1, as=true; i<L-1 && as; as = (ss[i] == ss[0]), i++){} //Flush
if (as) {points += (ss[0] == ss[L-1]) ? L : L-1;}
for (i=0; i<L-1; i++) { if (ccs[i] == 11 && ss[i] == ss[L-1]) { points++; break; }} //Nobs
output.innerHTML += "TOTAL POINTS: " + points + "<br/>";
}
function rankBlackjackHand(cs) {
var sum = 0, sumA, i;
for (i = 0; i < cs.length; i++) { sum += Math.min((cs[i]-1)%13+1,10); } //Make ♠ low, face cards 10 & sum
sumA = (cs.indexOf(14) >= 0) ? sum + 10 : 0; //Add 10 if the hand contains an Ace
if (sumA &&...