@@ -3,6 +3,7 @@ package main
3
3
import (
4
4
"fmt"
5
5
"metalim/advent/2017/lib/source"
6
+ "metalim/advent/2017/lib/turing"
6
7
"strconv"
7
8
8
9
. "github.com/logrusorgru/aurora"
@@ -49,35 +50,39 @@ func main() {
49
50
for len (ssw ) > 0 {
50
51
ins := ssw [1 ][len (ssw [1 ])- 1 ]
51
52
53
+ // assuming ssw[2] is 0.
52
54
v1 , _ := strconv .Atoi (ssw [3 ][len (ssw [3 ])- 1 ])
53
55
l1 := ssw [4 ][len (ssw [4 ])- 1 ] == "left"
54
- st1 := ssw [5 ][len (ssw [5 ])- 1 ]
56
+ s1 := ssw [5 ][len (ssw [5 ])- 1 ]
55
57
58
+ // assuming ssw[6] is 1.
56
59
v2 , _ := strconv .Atoi (ssw [7 ][len (ssw [7 ])- 1 ])
57
60
l2 := ssw [8 ][len (ssw [8 ])- 1 ] == "left"
58
- st2 := ssw [9 ][len (ssw [9 ])- 1 ]
61
+ s2 := ssw [9 ][len (ssw [9 ])- 1 ]
59
62
60
- rules [ins ] = [2 ]cmd {{v1 , l1 , st1 }, {v2 , l2 , st2 }}
63
+ rules [ins ] = [2 ]cmd {{v1 , l1 , s1 }, {v2 , l2 , s2 }}
61
64
ssw = ssw [10 :]
62
65
}
63
66
64
- tape := tape {}
67
+ t := turing. Tape {}
65
68
69
+ // execute.
66
70
for ; n > 0 ; n -- {
67
- c := rules [state ][tape . get ()]
68
- tape . set (c .v )
71
+ c := rules [state ][t . Get ()]
72
+ t . Set (c .v )
69
73
if c .l {
70
- tape . left ()
74
+ t . Left ()
71
75
} else {
72
- tape . right ()
76
+ t . Right ()
73
77
}
74
- state = c .st
78
+ state = c .s
75
79
}
76
80
81
+ // count checksum.
77
82
var sum int
78
- l , r := tape . bounds ()
83
+ l , r := t . Bounds ()
79
84
for ; l <= r ; l ++ {
80
- if tape . getAt (l ) == 1 {
85
+ if t . GetAt (l ) == 1 {
81
86
sum ++
82
87
}
83
88
}
@@ -92,63 +97,7 @@ func main() {
92
97
////////////////////////////////////////////////////////////////////////
93
98
94
99
type cmd struct {
95
- v int
96
- l bool
97
- st string
98
- }
99
-
100
- ////////////////////////////////////////////////////////////////////////
101
-
102
- type tape struct {
103
- d [2 ][]int
104
- p int
105
- }
106
-
107
- func (t * tape ) sel (p int ) (int , int ) {
108
- if p < 0 {
109
- return 1 , - p - 1
110
- }
111
- return 0 , p
112
- }
113
-
114
- // getAt - for iteration.
115
- func (t * tape ) getAt (pos int ) int {
116
- i , p := t .sel (pos )
117
- if p < len (t .d [i ]) {
118
- return t.d [i ][p ]
119
- }
120
- return 0
121
- }
122
-
123
- func (t * tape ) get () int {
124
- return t .getAt (t .p )
125
- }
126
-
127
- func (t * tape ) set (v int ) {
128
- i , p := t .sel (t .p )
129
- if p >= len (t .d [i ]) {
130
- t .d [i ] = append (t .d [i ], make ([]int , p + 1 - len (t .d [i ]))... ) // extra space
131
- }
132
- t.d [i ][p ] = v
133
- }
134
-
135
- func (t * tape ) left () {
136
- t .p --
137
- }
138
-
139
- func (t * tape ) right () {
140
- t .p ++
141
- }
142
-
143
- func (t * tape ) go2 (p int ) {
144
- t .p = p
145
- }
146
-
147
- func (t * tape ) goRight (d int ) {
148
- t .p += d
149
- }
150
-
151
- // bounds inclusive
152
- func (t * tape ) bounds () (int , int ) {
153
- return - len (t .d [1 ]), len (t .d [0 ]) - 1
100
+ v int
101
+ l bool
102
+ s string
154
103
}
0 commit comments