chore: cleanup
This commit is contained in:
parent
fb09a45cab
commit
50f1016372
1000
day07/input2.txt
Normal file
1000
day07/input2.txt
Normal file
File diff suppressed because it is too large
Load Diff
144
day07/main.go
144
day07/main.go
|
@ -26,7 +26,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func run(scan *bufio.Scanner) (uint64, uint64) {
|
func run(scan *bufio.Scanner) (uint64, uint64) {
|
||||||
var game Game
|
var game1, game2 Game
|
||||||
|
|
||||||
for scan.Scan() {
|
for scan.Scan() {
|
||||||
var cards string
|
var cards string
|
||||||
|
@ -37,15 +37,18 @@ func run(scan *bufio.Scanner) (uint64, uint64) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("cards", cards, "bid", bid)
|
fmt.Println("cards", cards, "bid", bid)
|
||||||
game.plays = append(game.plays, Play{bid, []rune(cards), &game})
|
game1.Append(cards, bid)
|
||||||
|
game2.Append(cards, bid)
|
||||||
}
|
}
|
||||||
|
|
||||||
game.cardOrder = getOrder(cardTypes1)
|
game1.cardTypes = cardTypes1
|
||||||
product1 := calcProduct(game)
|
game1.cardOrder = getOrder(cardTypes1)
|
||||||
|
product1 := calcProduct(game1)
|
||||||
|
|
||||||
game.cardOrder = getOrder(cardTypes2)
|
game2.cardTypes = cardTypes2
|
||||||
game.wildCard = 'J'
|
game2.cardOrder = getOrder(cardTypes2)
|
||||||
product2 := calcProduct(game)
|
game2.wildCard = 'J'
|
||||||
|
product2 := calcProduct(game2)
|
||||||
|
|
||||||
return product1, product2
|
return product1, product2
|
||||||
}
|
}
|
||||||
|
@ -76,92 +79,108 @@ func getOrder(cardTypes []rune) map[rune]int {
|
||||||
type Game struct {
|
type Game struct {
|
||||||
plays Plays
|
plays Plays
|
||||||
cardOrder map[rune]int
|
cardOrder map[rune]int
|
||||||
|
|
||||||
|
cardTypes []rune
|
||||||
wildCard rune
|
wildCard rune
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *Game) Append(cards string, bid int) {
|
||||||
|
p := Play{bid: bid, hand: []rune(cards), game: g}
|
||||||
|
g.plays = append(g.plays, p)
|
||||||
|
}
|
||||||
|
|
||||||
type Play struct {
|
type Play struct {
|
||||||
bid int
|
bid int
|
||||||
hand Hand
|
hand Hand
|
||||||
|
cardCounts map[rune]int
|
||||||
|
strength int
|
||||||
|
|
||||||
game *Game
|
game *Game
|
||||||
}
|
}
|
||||||
|
|
||||||
type Hand []rune
|
type Hand []rune
|
||||||
|
|
||||||
func (h Play) HandType() string {
|
func (h *Play) HandType() string {
|
||||||
hc, _ := h.HighCard()
|
hs := h.HandStrength()
|
||||||
switch {
|
kind := hs& 0xf00000
|
||||||
case h.IsFiveOfKind():
|
hc := h.game.cardTypes[13-hs&0xf0000>>16]
|
||||||
|
switch kind {
|
||||||
|
case 0x700000:
|
||||||
return "5K-" + string(hc)
|
return "5K-" + string(hc)
|
||||||
case h.IsFourOfKind():
|
case 0x600000:
|
||||||
return "4K-" + string(hc)
|
return "4K-" + string(hc)
|
||||||
case h.IsFullHouse():
|
case 0x500000:
|
||||||
return "FH-" + string(hc)
|
return "FH-" + string(hc)
|
||||||
case h.IsThreeOfKind():
|
case 0x400000:
|
||||||
return "3K-" + string(hc)
|
return "3K-" + string(hc)
|
||||||
case h.IsTwoPair():
|
case 0x300000:
|
||||||
return "2P-" + string(hc)
|
return "2P-" + string(hc)
|
||||||
case h.IsOnePair():
|
case 0x200000:
|
||||||
return "1P-" + string(hc)
|
return "1P-" + string(hc)
|
||||||
case h.IsHighCard():
|
case 0x100000:
|
||||||
return "HC-" + string(hc)
|
return "HC-" + string(hc)
|
||||||
}
|
}
|
||||||
return "Uno"
|
return "Uno"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h Play) HandStrength() int {
|
func (p *Play) HandStrength() int {
|
||||||
_, v := h.HighCard()
|
_, v := p.HighCard()
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case h.IsFiveOfKind():
|
case p.IsFiveOfKind():
|
||||||
return 0x700000 | v
|
p.strength = 0x700000 | v
|
||||||
case h.IsFourOfKind():
|
case p.IsFourOfKind():
|
||||||
return 0x600000 | v
|
p.strength = 0x600000 | v
|
||||||
case h.IsFullHouse():
|
case p.IsFullHouse():
|
||||||
return 0x500000 | v
|
p.strength = 0x500000 | v
|
||||||
case h.IsThreeOfKind():
|
case p.IsThreeOfKind():
|
||||||
return 0x400000 | v
|
p.strength = 0x400000 | v
|
||||||
case h.IsTwoPair():
|
case p.IsTwoPair():
|
||||||
return 0x300000 | v
|
p.strength = 0x300000 | v
|
||||||
case h.IsOnePair():
|
case p.IsOnePair():
|
||||||
return 0x200000 | v
|
p.strength = 0x200000 | v
|
||||||
case h.IsHighCard():
|
case p.IsHighCard():
|
||||||
return 0x100000 | v
|
p.strength = 0x100000 | v
|
||||||
}
|
}
|
||||||
return 0
|
return p.strength
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h Play) IsFiveOfKind() bool {
|
func (h Play) IsFiveOfKind() bool {
|
||||||
_, _, _, _, has5 := h.game.hasSame(h.hand)
|
_, _, _, _, has5 := h.game.hasSame(h.cardCounts)
|
||||||
return has5
|
return has5
|
||||||
}
|
}
|
||||||
func (h Play) IsFourOfKind() bool {
|
func (h Play) IsFourOfKind() bool {
|
||||||
_, _, _, has4, _ := h.game.hasSame(h.hand)
|
_, _, _, has4, _ := h.game.hasSame(h.cardCounts)
|
||||||
return has4
|
return has4
|
||||||
}
|
}
|
||||||
func (h Play) IsFullHouse() bool {
|
func (h Play) IsFullHouse() bool {
|
||||||
_, has2, has3, _, _ := h.game.hasSame(h.hand)
|
_, has2, has3, _, _ := h.game.hasSame(h.cardCounts)
|
||||||
return has3 && has2
|
return has3 && has2
|
||||||
}
|
}
|
||||||
func (h Play) IsThreeOfKind() bool {
|
func (h Play) IsThreeOfKind() bool {
|
||||||
has1, _, has3, _, _ := h.game.hasSame(h.hand)
|
has1, _, has3, _, _ := h.game.hasSame(h.cardCounts)
|
||||||
return has3 && has1
|
return has3 && has1
|
||||||
}
|
}
|
||||||
func (h Play) IsTwoPair() bool {
|
func (h Play) IsTwoPair() bool {
|
||||||
_, has2, has3, _, _ := h.game.hasSame(h.hand)
|
_, has2, has3, _, _ := h.game.hasSame(h.cardCounts)
|
||||||
return !has3 && has2 && h.game.pairs(h.hand) == 2
|
return !has3 && has2 && h.game.pairs(h.cardCounts) == 2
|
||||||
}
|
}
|
||||||
func (h Play) IsOnePair() bool {
|
func (h Play) IsOnePair() bool {
|
||||||
_, has2, has3, _, _ := h.game.hasSame(h.hand)
|
_, has2, has3, _, _ := h.game.hasSame(h.cardCounts)
|
||||||
return !has3 && has2 && h.game.pairs(h.hand) == 1
|
return !has3 && has2 && h.game.pairs(h.cardCounts) == 1
|
||||||
}
|
}
|
||||||
func (h Play) IsHighCard() bool {
|
func (h Play) IsHighCard() bool {
|
||||||
has1, has2, has3, has4, _ := h.game.hasSame(h.hand)
|
has1, has2, has3, has4, _ := h.game.hasSame(h.cardCounts)
|
||||||
return has1 && !has2 && !has3 && !has4
|
return has1 && !has2 && !has3 && !has4
|
||||||
}
|
}
|
||||||
func (h Play) HighCard() (rune, int) {
|
func (h *Play) HighCard() (rune, int) {
|
||||||
|
if h.cardCounts == nil {
|
||||||
|
h.generateCounts()
|
||||||
|
}
|
||||||
|
|
||||||
var i int
|
var i int
|
||||||
pairs := make(Pairs, 5)
|
pairs := make(Pairs, 5)
|
||||||
cnt := h.game.Counts(h.hand)
|
for r, c := range h.cardCounts {
|
||||||
for r, c := range cnt {
|
|
||||||
pairs[i].c = c
|
pairs[i].c = c
|
||||||
pairs[i].r = r
|
pairs[i].r = r
|
||||||
pairs[i].o = h.game.cardOrder[r]
|
pairs[i].o = h.game.cardOrder[r]
|
||||||
|
@ -204,29 +223,32 @@ func (p Plays) Len() int { return len(p) }
|
||||||
func (p Plays) Less(i, j int) bool { return p[i].HandStrength() < p[j].HandStrength() }
|
func (p Plays) Less(i, j int) bool { return p[i].HandStrength() < p[j].HandStrength() }
|
||||||
func (p Plays) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
func (p Plays) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
||||||
|
|
||||||
func (g *Game) Counts(cards []rune) map[rune]int {
|
func (p *Play) generateCounts() {
|
||||||
m := make(map[rune]int, len(g.cardOrder))
|
cardOrder := p.game.cardOrder
|
||||||
for _, c := range cards {
|
wildCard := p.game.wildCard
|
||||||
m[c]++
|
|
||||||
|
p.cardCounts = make(map[rune]int, len(cardOrder))
|
||||||
|
for _, c := range p.hand {
|
||||||
|
p.cardCounts[c]++
|
||||||
}
|
}
|
||||||
if g.wildCard != 0 && m[g.wildCard] > 0 {
|
|
||||||
|
if wildCard != 0 && p.cardCounts[wildCard] > 0 {
|
||||||
var maxK rune
|
var maxK rune
|
||||||
var maxV int
|
var maxV int
|
||||||
for k, v := range m {
|
for k, v := range p.cardCounts {
|
||||||
if k != g.wildCard && v > maxV {
|
if k != wildCard && v > maxV {
|
||||||
maxK, maxV = k, v
|
maxK, maxV = k, v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if maxK != 0 {
|
if maxK != 0 {
|
||||||
m[maxK] += m[g.wildCard]
|
p.cardCounts[maxK] += p.cardCounts[wildCard]
|
||||||
delete(m, g.wildCard)
|
delete(p.cardCounts, wildCard)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return m
|
|
||||||
}
|
}
|
||||||
func (g *Game) hasSame(cards []rune) (has1, has2, has3, has4, has5 bool) {
|
func (g *Game) hasSame(counts map[rune]int) (has1, has2, has3, has4, has5 bool) {
|
||||||
cnt := g.Counts(cards)
|
for _, c := range counts {
|
||||||
for _, c := range cnt {
|
|
||||||
switch c {
|
switch c {
|
||||||
case 1:
|
case 1:
|
||||||
has1 = true
|
has1 = true
|
||||||
|
@ -246,9 +268,9 @@ func (g *Game) hasSame(cards []rune) (has1, has2, has3, has4, has5 bool) {
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
func (g *Game) pairs(cards []rune) int {
|
func (g *Game) pairs(counts map[rune]int) int {
|
||||||
pairs := 0
|
pairs := 0
|
||||||
for _, n := range g.Counts(cards) {
|
for _, n := range counts {
|
||||||
if n == 2 {
|
if n == 2 {
|
||||||
pairs++
|
pairs++
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,18 +26,21 @@ func TestHands(t *testing.T) {
|
||||||
var game Game
|
var game Game
|
||||||
game.cardOrder = getOrder(cardTypes1)
|
game.cardOrder = getOrder(cardTypes1)
|
||||||
|
|
||||||
h := Play{0, []rune("AAA23"), &game}
|
h := Play{hand: []rune("AAA23"), game: &game}
|
||||||
|
// h.generateCounts()
|
||||||
is.Equal(h.HandType(), "3K-A")
|
is.Equal(h.HandType(), "3K-A")
|
||||||
|
|
||||||
h = Play{0, []rune("JJJJJ"), &game}
|
h = Play{hand: []rune("JJJJJ"), game:&game}
|
||||||
|
h.generateCounts()
|
||||||
|
|
||||||
is.Equal(h.HandType(), "5K-J")
|
is.Equal(h.HandType(), "5K-J")
|
||||||
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "7aaaaa")
|
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "7aaaaa")
|
||||||
|
|
||||||
h = Play{0, []rune("KKKKJ"), &game}
|
h = Play{hand: []rune("KKKKJ"), game: &game}
|
||||||
is.Equal(h.HandType(), "4K-K")
|
is.Equal(h.HandType(), "4K-K")
|
||||||
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "6cccca")
|
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "6cccca")
|
||||||
|
|
||||||
h = Play{0, []rune("QQQJA"), &game}
|
h = Play{hand: []rune("QQQJA"), game: &game}
|
||||||
is.Equal(h.HandType(), "3K-Q")
|
is.Equal(h.HandType(), "3K-Q")
|
||||||
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "4bbbad")
|
is.Equal(fmt.Sprintf("%x", h.HandStrength()), "4bbbad")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user