summaryrefslogtreecommitdiff
path: root/2023/Go/internal/day_02/part_01
diff options
context:
space:
mode:
authorDJ O'Leary <dijitol@proton.me>2025-11-29 20:23:02 +0100
committerDJ O'Leary <dijitol@proton.me>2025-11-29 20:23:02 +0100
commit4c3a50166bf0f78ce89459c352cc1c6536a8b96d (patch)
tree02e4b66a1435680ef1e92bf82576747b27f16447 /2023/Go/internal/day_02/part_01
parentbe2f8528b3829f8263507da301812d852297c168 (diff)
chore: make language folders snake_case
Diffstat (limited to '2023/Go/internal/day_02/part_01')
-rw-r--r--2023/Go/internal/day_02/part_01/part_01.go138
-rw-r--r--2023/Go/internal/day_02/part_01/part_01_test.go102
2 files changed, 0 insertions, 240 deletions
diff --git a/2023/Go/internal/day_02/part_01/part_01.go b/2023/Go/internal/day_02/part_01/part_01.go
deleted file mode 100644
index 9efe20f..0000000
--- a/2023/Go/internal/day_02/part_01/part_01.go
+++ /dev/null
@@ -1,138 +0,0 @@
-package part_01
-
-import (
- "os"
- "regexp"
- "strconv"
- "strings"
-)
-
-type cubes struct {
- red int
- blue int
- green int
-}
-
-func Solve() {
- contents, err := os.ReadFile("../_input/day_02.txt")
- if err != nil {
- panic(err)
- }
-
- lines := strings.Split(string(contents), "\n")
- possibleGameIds := processLines(lines)
-
- println(accumulate(possibleGameIds))
-}
-
-func processLines(lines []string) []int {
- var possibleGames []int
-
- maxCubes := cubes{red: 12, blue: 14, green: 13}
-
- for _, line := range lines {
- if line == "" || line == "\n" {
- continue
- }
-
- shownCubes := convertLineToCubes(line)
-
- isPossible := isPossibleGame(shownCubes, maxCubes)
- if isPossible {
- gameId := getGameId(line)
- possibleGames = append(possibleGames, gameId)
- }
- }
-
- return possibleGames
-}
-
-func convertLineToCubes(line string) []cubes {
- var shownCubes []cubes
-
- redRegex := regexp.MustCompile(`(\d+) red`)
- blueRegex := regexp.MustCompile(`(\d+) blue`)
- greenRegex := regexp.MustCompile(`(\d+) green`)
-
- for _, round := range strings.Split(line, ";") {
- var cubes cubes
-
- redMatches := redRegex.FindStringSubmatch(round)
- if redMatches != nil {
- red, err := strconv.Atoi(redMatches[1])
- if err != nil {
- panic("Could not convert red to int: " + redMatches[1])
- } else {
- cubes.red = red
- }
- }
-
- blueMatches := blueRegex.FindStringSubmatch(round)
- if blueMatches != nil {
- blue, err := strconv.Atoi(blueMatches[1])
- if err != nil {
- panic("Could not convert green to int: " + blueMatches[1])
- } else {
- cubes.blue = blue
- }
- }
-
- greenMatches := greenRegex.FindStringSubmatch(round)
- if greenMatches != nil {
- green, err := strconv.Atoi(greenMatches[1])
- if err != nil {
- panic("Could not convert green to int: " + greenMatches[1])
- } else {
- cubes.green = green
- }
- }
-
- shownCubes = append(shownCubes, cubes)
- }
-
- return shownCubes
-}
-
-func isPossibleGame(shownCubes []cubes, maxCubes cubes) bool {
- for _, cubes := range shownCubes {
- if cubes.red > maxCubes.red {
- return false
- }
-
- if cubes.blue > maxCubes.blue {
- return false
- }
-
- if cubes.green > maxCubes.green {
- return false
- }
- }
-
- return true
-}
-
-func getGameId(line string) int {
- regex := regexp.MustCompile(`^Game (\d+):`)
- matches := regex.FindStringSubmatch(line)
- if matches == nil || len(matches) < 2 {
- println(matches)
- panic("No game id found in line: '" + line + "'")
- }
-
- gameId, err := strconv.Atoi(matches[1])
- if err != nil {
- panic("Could not convert game id to int: " + matches[1])
- }
-
- return gameId
-}
-
-func accumulate(gameIds []int) int {
- var acc int
-
- for _, gameId := range gameIds {
- acc += gameId
- }
-
- return acc
-}
diff --git a/2023/Go/internal/day_02/part_01/part_01_test.go b/2023/Go/internal/day_02/part_01/part_01_test.go
deleted file mode 100644
index 33e5fbf..0000000
--- a/2023/Go/internal/day_02/part_01/part_01_test.go
+++ /dev/null
@@ -1,102 +0,0 @@
-package part_01
-
-import (
- "testing"
-)
-
-type data struct {
- gameId int
- isPossible bool
- shownCubes []cubes
- line string
-}
-
-var testInput = []data{
- {
- gameId: 1,
- isPossible: true,
- shownCubes: []cubes{
- {red: 4, blue: 3},
- {red: 1, blue: 6, green: 2},
- {green: 2},
- },
- line: "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green",
- },
- {
- gameId: 2,
- isPossible: true,
- shownCubes: []cubes{
- {blue: 1, green: 2},
- {red: 1, blue: 4, green: 3},
- {blue: 1, green: 1},
- },
- line: "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue",
- },
- {
- gameId: 3,
- isPossible: false,
- shownCubes: []cubes{
- {red: 20, blue: 6, green: 8},
- {red: 4, blue: 5, green: 13},
- {red: 1, green: 5},
- },
- line: "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red",
- },
- {
- gameId: 4,
- isPossible: false,
- shownCubes: []cubes{
- {red: 3, blue: 6, green: 1},
- {red: 6, green: 3},
- {red: 14, blue: 15, green: 3},
- },
- line: "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red",
- },
- {
- gameId: 5,
- isPossible: true,
- shownCubes: []cubes{
- {red: 6, blue: 1, green: 3},
- {red: 1, blue: 2, green: 2},
- },
- line: "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green",
- },
-}
-
-func TestConvertLineToCubes(t *testing.T) {
- for _, data := range testInput {
- actualCubes := convertLineToCubes(data.line)
-
- if len(data.shownCubes) != len(actualCubes) {
- t.Errorf("Expected length of shownCubes to be %d, got %d", len(data.shownCubes), len(actualCubes))
- }
-
- for i, cubes := range data.shownCubes {
- if cubes != actualCubes[i] {
- t.Errorf("Expected shownCubes to be %v, got %v", cubes, actualCubes[i])
- }
- }
- }
-}
-
-func TestIsPossibleGame(t *testing.T) {
- maxCubes := cubes{red: 12, blue: 13, green: 14}
-
- for _, data := range testInput {
- actualIsPossible := isPossibleGame(data.shownCubes, maxCubes)
-
- if data.isPossible != actualIsPossible {
- t.Errorf("Expected isPossibleGame to be %t, got %t for game id %d", data.isPossible, actualIsPossible, data.gameId)
- }
- }
-}
-
-func TestGetGameId(t *testing.T) {
- for _, data := range testInput {
- actualGameId := getGameId(data.line)
-
- if data.gameId != actualGameId {
- t.Errorf("Expected gameId to be %d, got %d", data.gameId, actualGameId)
- }
- }
-}