-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path02_field_bounds_walk.go
69 lines (59 loc) · 1.27 KB
/
02_field_bounds_walk.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
package main
import (
"fmt"
"metalim/advent/2016/lib/field"
"metalim/advent/2016/lib/source"
"strings"
. "github.com/logrusorgru/aurora"
)
var test1 = `ULL
RRDDD
LURDL
UUUUD`
func main() {
var ins source.Inputs
ins.Test(1|2, test1, `1985`, `5DB3`)
ins.Advent(2016, 2)
for par := range ins.Iterate() {
fmt.Println(Brown("\n" + par.Name()).Bold())
sl := par.Lines().Data().([]string)
fmt.Println(len(sl), Black(sl[0]).Bold())
if par.Part(1) {
f := &field.Map{}
f.SetDefault(' ')
field.FillFromString(f, field.Pos{}, "123\n456\n789")
p := field.Pos{1, 1}
par.Submit(1, getCode(f, p, sl))
}
if par.Part(2) {
f := &field.Slice{}
f.SetDefault(' ')
field.FillFromString(f, field.Pos{}, " 1\n 234\n56789\n ABC\n D")
p := field.Pos{0, 2}
par.Submit(2, getCode(f, p, sl))
}
}
}
func getCode(f field.Interface, p field.Pos, sl []string) string {
var out strings.Builder
var p2 field.Pos
for _, l := range sl {
for _, d := range l {
switch d {
case 'U':
p2 = p.Add(field.Pos{0, -1})
case 'D':
p2 = p.Add(field.Pos{0, 1})
case 'L':
p2 = p.Add(field.Pos{-1, 0})
case 'R':
p2 = p.Add(field.Pos{1, 0})
}
if f.Get(p2) != ' ' {
p = p2
}
}
out.WriteRune(rune(f.Get(p)))
}
return out.String()
}