Skip to content

Commit 5419933

Browse files
committed
add day04 solution.
1 parent 26398c2 commit 5419933

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

2023/day04.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"io/ioutil"
7+
"log"
8+
"strconv"
9+
"strings"
10+
)
11+
12+
var inputFile = flag.String("inputFile", "inputs/day04.input", "Relative file path to use as input.")
13+
14+
func main() {
15+
flag.Parse()
16+
bytes, err := ioutil.ReadFile(*inputFile)
17+
if err != nil {
18+
return
19+
}
20+
contents := string(bytes)
21+
split := strings.Split(contents, "\n")
22+
23+
memo := make(map[int][]int)
24+
sum := 0
25+
pending := make(map[int]int)
26+
for i, s := range split[:len(split)-1] {
27+
pending[i] = 1
28+
parts := strings.Split(s[10:], " | ")
29+
winners := make(map[int]bool)
30+
for _, v := range strings.Split(parts[0], " ") {
31+
if v == "" {
32+
continue
33+
}
34+
w, err := strconv.Atoi(v)
35+
if err != nil {
36+
log.Fatalf("Failed parsing %s: %v", v, err)
37+
}
38+
winners[w] = true
39+
}
40+
var won int
41+
for _, v := range strings.Split(parts[1], " ") {
42+
if v == "" {
43+
continue
44+
}
45+
w, err := strconv.Atoi(v)
46+
if err != nil {
47+
log.Fatalf("Failed parsing %s: %v", v, err)
48+
}
49+
if winners[w] {
50+
won++
51+
memo[i] = append(memo[i], i+won)
52+
}
53+
}
54+
var value int
55+
for j := 0; j < len(memo[i]); j++ {
56+
if value == 0 {
57+
value = 1
58+
} else {
59+
value *= 2
60+
}
61+
}
62+
sum += value
63+
}
64+
fmt.Println(sum)
65+
66+
inventory := make(map[int]int)
67+
for len(pending) != 0 {
68+
next := make(map[int]int)
69+
for k, v := range pending {
70+
inventory[k] += v
71+
for _, a := range memo[k] {
72+
next[a] += v
73+
}
74+
}
75+
pending = next
76+
}
77+
var cards int
78+
for _, v := range inventory {
79+
cards += v
80+
}
81+
fmt.Println(cards)
82+
}

0 commit comments

Comments
 (0)