advent-of-code/2023/day-2/main.go
Dan Anglin 76583b3dda
All checks were successful
/ test (pull_request) Successful in 25s
refactor: add common functions to internal package
It's time to add common functions to the internal 'common' package.

- Add the function that read the contents from a file to a list.
- Add the function that parses a list of integers from a string.

...and more to come later...
2023-12-05 19:43:52 +00:00

117 lines
2.1 KiB
Go

package main
import (
"fmt"
"log"
"codeflow.dananglin.me.uk/apollo/advent-of-code/internal/common"
)
func main() {
filename := "2023/day-2/files/input"
games, err := common.ReadFile(filename)
if err != nil {
log.Fatalf("ERROR: unable to read from %s, %v\n", filename, err)
}
sumOfIDs, err := sumOfGameIDs(games)
if err != nil {
log.Fatalf("ERROR: unable to calculate the sum of the IDs of the valid games; %v\n", err)
}
fmt.Printf("Total sum of the IDs of the valid games: %d\n", sumOfIDs)
sumOfPower, err := sumOfThePowerOfTheCubes(games)
if err != nil {
log.Fatalf("ERROR: unable to calculate the sum of the power of cubes; %v\n", err)
}
fmt.Printf("Total sum of the power of cubes: %d\n", sumOfPower)
}
// sumOfGameIDs solves Part 1
func sumOfGameIDs(content []string) (int, error) {
sum := 0
for i := range content {
if len(content[i]) == 0 {
continue
}
game, err := parseGame(content[i])
if err != nil {
return 0, fmt.Errorf("unable to parse %q; %w", game, err)
}
if validGame(game.Sets) {
sum = sum + game.ID
}
}
return sum, nil
}
// sumOfThePowerOfTheCubes solves Part 2
func sumOfThePowerOfTheCubes(content []string) (int, error) {
sum := 0
for i := range content {
if len(content[i]) == 0 {
continue
}
game, err := parseGame(content[i])
if err != nil {
return 0, fmt.Errorf("unable to parse %q; %w", game, err)
}
fewestCubeSet := fewestSet(game.Sets)
sum = sum + (fewestCubeSet.Red * fewestCubeSet.Green * fewestCubeSet.Blue)
}
return sum, nil
}
func validGame(sets []Set) bool {
const (
maxRed = 12
maxGreen = 13
maxBlue = 14
)
for _, set := range sets {
switch {
case set.Red > maxRed:
return false
case set.Blue > maxBlue:
return false
case set.Green > maxGreen:
return false
}
}
return true
}
func fewestSet(sets []Set) Set {
result := Set{0, 0, 0}
for _, set := range sets {
if set.Red > result.Red {
result.Red = set.Red
}
if set.Green > result.Green {
result.Green = set.Green
}
if set.Blue > result.Blue {
result.Blue = set.Blue
}
}
return result
}