2023 Day 7 Complete!
This commit is contained in:
parent
79534c356b
commit
36e1cdae59
1000
2023/day07/input
Normal file
1000
2023/day07/input
Normal file
File diff suppressed because it is too large
Load Diff
194
2023/day07/main.go
Normal file
194
2023/day07/main.go
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||||
|
)
|
||||||
|
|
||||||
|
var p2 bool
|
||||||
|
|
||||||
|
// 251515138 is too high
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
inp := h.StdinToStringSlice()
|
||||||
|
part1(inp)
|
||||||
|
fmt.Println()
|
||||||
|
part2(inp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func part1(input []string) {
|
||||||
|
var hands []*Hand
|
||||||
|
for i := range input {
|
||||||
|
hands = append(hands, NewHand(input[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Sort(sort.Reverse(ByRank(hands)))
|
||||||
|
|
||||||
|
var total int
|
||||||
|
for i := range hands {
|
||||||
|
total += hands[i].bid * (i + 1)
|
||||||
|
}
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("# Part 1")
|
||||||
|
fmt.Println(total)
|
||||||
|
}
|
||||||
|
|
||||||
|
func part2(input []string) {
|
||||||
|
p2 = true
|
||||||
|
var hands []*Hand
|
||||||
|
for i := range input {
|
||||||
|
hands = append(hands, NewHand(input[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Sort(sort.Reverse(ByRank(hands)))
|
||||||
|
|
||||||
|
var total int
|
||||||
|
for i := range hands {
|
||||||
|
total += hands[i].bid * (i + 1)
|
||||||
|
}
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("# Part 2")
|
||||||
|
fmt.Println(total)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Hand struct {
|
||||||
|
raw string
|
||||||
|
cards []byte
|
||||||
|
bid int
|
||||||
|
handType int
|
||||||
|
cardMap map[byte]int
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
TypeFiveOfKind = 6
|
||||||
|
TypeFourOfKind = 5
|
||||||
|
TypeFullHouse = 4
|
||||||
|
TypeThreeOfKind = 3
|
||||||
|
TypeTwoPair = 2
|
||||||
|
TypeOnePair = 1
|
||||||
|
TypeHighCard = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
var typeToString = map[int]string{
|
||||||
|
TypeFiveOfKind: "Five of a Kind",
|
||||||
|
TypeFourOfKind: "Four of a Kind",
|
||||||
|
TypeFullHouse: "Full House",
|
||||||
|
TypeThreeOfKind: "Three of a Kind",
|
||||||
|
TypeTwoPair: "Two Pair",
|
||||||
|
TypeOnePair: "One Pair",
|
||||||
|
TypeHighCard: "High Card",
|
||||||
|
}
|
||||||
|
|
||||||
|
func cardToValue(b byte) int {
|
||||||
|
switch b {
|
||||||
|
case 'T':
|
||||||
|
return 10
|
||||||
|
case 'J':
|
||||||
|
if p2 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 11
|
||||||
|
case 'Q':
|
||||||
|
return 12
|
||||||
|
case 'K':
|
||||||
|
return 13
|
||||||
|
case 'A':
|
||||||
|
return 14
|
||||||
|
}
|
||||||
|
return int(b - '0')
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHand(input string) *Hand {
|
||||||
|
hand := Hand{raw: input}
|
||||||
|
i := 0
|
||||||
|
for i = range input {
|
||||||
|
if input[i] == ' ' {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
hand.cards = append(hand.cards, input[i])
|
||||||
|
}
|
||||||
|
hand.bid = h.Atoi(input[i:])
|
||||||
|
hand.handType = hand.findType()
|
||||||
|
return &hand
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hand *Hand) findType() int {
|
||||||
|
hand.cardMap = make(map[byte]int)
|
||||||
|
for i := range hand.cards {
|
||||||
|
hand.cardMap[hand.cards[i]]++
|
||||||
|
}
|
||||||
|
if p2 {
|
||||||
|
if jCnt, ok := hand.cardMap['J']; ok {
|
||||||
|
var c byte
|
||||||
|
cCnt := h.MIN_INT
|
||||||
|
for k, v := range hand.cardMap {
|
||||||
|
if k != 'J' {
|
||||||
|
if v > cCnt {
|
||||||
|
cCnt = v
|
||||||
|
c = k
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hand.cardMap[c] = hand.cardMap[c] + jCnt
|
||||||
|
delete(hand.cardMap, 'J')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
max := h.MIN_INT
|
||||||
|
for _, v := range hand.cardMap {
|
||||||
|
if v > max {
|
||||||
|
max = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch len(hand.cardMap) {
|
||||||
|
case 5:
|
||||||
|
return TypeHighCard
|
||||||
|
case 4:
|
||||||
|
return TypeOnePair
|
||||||
|
case 3:
|
||||||
|
if max == 3 {
|
||||||
|
return TypeThreeOfKind
|
||||||
|
}
|
||||||
|
return TypeTwoPair
|
||||||
|
case 2:
|
||||||
|
if max == 3 {
|
||||||
|
return TypeFullHouse
|
||||||
|
}
|
||||||
|
return TypeFourOfKind
|
||||||
|
default:
|
||||||
|
return TypeFiveOfKind
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hand Hand) String() string {
|
||||||
|
return fmt.Sprintf("%s %d", string(hand.cards), hand.bid)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ByRank []*Hand
|
||||||
|
|
||||||
|
func (rank ByRank) Len() int { return len(rank) }
|
||||||
|
func (rank ByRank) Swap(i, j int) { rank[i], rank[j] = rank[j], rank[i] }
|
||||||
|
func (rank ByRank) Less(i, j int) bool {
|
||||||
|
if rank[i].handType > rank[j].handType {
|
||||||
|
return true
|
||||||
|
} else if rank[j].handType > rank[i].handType {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for k := range rank[i].cards {
|
||||||
|
cmp := cmpCards(rank[i].cards[k], rank[j].cards[k])
|
||||||
|
if cmp != 0 {
|
||||||
|
return cmp == 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmpCards(c1, c2 byte) int {
|
||||||
|
if cardToValue(c1) > cardToValue(c2) {
|
||||||
|
return 1
|
||||||
|
} else if cardToValue(c1) < cardToValue(c2) {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
5
2023/day07/testinput
Normal file
5
2023/day07/testinput
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
32T3K 765
|
||||||
|
T55J5 684
|
||||||
|
KK677 28
|
||||||
|
KTJJT 220
|
||||||
|
QQQJA 483
|
Loading…
Reference in New Issue
Block a user