Commit 8e45dd7

bryfry <bryon.fryer@gmail.com>
2023-12-02 09:46:00
some tidying
1 parent 6ce561c
Changed files (3)
2023
go
2023/go/01/main.go
@@ -78,7 +78,8 @@ func solvePart2(input []string) (solution int) {
 }
 
 func main() {
-	day := 1
+	day := aoc.Day1
+	// parameters: int day, int part, solve function, expected int
 	aoc.SolveExample(day, aoc.Part1, solvePart1, 142)
 	aoc.SolvePuzzle(day, aoc.Part1, solvePart1, 56397)
 	aoc.SolveExample(day, aoc.Part2, solvePart2, 281)
2023/go/02/main.go
@@ -6,15 +6,22 @@ import (
 	"strings"
 )
 
-type instance struct {
+// A collection of cubes
+// Can be used to represent:
+// - A constraint (e.g. maxCubes)
+// - A collected state (e.g. minCubes)
+// - An instance of a revield set of cubes
+type bag struct {
 	blue  int
 	red   int
 	green int
 }
 
+// Game stuct containing mutliple instances of 
+// subsets of cubes that were revealed from the bag
 type game struct {
-	id        int
-	instances []instance
+	id   int
+	bags []bag
 }
 
 const (
@@ -23,7 +30,7 @@ const (
 	red   = "red"
 )
 
-func (i instance) valid(maxCubes instance) bool {
+func (i bag) valid(maxCubes bag) bool {
 	if i.blue > maxCubes.blue {
 		return false
 	}
@@ -36,18 +43,22 @@ func (i instance) valid(maxCubes instance) bool {
 	return true
 }
 
-func (i instance) power() int {
+func (i bag) power() int {
 	return i.green * i.red * i.blue
 }
 
-func parseInstances(input string) (instances []instance) {
-
-	instances = []instance{}
+// Example input:
+// Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
+func parseGame(input string) game {
+	input = strings.TrimPrefix(input, "Game ")
+	idSplit := strings.Split(input, ":")
+	id, _ := strconv.Atoi(idSplit[0])
 
-	instanceString := strings.Split(input, ";")
-	for _, iString := range instanceString {
+	bags := []bag{}
+	bagString := strings.Split(idSplit[1], ";")
+	for _, iString := range bagString {
 
-		i := instance{}
+		i := bag{}
 		cubes := strings.Split(iString, ",")
 		for _, c := range cubes {
 
@@ -63,71 +74,67 @@ func parseInstances(input string) (instances []instance) {
 				i.green, _ = strconv.Atoi(countSplit[0])
 			}
 		}
-		instances = append(instances, i)
+		bags = append(bags, i)
 	}
-	return instances
-}
 
-func parseGame(input string) game {
-	s := strings.TrimPrefix(input, "Game ")
-	split := strings.Split(s, ":")
-	id, _ := strconv.Atoi(split[0])
-	instancesString := split[1]
 	return game{
-		id:        id,
-		instances: parseInstances(instancesString),
+		id:   id,
+		bags: bags,
 	}
 }
 
 func solvePart1(input []string) (solution int) {
-	sum := 0
+	solution = 0
+	maxCubes := bag{
+		blue:  14,
+		red:   12,
+		green: 13,
+	}
 	for _, line := range input {
-		maxCubes := instance{
-			blue:  14,
-			red:   12,
-			green: 13,
-		}
-		g := parseGame(line)
+		game := parseGame(line)
 		valid := true
-		for _, i := range g.instances {
-			if !i.valid(maxCubes) {
+		for _, bag := range game.bags {
+			if !bag.valid(maxCubes) {
 				valid = false
+				break
 			}
 		}
 		if valid {
-			sum = sum + g.id
+			solution += game.id
 		}
 	}
-	return sum
+	return solution
 }
 
+// Show that you can maintain state across bags in a game
+// Find the minimum number of cubes of each color across bags
 func solvePart2(input []string) (solution int) {
-	sum := 0
+	solution = 0
 	for _, line := range input {
-		minCubes := instance{
+		minCubes := bag{
 			blue:  0,
 			red:   0,
 			green: 0,
 		}
 		g := parseGame(line)
-		for _, i := range g.instances {
-			if i.blue > minCubes.blue {
-				minCubes.blue = i.blue
+		for _, bag := range g.bags {
+			if bag.blue > minCubes.blue {
+				minCubes.blue = bag.blue
 			}
-			if i.red > minCubes.red {
-				minCubes.red = i.red
+			if bag.red > minCubes.red {
+				minCubes.red = bag.red
 			}
-			if i.green > minCubes.green {
-				minCubes.green = i.green
+			if bag.green > minCubes.green {
+				minCubes.green = bag.green
 			}
 		}
-		sum = sum + minCubes.power()
+		solution += minCubes.power()
 	}
-	return sum
+	return solution
 }
 
 func main() {
-	day := 2
+	day := aoc.Day2
 	aoc.SolveExample(day, aoc.Part1, solvePart1, 8)
 	aoc.SolvePuzzle(day, aoc.Part1, solvePart1, 2447)
 	aoc.SolveExample(day, aoc.Part2, solvePart2, 2286)
2023/go/internal/aoc/aoc.go
@@ -8,20 +8,50 @@ import (
 )
 
 const (
-	example         = "e"
-	puzzle          = "p"
-	Part1           = 1
-	Part2           = 2
+	example = "e"
+	puzzle  = "p"
+
+	Part1 = Part(1)
+	Part2 = Part(2)
+
+	Day1  = Day(1)
+	Day2  = Day(2)
+	Day3  = Day(3)
+	Day4  = Day(4)
+	Day5  = Day(5)
+	Day6  = Day(6)
+	Day7  = Day(7)
+	Day8  = Day(8)
+	Day9  = Day(9)
+	Day10 = Day(10)
+	Day11 = Day(11)
+	Day12 = Day(12)
+	Day13 = Day(13)
+	Day14 = Day(14)
+	Day15 = Day(15)
+	Day16 = Day(16)
+	Day17 = Day(17)
+	Day18 = Day(18)
+	Day19 = Day(19)
+	Day20 = Day(20)
+	Day21 = Day(21)
+	Day22 = Day(22)
+	Day23 = Day(23)
+	Day24 = Day(24)
+	Day25 = Day(25)
+
 	UnknownExpected = -1
 )
 
 type InputType string
+type Day int
+type Part int
 
 type solve func([]string) int
 
 type Input struct {
-	Day      int
-	Part     int
+	Day      Day
+	Part     Part
 	Type     InputType
 	Solve    solve
 	Expected int
@@ -58,7 +88,7 @@ func (i Input) Calculate() (err error) {
 	return nil
 }
 
-func SolveExample(day int, part int, fn solve, expected int) {
+func SolveExample(day Day, part Part, fn solve, expected int) {
 	fmt.Printf("Day %02d, Part %d Example: ", day, part)
 	i := Input{
 		Day:      day,
@@ -73,7 +103,7 @@ func SolveExample(day int, part int, fn solve, expected int) {
 	}
 }
 
-func SolvePuzzle(day int, part int, fn solve, expected int) {
+func SolvePuzzle(day Day, part Part, fn solve, expected int) {
 	fmt.Printf("Day %02d, Part %d Puzzle:  ", day, part)
 	i := Input{
 		Day:      day,