@xpressit/winning-poker-hand-rank
Version:
Determine winning poker hand rank
100 lines (99 loc) • 2.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.cardCompareDescFn = exports.toPlayingCard = exports.toCard = exports.RANK_ACE = exports.RANK_KING = exports.RANK_QUEEN = exports.RANK_JACK = exports.RANK_TEN = exports.RANK_NINE = exports.RANK_EIGHT = exports.RANK_SEVEN = exports.RANK_SIX = exports.RANK_FIVE = exports.RANK_FOUR = exports.RANK_THREE = exports.RANK_TWO = void 0;
// primes are the first 13 prime numbers (one per card rank).
const PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41];
exports.RANK_TWO = 0;
exports.RANK_THREE = 1;
exports.RANK_FOUR = 2;
exports.RANK_FIVE = 3;
exports.RANK_SIX = 4;
exports.RANK_SEVEN = 5;
exports.RANK_EIGHT = 6;
exports.RANK_NINE = 7;
exports.RANK_TEN = 8;
exports.RANK_JACK = 9;
exports.RANK_QUEEN = 10;
exports.RANK_KING = 11;
exports.RANK_ACE = 12;
const runeToRank = {
'2': exports.RANK_TWO,
'3': exports.RANK_THREE,
'4': exports.RANK_FOUR,
'5': exports.RANK_FIVE,
'6': exports.RANK_SIX,
'7': exports.RANK_SEVEN,
'8': exports.RANK_EIGHT,
'9': exports.RANK_NINE,
T: exports.RANK_TEN,
J: exports.RANK_JACK,
Q: exports.RANK_QUEEN,
K: exports.RANK_KING,
A: exports.RANK_ACE,
};
const runeToSuit = {
S: 1,
H: 2,
D: 4,
C: 8,
};
const toRankAndSuit = (playingCard) => {
const rank = runeToRank[playingCard[0]];
const suit = runeToSuit[playingCard[1]];
if (!suit || rank === undefined) {
throw new Error(`Invalid playing card: ${playingCard}`);
}
return [rank, suit];
};
const toCard = (playingCard) => {
const [rank, suit] = toRankAndSuit(playingCard);
return ((1 << rank) << 16) | (suit << 12) | (rank << 8) | PRIMES[rank];
};
exports.toCard = toCard;
const rankToRune = {
'12': 'A',
'11': 'K',
'10': 'Q',
'9': 'J',
'8': 'T',
'7': '9',
'6': '8',
'5': '7',
'4': '6',
'3': '5',
'2': '4',
'1': '3',
'0': '2',
};
const suitToRune = {
'8': 'C',
'4': 'D',
'2': 'H',
'1': 'S',
};
const getCardRank = (card) => {
return (card >> 8) & 0xf;
};
const getCardSuit = (card) => {
return (card >> 12) & 0xf;
};
const toPlayingCard = (card) => {
const rankRune = rankToRune['' + getCardRank(card)];
const suitRune = suitToRune['' + getCardSuit(card)];
if (!rankRune || !suitRune) {
throw new Error(`Cannot convert Card ${card} to PlayingCard`);
}
return (rankRune + suitRune);
};
exports.toPlayingCard = toPlayingCard;
const cardCompareDescFn = (c1, c2) => {
const r1 = getCardRank(c1);
const r2 = getCardRank(c2);
if (r1 === r2) {
const s1 = getCardSuit(c1);
const s2 = getCardSuit(c2);
return s2 - s1;
}
return r2 - r1;
};
exports.cardCompareDescFn = cardCompareDescFn;