Mercurial > repos > icfp2014
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 |