-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathday21.go
93 lines (84 loc) · 1.49 KB
/
day21.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
package main
import (
"flag"
"fmt"
"github.com/lizthegrey/adventofcode/2019/intcode"
"time"
)
var inputFile = flag.String("inputFile", "inputs/day21.input", "Relative file path to use as input.")
func main() {
flag.Parse()
tape := intcode.ReadInput(*inputFile)
if tape == nil {
fmt.Println("Failed to parse input.")
return
}
// Part A
workingTape := tape.Copy()
input := make(chan int, 1)
output, done := workingTape.Process(input)
go func() {
for l := range output {
if l > 255 {
fmt.Println(l)
return
}
fmt.Printf("%c", l)
}
fmt.Println()
}()
inputString := []string{
// J = AND(OR(C, B, A), D)
"NOT C J",
"NOT B T",
"OR T J",
"NOT A T",
"OR T J",
"AND D J",
"WALK",
}
for _, l := range inputString {
for _, r := range l {
input <- int(r)
}
input <- int('\n')
}
<-done
time.Sleep(100 * time.Millisecond)
// Part B
input = make(chan int, 1)
output, done = tape.Process(input)
go func() {
for l := range output {
if l > 255 {
fmt.Println(l)
return
}
fmt.Printf("%c", l)
}
fmt.Println()
}()
inputString = []string{
// J = AND(OR(C, B, A), D)
// except we also need to make sure E or H are clear before jumping.
// J = AND(J, OR(E,H))
"NOT C J",
"NOT B T",
"OR T J",
"NOT A T",
"OR T J",
"AND D J",
"OR E T",
"OR H T",
"AND T J",
"RUN",
}
for _, l := range inputString {
for _, r := range l {
input <- int(r)
}
input <- int('\n')
}
<-done
time.Sleep(100 * time.Millisecond)
}