From b112460875c3cbcc668b60ad4f84eaa81ca46c90 Mon Sep 17 00:00:00 2001 From: efim Date: Thu, 7 Dec 2023 06:57:20 +0000 Subject: [PATCH] day7, example --- day7/daySevel.go | 130 +++++++++++++++++++++++++++++++++++++++++++++++ day7/example | 5 ++ main.go | 6 +-- 3 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 day7/daySevel.go create mode 100644 day7/example diff --git a/day7/daySevel.go b/day7/daySevel.go new file mode 100644 index 0000000..4080a26 --- /dev/null +++ b/day7/daySevel.go @@ -0,0 +1,130 @@ +package day7 + +import ( + "fmt" + "log" + "os" + "slices" + "strconv" + "strings" +) + +func Run() int { + fmt.Print("hello day 7") + filename := "day7/example" + input := ReadFile(filename) + slices.SortFunc(input, CompareHands) + log.Printf("read the input %+v\n", input) + slices.SortFunc([]int{}, func(a int, b int) int { return 0 }) + result := 0 + for i, hand := range input { + result += (i+1) * hand.Bid + } + return result +} + +type HandType int + +const ( + HighCard = iota + OnePair + TwoPair + ThreeKind + FullHouse + FourKind + FiveKind +) + +type Hand struct { + Cards string + Grouped map[rune]int + HandType HandType + Bid int +} + +// cmp(a, b) should return a negative number when a < b, a positive number when +// a > b and zero when a == b. +const values string = "23456789TJQKA" + +func CompareHands(a Hand, b Hand) int { + if a.HandType != b.HandType { + return int(a.HandType) - int(b.HandType) + } + return compareString(a.Cards, b.Cards) +} + +func compareString(a string, b string) int { + for i := 0; i < len(a); i++ { + if a[i] == b[i] { + continue + } + aVal := strings.IndexRune(values, rune(a[i])) + bVal := strings.IndexRune(values, rune(b[i])) + return aVal - bVal + } + return 0 +} + +func GetHandType(groupped map[rune]int) HandType { + var handType HandType + sizes := make([]int, 0, len(groupped)) + for _, size := range groupped { + sizes = append(sizes, size) + } + slices.Sort(sizes) + switch { + case slices.Equal(sizes, []int{5}): + handType = FiveKind + case slices.Equal(sizes, []int{1, 4}): + handType = FourKind + case slices.Equal(sizes, []int{2, 3}): + handType = FullHouse + case slices.Equal(sizes, []int{1, 1, 3}): + handType = ThreeKind + case slices.Equal(sizes, []int{1, 2, 2}): + handType = TwoPair + case slices.Equal(sizes, []int{1, 1, 1, 2}): + handType = OnePair + } + + log.Printf("calc type for %+v.\nsizes: %+v;\n %d", groupped, sizes, handType) + return handType +} + +func ReadFile(filename string) []Hand { + bytes, err := os.ReadFile(filename) + if err != nil { + panic(fmt.Sprintln("error reading file : ", filename)) + } + text := string(bytes) + lines := strings.Split(text, "\n") + linesLen := len(lines) + result := make([]Hand, 0, linesLen) + + for _, line := range lines { + log.Println("reading in line : ", line) + if line == "" { + continue + } + firstSplit := strings.Fields(line) + cards := firstSplit[0] + bidStr := firstSplit[1] + bid, err := strconv.Atoi(bidStr) + if err != nil { + panic(fmt.Sprintln("error getting bid from : ", bidStr)) + } + groupped := make(map[rune]int, 0) + for _, card := range cards { + groupped[card] += 1 + } + hand := Hand{ + Cards: cards, + Grouped: groupped, + Bid: bid, + HandType: GetHandType(groupped), + } + result = append(result, hand) + } + + return result +} diff --git a/day7/example b/day7/example new file mode 100644 index 0000000..e3500c3 --- /dev/null +++ b/day7/example @@ -0,0 +1,5 @@ +32T3K 765 +T55J5 684 +KK677 28 +KTJJT 220 +QQQJA 483 diff --git a/main.go b/main.go index 786760e..a561580 100644 --- a/main.go +++ b/main.go @@ -3,11 +3,11 @@ package main import ( "log" - "sunshine.industries/aoc2023/day6" + "sunshine.industries/aoc2023/day7" ) func main() { log.Print("> starting run:") - result := day6.Run() - log.Printf("day4 result: %d\n****\n", result) + result := day7.Run() + log.Printf("day7 result: %d\n****\n", result) }