-
Notifications
You must be signed in to change notification settings - Fork 0
/
day10.go
74 lines (56 loc) · 1.14 KB
/
day10.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
package main
import (
"bytes"
"io"
"github.com/armsnyder/aoc2022/aocutil"
)
var _ = declareDay(10, func(part2 bool, inputReader io.Reader) any {
if part2 {
return day10Part2(inputReader)
}
return day10Part1(inputReader)
})
func day10Part1(inputReader io.Reader) any {
sum := 0
day10RunProgram(inputReader, func(cycle, x int) {
if cycle == 19 || ((cycle-19)%40) == 0 {
sum += ((cycle + 1) * x)
}
})
return sum
}
func day10Part2(inputReader io.Reader) any {
buf := bytes.NewBuffer(make([]byte, 0, 6*41+1))
buf.WriteByte('\n')
day10RunProgram(inputReader, func(cycle, x int) {
head := cycle % 40
spriteOffset := x - head
if spriteOffset >= -1 && spriteOffset <= 1 {
buf.WriteByte('#')
} else {
buf.WriteByte('.')
}
if head == 39 {
buf.WriteByte('\n')
}
})
return buf.String()
}
func day10RunProgram(inputReader io.Reader, tick func(cycle, x int)) {
cycle := 0
x := 1
aocutil.VisitStrings(inputReader, func(v []byte) {
tick(cycle, x)
cycle++
if string(v) == "noop" {
return
}
tick(cycle, x)
cycle++
arg, err := aocutil.AtoiBytes(v[5:])
if err != nil {
panic(err)
}
x += arg
})
}