From 8b6ea615f7793d0e17434184196565a601a22a7d Mon Sep 17 00:00:00 2001 From: Katherina Walshe-Grey Date: Mon, 4 Nov 2024 19:18:21 +0000 Subject: [PATCH] Day 2a --- day02/day02.go | 82 +++++++++++++++++++++++++++++++++++++++++++++ day02/day02_test.go | 31 +++++++++++++++++ day02/input1.txt | 5 +++ 3 files changed, 118 insertions(+) create mode 100644 day02/day02.go create mode 100644 day02/day02_test.go create mode 100644 day02/input1.txt diff --git a/day02/day02.go b/day02/day02.go new file mode 100644 index 0000000..cd0d465 --- /dev/null +++ b/day02/day02.go @@ -0,0 +1,82 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +type Game struct { + id int + sets []Set +} + +type Set struct { + red int + green int + blue int +} + +func parseGame(input string) Game { + idStr, setsStr, _ := strings.Cut(input, ": ") + + var game Game + var err error + + game.id, err = strconv.Atoi(strings.TrimPrefix(idStr, "Game ")) + + for i, setStr := range strings.Split(setsStr, "; ") { + game.sets = append(game.sets, Set{}) + for _, colorStr := range strings.Split(setStr, ", ") { + if strings.HasSuffix(colorStr, " red") { + game.sets[i].red, err = strconv.Atoi(strings.TrimSuffix(colorStr, " red")) + } + if strings.HasSuffix(colorStr, " green") { + game.sets[i].green, err = strconv.Atoi(strings.TrimSuffix(colorStr, " green")) + } + if strings.HasSuffix(colorStr, " blue") { + game.sets[i].blue, err = strconv.Atoi(strings.TrimSuffix(colorStr, " blue")) + } + } + } + + if err != nil { + panic("day02: invalid game format") + } + + return game +} + +func isGameValid(game Game) bool { + for _, set := range game.sets { + if set.red > 12 || set.green > 13 || set.blue > 14 { + return false + } + } + return true +} + +func ScanFile(file *os.File) (int, error) { + scanner := bufio.NewScanner(file) + sum := 0 + for scanner.Scan() { + if game := parseGame(scanner.Text()); isGameValid(game) { + sum += game.id + } + } + if err := scanner.Err(); err != nil { + return 0, err + } + return sum, nil +} + +func main() { + sum, err := ScanFile(os.Stdin) + if err != nil { + fmt.Fprintf(os.Stderr, "Invalid input: %s\n", err) + return + } + fmt.Println(sum) +} \ No newline at end of file diff --git a/day02/day02_test.go b/day02/day02_test.go new file mode 100644 index 0000000..923b84c --- /dev/null +++ b/day02/day02_test.go @@ -0,0 +1,31 @@ +package main + +import ( + "os" + "testing" +) + +func TestScanFile(t *testing.T) { + cases := []struct { + inFile string; + want int; + }{ + {"input1.txt", 8}, + } + + for _, c := range cases { + f, err := os.Open(c.inFile) + if err != nil { + t.Fatal(err) + } + + got, err := ScanFile(f) + if err != nil { + t.Fatal(err) + } + + if got != c.want { + t.Errorf("ScanFile(%q) == %d, want %d", c.inFile, got, c.want) + } + } +} \ No newline at end of file diff --git a/day02/input1.txt b/day02/input1.txt new file mode 100644 index 0000000..1cd7d33 --- /dev/null +++ b/day02/input1.txt @@ -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 \ No newline at end of file