UNPKG

@xpressit/winning-poker-hand-rank

Version:
100 lines (99 loc) 2.8 kB
"use strict"; 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;