poker: simplify a bit.
parent
950f42eedd
commit
4945269664
|
@ -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 ;
|
||||||
|
|
Loading…
Reference in New Issue