poker: simplify a bit.

locals-and-roots
John Benediktsson 2016-04-14 14:07:37 -07:00
parent 950f42eedd
commit 4945269664
1 changed files with 21 additions and 55 deletions

View File

@ -31,25 +31,6 @@ IN: poker
! b = bit turned on depending on rank of card ! b = bit turned on depending on rank of card
! x = bit turned off, not used ! x = bit turned off, not used
CONSTANT: CLUB 8
CONSTANT: DIAMOND 4
CONSTANT: HEART 2
CONSTANT: SPADE 1
CONSTANT: DEUCE 0
CONSTANT: TREY 1
CONSTANT: FOUR 2
CONSTANT: FIVE 3
CONSTANT: SIX 4
CONSTANT: SEVEN 5
CONSTANT: EIGHT 6
CONSTANT: NINE 7
CONSTANT: TEN 8
CONSTANT: JACK 9
CONSTANT: QUEEN 10
CONSTANT: KING 11
CONSTANT: ACE 12
CONSTANT: STRAIGHT_FLUSH 0 CONSTANT: STRAIGHT_FLUSH 0
CONSTANT: FOUR_OF_A_KIND 1 CONSTANT: FOUR_OF_A_KIND 1
CONSTANT: FULL_HOUSE 2 CONSTANT: FULL_HOUSE 2
@ -60,43 +41,24 @@ CONSTANT: TWO_PAIR 6
CONSTANT: ONE_PAIR 7 CONSTANT: ONE_PAIR 7
CONSTANT: HIGH_CARD 8 CONSTANT: HIGH_CARD 8
CONSTANT: SUIT_STR { "C" "D" "H" "S" } CONSTANT: SUITS { "C" "D" "H" "S" }
CONSTANT: RANK_STR { "2" "3" "4" "5" "6" "7" "8" "9" "T" "J" "Q" "K" "A" } CONSTANT: RANKS { "2" "3" "4" "5" "6" "7" "8" "9" "T" "J" "Q" "K" "A" }
CONSTANT: VALUE_STR { "Straight Flush" "Four of a Kind" "Full House" "Flush" CONSTANT: VALUES { "Straight Flush" "Four of a Kind" "Full House" "Flush"
"Straight" "Three of a Kind" "Two Pair" "One Pair" "High Card" } "Straight" "Three of a Kind" "Two Pair" "One Pair" "High Card" }
: card-rank-prime ( rank -- n ) : card-suit ( suit -- n )
RANK_STR index { 2 3 5 7 11 13 17 19 23 29 31 37 41 } nth ; SUITS index 3 swap - 2^ ;
: card-rank ( rank -- n ) : card-rank ( rank -- n )
{ RANKS index ;
{ "2" [ DEUCE ] }
{ "3" [ TREY ] }
{ "4" [ FOUR ] }
{ "5" [ FIVE ] }
{ "6" [ SIX ] }
{ "7" [ SEVEN ] }
{ "8" [ EIGHT ] }
{ "9" [ NINE ] }
{ "T" [ TEN ] }
{ "J" [ JACK ] }
{ "Q" [ QUEEN ] }
{ "K" [ KING ] }
{ "A" [ ACE ] }
} case ;
: card-suit ( suit -- n ) : card-rank-prime ( rank -- n )
{ card-rank { 2 3 5 7 11 13 17 19 23 29 31 37 41 } nth ;
{ "C" [ CLUB ] }
{ "D" [ DIAMOND ] }
{ "H" [ HEART ] }
{ "S" [ SPADE ] }
} case ;
: card-rank-bit ( rank -- n ) : card-rank-bit ( rank -- n )
RANK_STR index 1 swap shift ; card-rank 2^ ;
: card-bitfield ( rank rank suit rank -- n ) : card-bitfield ( rank rank suit rank -- n )
{ {
@ -113,6 +75,7 @@ CONSTANT: VALUE_STR { "Straight Flush" "Four of a Kind" "Full House" "Flush"
GENERIC: >ckf ( string -- n ) GENERIC: >ckf ( string -- n )
M: string >ckf >upper 1 cut (>ckf) ; M: string >ckf >upper 1 cut (>ckf) ;
M: integer >ckf ; M: integer >ckf ;
: parse-cards ( string -- seq ) : parse-cards ( string -- seq )
@ -142,14 +105,18 @@ M: integer >ckf ;
bitxor values-table nth ; bitxor values-table nth ;
: hand-value ( cards -- value ) : hand-value ( cards -- value )
dup flush? [ flushes-table lookup ] [ dup flush? [
dup unique5-table lookup dup 0 > [ nip ] [ flushes-table lookup
] [
dup unique5-table lookup dup 0 > [
nip
] [
drop prime-bits perfect-hash-find drop prime-bits perfect-hash-find
] if ] if
] if ; ] if ;
: >card-rank ( card -- string ) : >card-rank ( card -- string )
-8 shift 0xF bitand RANK_STR nth ; -8 shift 0xF bitand RANKS nth ;
: >card-suit ( card -- string ) : >card-suit ( card -- string )
{ {
@ -178,7 +145,7 @@ M: integer >ckf ;
PRIVATE> PRIVATE>
: <deck> ( -- deck ) : <deck> ( -- deck )
RANK_STR SUIT_STR 2array RANKS SUITS 2array
[ concat >ckf ] V{ } product-map-as randomize ; [ concat >ckf ] V{ } product-map-as randomize ;
: best-holdem-hand ( hand -- n cards ) : best-holdem-hand ( hand -- n cards )
@ -186,7 +153,7 @@ PRIVATE>
infimum first2 ; infimum first2 ;
: value>string ( n -- string ) : value>string ( n -- string )
value>rank VALUE_STR nth ; value>rank VALUES nth ;
: hand>card-names ( hand -- string ) : hand>card-names ( hand -- string )
[ card>string ] map ; [ card>string ] map ;
@ -238,8 +205,7 @@ ERROR: no-card card deck ;
ERROR: bad-suit-symbol ch ; ERROR: bad-suit-symbol ch ;
: symbol>suit ( ch -- ch' ) : symbol>suit ( ch -- ch' )
ch>upper ch>upper H{
H{
{ CHAR: ♠ CHAR: S } { CHAR: ♠ CHAR: S }
{ CHAR: ♦ CHAR: D } { CHAR: ♦ CHAR: D }
{ CHAR: ♥ CHAR: H } { CHAR: ♥ CHAR: H }
@ -254,7 +220,7 @@ ERROR: bad-suit-symbol ch ;
1 over [ symbol>suit ] change-nth >ckf ; 1 over [ symbol>suit ] change-nth >ckf ;
: value>hand-name ( value -- string ) : value>hand-name ( value -- string )
value>rank VALUE_STR nth ; value>rank VALUES nth ;
: string>hand-name ( string -- string' ) : string>hand-name ( string -- string' )
string>value value>hand-name ; string>value value>hand-name ;