-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path22_walking_virus.go
105 lines (87 loc) · 1.83 KB
/
22_walking_virus.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
package main
import (
"fmt"
"log"
"metalim/advent/2017/lib/field"
"metalim/advent/2017/lib/source"
. "github.com/logrusorgru/aurora"
)
var test1 = `..#
#..
...`
func main() {
var ins source.Inputs
ins = ins.Test(3, test1, `5587`, `2511944`)
for par := range ins.Advent(2017, 22) {
fmt.Println(Brown("\n" + par.Name))
smap := par.Val
if par.Part(1) {
f := &field.Slice{}
f.SetDefault('.')
field.FillFromString(f, field.Pos{}, smap)
b := f.Bounds()
start := field.Pos{b.Dx() / 2, b.Dy() / 2}
var infected, istep int
stepOn := func(p field.Pos, d field.Dir8) int {
istep++
v0 := f.Get(p)
var v, dirs int
switch v0 {
case '#':
v = '.'
dirs = 1 << ((d + 2) & 7) // prev infected -> right
case '.':
infected++
v = '#'
dirs = 1 << ((d + 6) & 7) // prev clean -> left
default:
log.Fatal("unkown cell value", string(v0))
}
f.Set(p, v)
if istep == 1e4 {
return 0
}
return dirs
}
field.Walk(start, field.Dir80N, nil, stepOn)
par.SubmitInt(1, infected)
}
if par.Part(2) {
f := &field.Slice{}
f.SetDefault('.')
field.FillFromString(f, field.Pos{}, smap)
b := f.Bounds()
start := field.Pos{b.Dx() / 2, b.Dy() / 2}
var infected, istep int
stepOn := func(p field.Pos, d field.Dir8) int {
istep++
v0 := f.Get(p)
var v, dirs int
switch v0 {
case '.':
v = 'W'
dirs = 1 << ((d + 6) & 7)
case 'W':
v = '#'
infected++
dirs = 1 << d
case '#':
v = 'F'
dirs = 1 << ((d + 2) & 7)
case 'F':
v = '.'
dirs = 1 << ((d + 4) & 7)
default:
log.Fatal("unkown cell value", string(v0))
}
f.Set(p, v)
if istep == 1e7 {
return 0
}
return dirs
}
field.Walk(start, field.Dir80N, nil, stepOn)
par.SubmitInt(2, infected)
}
}
}