Skip to content

Commit 8d4a71c

Browse files
committed
Solve Day 2
Signed-off-by: Alexander Kurbatov <sir.alkurbatov@yandex.ru>
1 parent d81596c commit 8d4a71c

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed

2023/2/main.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"errors"
6+
"log"
7+
"os"
8+
"regexp"
9+
"strconv"
10+
)
11+
12+
const (
13+
maxRed = 12
14+
maxGreen = 13
15+
maxBlue = 14
16+
)
17+
18+
var ErrNoID = errors.New("game ID not found")
19+
20+
var (
21+
gameID = regexp.MustCompile(`Game (\d+):`)
22+
blues = regexp.MustCompile(` (\d+) blue`)
23+
reds = regexp.MustCompile(` (\d+) red`)
24+
greens = regexp.MustCompile(` (\d+) green`)
25+
)
26+
27+
func extractGameID(src string) (int, error) {
28+
raw := gameID.FindStringSubmatch(src)
29+
if len(raw) == 0 {
30+
return 0, ErrNoID
31+
}
32+
33+
return strconv.Atoi(raw[1])
34+
}
35+
36+
func fewestPossible(src string, re *regexp.Regexp) int {
37+
counts := re.FindAllStringSubmatch(src, -1)
38+
if counts == nil {
39+
return 0
40+
}
41+
42+
localMax := -1
43+
44+
for _, count := range counts {
45+
for i := 1; i < len(count); i++ {
46+
num, err := strconv.Atoi(count[i])
47+
if err != nil {
48+
log.Printf("Failed to extract balls count: %v", err)
49+
return -1
50+
}
51+
52+
if num > localMax {
53+
localMax = num
54+
}
55+
}
56+
}
57+
58+
return localMax
59+
}
60+
61+
func main() {
62+
input, err := os.Open("./2023/2/input.txt")
63+
if err != nil {
64+
log.Printf("Failed to open input.txt: %v", err)
65+
return
66+
}
67+
defer input.Close()
68+
69+
var firstPartResult, secondPartResult int
70+
71+
scanner := bufio.NewScanner(input)
72+
for scanner.Scan() {
73+
src := scanner.Text()
74+
75+
fewerRed := fewestPossible(src, reds)
76+
fewerBlue := fewestPossible(src, blues)
77+
fewerGreen := fewestPossible(src, greens)
78+
79+
secondPartResult += fewerRed * fewerBlue * fewerGreen
80+
81+
if fewerRed > maxRed || fewerBlue > maxBlue || fewerGreen > maxGreen {
82+
continue
83+
}
84+
85+
id, err := extractGameID(src)
86+
if err != nil {
87+
log.Printf("Failed to extract game ID: %v", err)
88+
return
89+
}
90+
91+
firstPartResult += id
92+
}
93+
94+
if err := scanner.Err(); err != nil {
95+
log.Printf("Failed to scan input.txt: %v", err)
96+
return
97+
}
98+
99+
log.Printf("Part 1 result: %d", firstPartResult)
100+
log.Printf("Part 2 result: %d", secondPartResult)
101+
}

0 commit comments

Comments
 (0)