From 7e06806a2b9bfe30896cf4bf2933f3acd9ff54f2 Mon Sep 17 00:00:00 2001 From: efim Date: Sat, 2 Dec 2023 16:05:32 +0000 Subject: [PATCH] day2, example ok --- day2/day-two.go | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ day2/example | 5 +++ main.go | 10 ++--- 3 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 day2/day-two.go create mode 100644 day2/example diff --git a/day2/day-two.go b/day2/day-two.go new file mode 100644 index 0000000..a10055a --- /dev/null +++ b/day2/day-two.go @@ -0,0 +1,100 @@ +package day2 + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" +) + +var Restriction map[string]int = map[string]int{ + "red": 12, + "green": 13, + "blue": 14, +} + +type Game struct { + Num int + Sets [3]map[string]int +} + +// now i need to encode the restriction, +// code 'compare game to restriction' +// scan though input lines, keep only numbers of games that pass the restriction, or rather sum them + +func Run() int { + filename := "./day2/example" + file, err := os.Open(filename) + if err != nil { + panic(fmt.Sprintf("error opening file", filename)) + } + defer file.Close() + + scanner := bufio.NewScanner(file) + + result := 0 + + for scanner.Scan() { + line := scanner.Text() + game := ReadLine(line) + log.Printf("reading %s got game %+v it is %t", line, game, game.isPossible(Restriction)) + if game.isPossible(Restriction) { + result += game.Num + } + } + + return result +} + +func (g Game)isPossible(restriction map[string]int) bool { + for color, maxAmount := range restriction { + for _, set := range g.Sets { + seenAmount, found := set[color] + if found && seenAmount > maxAmount { + return false + } + } + } + return true +} + +func ReadLine(line string) Game { + result := Game{} + + infoIndex := strings.IndexRune(line, ':') + gameTitle := line[0:infoIndex] + titleNumStr := strings.Split(gameTitle, " ")[1] + titleNum, err := strconv.Atoi(titleNumStr) + if err != nil { + panic(fmt.Sprintf("error getting game number from %s\n", line)) + } + result.Num = titleNum + + setsLints := strings.Split(line[infoIndex+1:], ";") + for i, set := range setsLints { + result.Sets[i] = readSet(set) + } + return result +} + +// line like this +// 8 green, 6 blue, 20 red +func readSet(setLine string) map[string]int { + result := make(map[string]int) + itemLines := strings.Split(setLine, ",") + for _, line := range itemLines { + keyValue := strings.Split(strings.Trim(line, " "), " ") + if len(keyValue) != 2 { + panic(fmt.Sprintf("part '%s' of '%s' was of wrong lenght! %+v len is %d", line, setLine, keyValue, len(keyValue))) + } + num, err := strconv.Atoi(keyValue[0]) + if err != nil { + panic(fmt.Sprint(setLine, line, err)) + } + result[keyValue[1]] = num + } + + return result +} diff --git a/day2/example b/day2/example new file mode 100644 index 0000000..295c36d --- /dev/null +++ b/day2/example @@ -0,0 +1,5 @@ +Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green +Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue +Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red +Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red +Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green diff --git a/main.go b/main.go index 08c31d2..4ed891d 100644 --- a/main.go +++ b/main.go @@ -1,13 +1,13 @@ package main import ( - "fmt" + "log" - dayone "sunshine.industries/aoc2023/day1" + "sunshine.industries/aoc2023/day2" ) func main() { - s := "yoyo!" - fmt.Printf("hello, %s\n", s) - dayone.Run() + log.Print("> starting run:") + result := day2.Run() + log.Printf("day2 result: %d", result) }