Mercurial > repos > icfp2014
comparison code/dotScanner.lm @ 40:d5ccb66ae98b
Move some basic library code out of dotScanner.lm into separate files now that import:from works
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 26 Jul 2014 15:29:01 -0700 |
parents | 8c26981aae8c |
children | d631e68a45d5 |
comparison
equal
deleted
inserted
replaced
39:0e1fc2b2832f | 40:d5ccb66ae98b |
---|---|
1 #{ | 1 #{ |
2 length <- :lst { | 2 import: [ |
3 len <- [] | 3 length |
4 while: { not: (lst isInteger?)} do: { | 4 reverse |
5 lst <- lst tail | 5 split:at |
6 len <- len + 1 | 6 map |
7 } | 7 fold:with |
8 len | 8 filter |
9 } | 9 flatten |
10 | 10 ] from: (module: "ll.lm") |
11 reverse <- :lst { | 11 |
12 new <- [] | 12 import: [ |
13 while: { not: (lst isInteger?)} do: { | 13 makeTree:size |
14 new <- (lst value) | new | 14 makeTree |
15 lst <- lst tail | 15 get:fromTree:size |
16 } | 16 get:fromTree |
17 new | 17 treeMap:size |
18 } | 18 treeMap |
19 | 19 tree:size:update:with |
20 split:at <- :lst :pos { | 20 tree:update:with |
21 first <- [] | 21 tree:set:to |
22 i <- 0 | 22 ] from: (module: "tree.lm") |
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 flatten <- :lst { | |
60 fold: lst [] with: :acc el { | |
61 fold: el acc with: :iacc iel { | |
62 iel | iacc | |
63 } | |
64 } | |
65 } | |
66 | |
67 makeTree:size <- :lst :size { | |
68 ret <- 0 | |
69 sub <- 0 | |
70 half <- size / 2 | |
71 if: size = 2 { | |
72 ret <- #[(lst value) ((lst tail) value)] | |
73 } else: { | |
74 if: size = 1 { | |
75 ret <- lst | |
76 } else: { | |
77 sub <- split: lst at: half | |
78 ret <- #[ | |
79 (makeTree: (sub value) size: half) | |
80 (makeTree: (sub tail) size: size-half) | |
81 ] | |
82 } | |
83 } | |
84 ret | |
85 } | |
86 | |
87 makeTree <- :lst { | |
88 size <- lst length | |
89 #[size (makeTree: lst size: size)] | |
90 } | |
91 | |
92 get:fromTree:size <- :idx :tree :size { | |
93 ret <- 0 | |
94 half <- size / 2 | |
95 if: size <= 2 { | |
96 if: idx = 0 { | |
97 ret <- tree value | |
98 } else: { | |
99 ret <- tree tail | |
100 } | |
101 } else: { | |
102 if: idx < half { | |
103 ret <- get: idx fromTree: (tree value) size: half | |
104 } else: { | |
105 ret <- get: idx-half fromTree: (tree tail) size: size-half | |
106 } | |
107 } | |
108 ret | |
109 } | |
110 | |
111 get:fromTree <- :idx :tree { | |
112 size <- tree value | |
113 get: idx fromTree: (tree tail) size: size | |
114 } | |
115 | |
116 treeMap:size <- :tree fun :size { | |
117 ret <- 0 | |
118 half <- size / 2 | |
119 if: size = 2 { | |
120 ret <- #[(fun: (tree value)) (fun: (tree tail))] | |
121 } else: { | |
122 if: size = 1 { | |
123 ret <- #[(fun: (tree value)) 0] | |
124 } else: { | |
125 ret <- #[ | |
126 (treeMap: (tree value) fun size: half) | |
127 (treeMap: (tree tail) fun size: size-half) | |
128 ] | |
129 } | |
130 } | |
131 ret | |
132 } | |
133 | |
134 treeMap <- :tree fun { | |
135 #[(tree value) (treeMap: (tree tail) fun size: (tree value))] | |
136 } | |
137 | |
138 tree:size:update:with <- :tree :size :idx :fun { | |
139 ret <- 0 | |
140 half <- size / 2 | |
141 if: size = 2 { | |
142 if: idx = 0 { | |
143 ret <- #[(fun: (tree value)) (tree tail)] | |
144 } else: { | |
145 ret <- #[(tree value) (fun: (tree tail))] | |
146 } | |
147 } else: { | |
148 if: size = 1 { | |
149 ret <- #[(fun: (tree value)) 0] | |
150 } else: { | |
151 if: (idx < half) { | |
152 ret <- #[ | |
153 (tree: (tree value) size: half update: idx with: fun) | |
154 (tree tail) | |
155 ] | |
156 } else: { | |
157 ret <- #[ | |
158 (tree value) | |
159 (tree: (tree tail) size: size-half update: idx-half with: fun) | |
160 ] | |
161 } | |
162 } | |
163 } | |
164 ret | |
165 } | |
166 | |
167 tree:update:with <- :tree :idx :fun { | |
168 #[(tree value) (tree: (tree tail) size: (tree value) update: idx with: fun)] | |
169 } | |
170 | |
171 tree:set:to <- :tree :idx :val { | |
172 tree: tree update: idx with: :el { val } | |
173 } | |
174 | 23 |
175 grid:get <- :grid :pos { | 24 grid:get <- :grid :pos { |
176 x <- pos value | 25 x <- pos value |
177 y <- pos tail | 26 y <- pos tail |
178 get: x fromTree: (get: y fromTree: grid) | 27 get: x fromTree: (get: y fromTree: grid) |