comparison code/dotScanner.lm @ 23:5ded24518dc5

Add library functions from mike00.lm to dotScanner.lm. Add some code to process map state into a "grid" structure and make a version for visited state.
author Michael Pavone <pavone@retrodev.com>
date Fri, 25 Jul 2014 22:37:53 -0700
parents 1c6d4f2642d0
children ec0b74f4f2d9
comparison
equal deleted inserted replaced
22:edc89d9c9e10 23:5ded24518dc5
1 #{ 1 #{
2 length <- :lst {
3 len <- []
4 while: { not: (lst isInteger?)} do: {
5 lst <- lst tail
6 len <- len + 1
7 }
8 len
9 }
10
11 reverse <- :lst {
12 new <- []
13 while: { not: (lst isInteger?)} do: {
14 new <- (lst value) | new
15 lst <- lst tail
16 }
17 new
18 }
19
20 split:at <- :lst :pos {
21 first <- []
22 i <- 0
23 while: { i < pos } do: {
24 first <- (lst value) | first
25 lst <- lst tail
26 i <- i + 1
27 }
28 #[(reverse: first) lst]
29 }
30
31 map <- :lst fun {
32 new <- []
33 while: { not: (lst isInteger?) } do: {
34 new <- (fun: (lst value)) | new
35 lst <- lst tail
36 }
37 reverse: new
38 }
39
40 fold:with <- :lst acc :fun {
41 while: { not: (lst isInteger?) } do: {
42 acc <- fun: acc (lst value)
43 lst <- lst tail
44 }
45 acc
46 }
47
48 filter <- :lst pred {
49 new <- []
50 while: { not: (lst isInteger?) } do: {
51 if: (pred: (lst value)) {
52 new <- (lst value) | new
53 } else: {}
54 lst <- lst tail
55 }
56 reverse: new
57 }
58
59 makeTree:size <- :lst :size {
60 ret <- 0
61 sub <- 0
62 half <- size / 2
63 if: size = 2 {
64 ret <- #[(lst value) ((lst tail) value)]
65 } else: {
66 if: size = 1 {
67 ret <- lst
68 } else: {
69 sub <- split: lst at: half
70 ret <- #[
71 (makeTree: (sub value) size: half)
72 (makeTree: (sub tail) size: size-half)
73 ]
74 }
75 }
76 ret
77 }
78
79 makeTree <- :lst {
80 size <- lst length
81 #[size (makeTree: lst size: size)]
82 }
83
84 get:fromTree:size <- :idx :tree :size {
85 print: #[1 tree size]
86 ret <- 0
87 half <- size / 2
88 if: size <= 2 {
89 if: idx = 0 {
90 ret <- tree value
91 } else: {
92 ret <- tree tail
93 }
94 } else: {
95 if: idx < half {
96 ret <- get: idx fromTree: (tree value) size: half
97 } else: {
98 ret <- get: idx-half fromTree: (tree tail) size: size-half
99 }
100 }
101 ret
102 }
103
104 get:fromTree <- :idx :tree {
105 size <- tree value
106 print: #[0 size]
107 get: idx fromTree: (tree tail) size: size
108 }
109
110 treeMap:size <- :tree fun :size {
111 ret <- 0
112 half <- size / 2
113 if: size = 2 {
114 ret <- #[(fun: (tree value)) (fun: (tree tail))]
115 } else: {
116 if: size = 1 {
117 ret <- #[(fun: (tree value)) 0]
118 } else: {
119 ret <- #[
120 (treeMap: (tree value) fun size: half)
121 (treeMap: (tree tail) fun size: size-half)
122 ]
123 }
124 }
125 ret
126 }
127
128 treeMap <- :tree fun {
129 #[(tree value) (treeMap: (tree tail) fun size: (tree value))]
130 }
131
132 tree:size:update:with <- :tree :size :idx :fun {
133 ret <- 0
134 half <- size / 2
135 if: size = 2 {
136 if: idx = 0 {
137 ret <- #[(fun: (tree value)) (tree tail)]
138 } else: {
139 ret <- #[(tree value) (fun: (tree tail))]
140 }
141 } else: {
142 if: size = 1 {
143 ret <- #[(fun: (tree value)) 0]
144 } else: {
145 if: (idx < half) {
146 ret <- #[
147 (tree: (tree value) size: half update: idx with: fun)
148 (tree tail)
149 ]
150 } else: {
151 ret <- #[
152 (tree value)
153 (tree: (tree tail) size: size-half update: idx-half with: fun)
154 ]
155 }
156 }
157 }
158 ret
159 }
160
161 tree:update:with <- :tree :idx :fun {
162 #[(tree value) (tree: (tree tail) size: (tree value) update: idx with: fun)]
163 }
164
165 tree:set:to <- :tree :idx :val {
166 tree: tree update: idx with: :el { val }
167 }
168
169 grid:update:with <- :grid :pos :fun {
170 x <- pos value
171 y <- pos tail
172 tree: grid update: y with: :row {
173 tree: row update: x with: fun
174 }
175 }
176
177 grid:set:to <- :grid :pos :val {
178 grid: grid update: pox with: :el { val }
179 }
180
2 /* 181 /*
3 ListGet <- :cell idx { 182 ListGet <- :cell idx {
4 if: idx = 0 {cell value} else: { 183 if: idx = 0 {cell value} else: {
5 ListGet: (cell tail) (idx - 1) 184 ListGet: (cell tail) (idx - 1)
6 } 185 }
20 */ 199 */
21 //scanFor <- :target depth visited{ 200 //scanFor <- :target depth visited{
22 //} 201 //}
23 counterLoad <- 4 202 counterLoad <- 4
24 step <- :myState world { 203 step <- :myState world {
25 print: (world value) 204 grid <- makeTree: (map: (world value) :row { makeTree: row })
205 lmState <- (world value) tail
206 myLoc <- (lmState tail) value
207
208
209 visited <- treeMap: grid :el { 0 }
210 visited <- tree: visited set: myLoc to: 1
211
212
213
26 //myPos <- 214 //myPos <-
27 path <- [3 1 3 1] //scanFor: 2 3 [myPos] 215 path <- [3 1 3 1] //scanFor: 2 3 [myPos]
28 move <- myState value 216 move <- myState value
29 counter <- (myState tail) - 1 217 counter <- (myState tail) - 1
30 if: counter = 0 { 218 if: counter = 0 {
32 counter <- counterLoad 220 counter <- counterLoad
33 if: move = 4 { 221 if: move = 4 {
34 move <- 0 222 move <- 0
35 } else: {} 223 } else: {}
36 } else: {} 224 } else: {}
37 #[#[move counter] ((path tail) value)] 225 #[0 ((path tail) value)]
38 } 226 }
39 227
40 main <- :initWorld mystery { 228 main <- :initWorld mystery {
41 #[#[0 counterLoad] step] 229 #[0 step]
42 } 230 }
43 } 231 }
44 232
45 //does not work: 233 //does not work:
46 //someListOrTup get: 0 234 //someListOrTup get: 0