checkpoint for sleep
This commit is contained in:
parent
830e6b66bf
commit
032b64b4cb
@ -9,17 +9,17 @@ import rand "math/rand"
|
|||||||
|
|
||||||
import "strings"
|
import "strings"
|
||||||
|
|
||||||
/*
|
|
||||||
const CLUB = "\u2663"
|
const CLUB = "\u2663"
|
||||||
const SPADE = "\u2660"
|
const SPADE = "\u2660"
|
||||||
const DIAMOND = "\u2666"
|
const DIAMOND = "\u2666"
|
||||||
const HEART = "\u2665"
|
const HEART = "\u2665"
|
||||||
*/
|
|
||||||
|
|
||||||
|
/*
|
||||||
const CLUB = "C"
|
const CLUB = "C"
|
||||||
const SPADE = "S"
|
const SPADE = "S"
|
||||||
const DIAMOND = "D"
|
const DIAMOND = "D"
|
||||||
const HEART = "H"
|
const HEART = "H"
|
||||||
|
*/
|
||||||
|
|
||||||
type TestGenerationIteration struct {
|
type TestGenerationIteration struct {
|
||||||
Deck *Deck
|
Deck *Deck
|
||||||
@ -35,10 +35,41 @@ type Cards []*Card
|
|||||||
|
|
||||||
type Deck struct {
|
type Deck struct {
|
||||||
Cards Cards
|
Cards Cards
|
||||||
Dealt int
|
DealIndex int
|
||||||
ShuffleSeedVal int64
|
ShuffleSeedVal int64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func formatCardsForTerminal(c Cards) (output string) {
|
||||||
|
var cardstrings []string
|
||||||
|
for i := 0; i < len(c); i++ {
|
||||||
|
cardstrings = append(cardstrings, formatCardForTerminal(*c[i]))
|
||||||
|
}
|
||||||
|
output = strings.Join(cardstrings, ",")
|
||||||
|
return output
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatCardForTerminal(c Card) (output string) {
|
||||||
|
var rank string
|
||||||
|
var suit string
|
||||||
|
color := Red
|
||||||
|
switch c.Suit {
|
||||||
|
case DIAMOND:
|
||||||
|
color = Blue
|
||||||
|
case HEART:
|
||||||
|
color = Red
|
||||||
|
case CLUB:
|
||||||
|
color = Green
|
||||||
|
case SPADE:
|
||||||
|
color = Black
|
||||||
|
}
|
||||||
|
|
||||||
|
rank = fmt.Sprintf("%s", BgGray(Bold(color(c.Rank))))
|
||||||
|
suit = fmt.Sprintf("%s", BgGray(Bold(color(c.Suit))))
|
||||||
|
output = fmt.Sprintf("%s%s", rank, suit)
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
func cryptoUint64() (v uint64) {
|
func cryptoUint64() (v uint64) {
|
||||||
err := binary.Read(crand.Reader, binary.BigEndian, &v)
|
err := binary.Read(crand.Reader, binary.BigEndian, &v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -48,33 +79,8 @@ func cryptoUint64() (v uint64) {
|
|||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRandom() *rand.Rand {
|
|
||||||
|
|
||||||
trueRandom := true
|
|
||||||
|
|
||||||
var rnd *rand.Rand
|
|
||||||
|
|
||||||
return rnd
|
|
||||||
}
|
|
||||||
|
|
||||||
func (self *Card) String() string {
|
func (self *Card) String() string {
|
||||||
var rank string
|
return fmt.Sprintf("%s%s", self.Rank, self.Suit)
|
||||||
var suit string
|
|
||||||
color := Red
|
|
||||||
switch self.Suit {
|
|
||||||
case DIAMOND:
|
|
||||||
color = Blue
|
|
||||||
case HEART:
|
|
||||||
color = Red
|
|
||||||
case CLUB:
|
|
||||||
color = Green
|
|
||||||
case SPADE:
|
|
||||||
color = Black
|
|
||||||
}
|
|
||||||
|
|
||||||
rank = fmt.Sprintf("%s", BgGray(Bold(color(self.Rank))))
|
|
||||||
suit = fmt.Sprintf("%s", BgGray(Bold(color(self.Suit))))
|
|
||||||
return fmt.Sprintf("%s%s", rank, suit)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDeck() *Deck {
|
func NewDeck() *Deck {
|
||||||
@ -82,7 +88,7 @@ func NewDeck() *Deck {
|
|||||||
self := new(Deck)
|
self := new(Deck)
|
||||||
|
|
||||||
ranks := []string{"A", "2", "3", "4", "5", "6", "7",
|
ranks := []string{"A", "2", "3", "4", "5", "6", "7",
|
||||||
"8", "9", "10", "J", "Q", "K"}
|
"8", "9", "T", "J", "Q", "K"}
|
||||||
|
|
||||||
suits := []string{HEART, DIAMOND, CLUB, SPADE}
|
suits := []string{HEART, DIAMOND, CLUB, SPADE}
|
||||||
|
|
||||||
@ -98,7 +104,7 @@ func NewDeck() *Deck {
|
|||||||
tot++
|
tot++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.Dealt = 0
|
self.DealIndex = 0
|
||||||
return self
|
return self
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,28 +112,37 @@ func (self *Deck) ShuffleRandomly() {
|
|||||||
rnd := rand.New(rand.NewSource(int64(cryptoUint64())))
|
rnd := rand.New(rand.NewSource(int64(cryptoUint64())))
|
||||||
//FIXME(sneak) not sure if this is constant time or not
|
//FIXME(sneak) not sure if this is constant time or not
|
||||||
rnd.Shuffle(len(self.Cards), func(i, j int) { self.Cards[i], self.Cards[j] = self.Cards[j], self.Cards[i] })
|
rnd.Shuffle(len(self.Cards), func(i, j int) { self.Cards[i], self.Cards[j] = self.Cards[j], self.Cards[i] })
|
||||||
|
self.DealIndex = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Deck) ShuffleDeterministic(int64 seed) {
|
func (self *Deck) ShuffleDeterministically(seed int64) {
|
||||||
r := rand.New(rand.NewSource(seed))
|
r := rand.New(rand.NewSource(seed))
|
||||||
//FIXME(sneak) not sure if this is constant time or not
|
//FIXME(sneak) not sure if this is constant time or not
|
||||||
r.Shuffle(len(self.Cards), func(i, j int) { self.Cards[i], self.Cards[j] = self.Cards[j], self.Cards[i] })
|
r.Shuffle(len(self.Cards), func(i, j int) { self.Cards[i], self.Cards[j] = self.Cards[j], self.Cards[i] })
|
||||||
|
self.DealIndex = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Deck) Deal(n int) (output Cards) {
|
func (self *Deck) Deal(n int) (output Cards) {
|
||||||
|
|
||||||
if (self.Dealt + n) > len(self.Cards) {
|
if (self.DealIndex + n) > len(self.Cards) {
|
||||||
return output
|
return output
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
card := self.Cards[self.Dealt+1]
|
output = append(output, self.Cards[self.DealIndex+1])
|
||||||
output = append(output, card)
|
self.DealIndex++
|
||||||
self.Dealt++
|
|
||||||
}
|
}
|
||||||
return output
|
return output
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *Deck) Dealt() int {
|
||||||
|
return self.DealIndex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Deck) Remaining() int {
|
||||||
|
return (len(self.Cards) - self.DealIndex)
|
||||||
|
}
|
||||||
|
|
||||||
func (s Cards) String() (output string) {
|
func (s Cards) String() (output string) {
|
||||||
var cardstrings []string
|
var cardstrings []string
|
||||||
for i := 0; i < len(s); i++ {
|
for i := 0; i < len(s); i++ {
|
||||||
@ -142,12 +157,51 @@ func generate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func proto() {
|
func proto() {
|
||||||
|
|
||||||
myDeck := NewDeck()
|
myDeck := NewDeck()
|
||||||
myDeck.Shuffle()
|
myDeck.ShuffleDeterministically(42)
|
||||||
myHand := myDeck.Deal(2)
|
myHand := myDeck.Deal(2)
|
||||||
//spew.Dump(myHand)
|
//spew.Dump(myHand)
|
||||||
fmt.Printf("my hand: %s\n", myHand)
|
fmt.Printf("my hand: %s\n", myHand)
|
||||||
cmty := myDeck.Deal(5)
|
cmty := myDeck.Deal(5)
|
||||||
fmt.Printf("community: %s\n", cmty)
|
fmt.Printf("community: %s\n", cmty)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func scorePokerHand(input Cards) (score int) {
|
||||||
|
/*
|
||||||
|
|
||||||
|
scoring system:
|
||||||
|
high card:
|
||||||
|
high card * 14^4
|
||||||
|
+ first kicker * 14^3
|
||||||
|
+ second kicker * 14^2
|
||||||
|
+ third kicker * 14
|
||||||
|
+ fourth kicker
|
||||||
|
max(AKQJ9): 576,011
|
||||||
|
single pair:
|
||||||
|
pair value * 1,000,000
|
||||||
|
+ first kicker * 14^2
|
||||||
|
+ second kicker * 14
|
||||||
|
+ third kicker
|
||||||
|
max(AAKQJ): 14,002,727
|
||||||
|
two pair:
|
||||||
|
higher of the two pair value * 100,000,000
|
||||||
|
+ lower of the two pair value * 14
|
||||||
|
+ kicker value
|
||||||
|
max(AAKKQ): 1,300,000,179
|
||||||
|
trips:
|
||||||
|
trips value * 1,000,000,000 (min 2,000,000,000)
|
||||||
|
+ first kicker * 14
|
||||||
|
+ second kicker
|
||||||
|
max (AAAKQ): 14,000,000,194
|
||||||
|
straight:
|
||||||
|
highest card * 10,000,000,000
|
||||||
|
straight to the ace: 140,000,000,000
|
||||||
|
flush:
|
||||||
|
highest card * 100,000,000,000
|
||||||
|
min(23457): 700,000,000,000
|
||||||
|
max(AXXXX): 1,400,000,000,000
|
||||||
|
boat:
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
@ -2,6 +2,26 @@ package pokercore
|
|||||||
|
|
||||||
import "testing"
|
import "testing"
|
||||||
|
|
||||||
|
type ShuffleTestResults []struct {
|
||||||
|
SeedVal int64
|
||||||
|
Expected string
|
||||||
|
}
|
||||||
|
|
||||||
func TestPokerHand(t *testing.T) {
|
func TestPokerHand(t *testing.T) {
|
||||||
//test stuff here
|
//test stuff here
|
||||||
|
d := NewDeck()
|
||||||
|
d.ShuffleDeterministically(437)
|
||||||
|
cards := d.Deal(7)
|
||||||
|
//expected := "7C,5S,QS,2D,6D,QC,3H"
|
||||||
|
expected := "7♣,5♠,Q♠,2♦,6♦,Q♣,3♥"
|
||||||
|
if s := cards.String(); s != expected {
|
||||||
|
t.Errorf("didn't get expected cards, got %s", s)
|
||||||
|
} else {
|
||||||
|
t.Logf("got expected cards %s", s)
|
||||||
|
}
|
||||||
|
|
||||||
|
x := d.Remaining()
|
||||||
|
if x != 45 {
|
||||||
|
t.Errorf("expected 45 left, got %d", x)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user