-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
182 lines (165 loc) · 3.18 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package main
import (
"bufio"
"fmt"
"log"
"os"
"regexp"
"strconv"
"time"
)
// DayFunc takes the input filename as input and returns the answer and error.
type DayFunc = func(string) (string, error)
func main() {
if len(os.Args) < 3 {
log.Fatal("Pass the day and input file name as arguments.")
}
var dayFn DayFunc
switch os.Args[1] {
case "11":
dayFn = day1part1
case "12":
dayFn = day1part2
case "21":
dayFn = day2part1
case "22":
dayFn = day2part2
case "31":
dayFn = day3part1
case "32":
dayFn = day3part2
case "41":
dayFn = day4part1
case "42":
dayFn = day4part2
case "51":
dayFn = day5part1
case "52":
dayFn = day5part2
case "61":
dayFn = day6part1
case "62":
dayFn = day6part2
case "71":
dayFn = day7part1
case "72":
dayFn = day7part2
case "91":
dayFn = day9part1
case "92":
dayFn = day9part2
case "101":
dayFn = day10part1
case "102":
dayFn = day10part2
case "111":
dayFn = day11part1
case "112":
dayFn = day11part2
case "131":
dayFn = day13part1
case "132":
dayFn = day13part2
case "141":
dayFn = day14part1
case "142":
dayFn = day14part2
case "151":
dayFn = day15part1
case "152":
dayFn = day15part2
case "161":
dayFn = day16part1
case "162":
dayFn = day16part2
case "171":
dayFn = day17part1
case "172":
dayFn = day17part2
case "181":
dayFn = day18part1
case "182":
dayFn = day18part2
case "191":
dayFn = day19part1
case "192":
dayFn = day19part2
case "201":
dayFn = day20part1
case "202":
dayFn = day20part2
case "221":
dayFn = day22part1
case "222":
dayFn = day22part2
case "231":
dayFn = day23part1
case "232":
dayFn = day23part2
case "241":
dayFn = day24part1
case "242":
dayFn = day24part2
case "251":
dayFn = day25part1
default:
log.Fatalf("Invalid day identifier '%s'", os.Args[1])
}
startTime := time.Now()
res, err := dayFn(os.Args[2])
if err != nil {
log.Fatal(err)
}
endTime := time.Now()
log.Printf("Answer: %s", res)
log.Printf("Run time: %v", endTime.Sub(startTime))
}
func forLine(filename string, run func(string)) error {
f, err := os.Open(filename)
if err != nil {
return fmt.Errorf("could not open file: %s", filename)
}
defer f.Close()
scanner := bufio.NewScanner(f)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
run(scanner.Text())
}
return nil
}
func forLineError(filename string, run func(string) error) error {
f, err := os.Open(filename)
if err != nil {
return fmt.Errorf("could not open file: %s", filename)
}
defer f.Close()
scanner := bufio.NewScanner(f)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
if err := run(scanner.Text()); err != nil {
return err
}
}
return nil
}
func allLines(filename string) ([]string, error) {
lines := make([]string, 0)
if err := forLine(filename, func(line string) {
lines = append(lines, line)
}); err != nil {
return nil, err
}
return lines, nil
}
var numberLineRe = regexp.MustCompile(`-?\d+`)
func parseNumberLine(str string) []int {
nums := make([]int, 0)
for _, s := range numberLineRe.FindAllString(str, -1) {
n, err := strconv.Atoi(s)
if err != nil {
log.Fatalf("could not convert to number: '%s'", s)
}
nums = append(nums, n)
}
return nums
}