Mercurial > repos > icfp2014
comparison code/mike00.lm @ 25:ec0b74f4f2d9
Merge
author | William Morgan <billjunk@mrgn.org> |
---|---|
date | Fri, 25 Jul 2014 22:52:52 -0700 |
parents | edc89d9c9e10 |
children | abd8ceef0dd8 |
comparison
equal
deleted
inserted
replaced
24:37158acf31e5 | 25:ec0b74f4f2d9 |
---|---|
35 lst <- lst tail | 35 lst <- lst tail |
36 } | 36 } |
37 reverse: new | 37 reverse: new |
38 } | 38 } |
39 | 39 |
40 makeTree <- :lst size { | 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 { | |
41 ret <- 0 | 60 ret <- 0 |
42 sub <- 0 | 61 sub <- 0 |
43 half <- size / 2 | 62 half <- size / 2 |
44 if: size = 2 { | 63 if: size = 2 { |
45 ret <- #[(lst value) ((lst tail) value)] | 64 ret <- #[(lst value) ((lst tail) value)] |
47 if: size = 1 { | 66 if: size = 1 { |
48 ret <- lst | 67 ret <- lst |
49 } else: { | 68 } else: { |
50 sub <- split: lst at: half | 69 sub <- split: lst at: half |
51 ret <- #[ | 70 ret <- #[ |
52 (makeTree: (sub value) half) | 71 (makeTree: (sub value) size: half) |
53 (makeTree: (sub tail) size-half) | 72 (makeTree: (sub tail) size: size-half) |
54 ] | 73 ] |
55 } | 74 } |
56 } | 75 } |
57 ret | 76 ret |
58 } | 77 } |
59 | 78 |
79 makeTree <- :lst { | |
80 size <- lst length | |
81 #[size (makeTree: lst size: size)] | |
82 } | |
83 | |
60 get:fromTree:size <- :idx :tree :size { | 84 get:fromTree:size <- :idx :tree :size { |
85 print: #[1 tree size] | |
61 ret <- 0 | 86 ret <- 0 |
62 half <- size / 2 | 87 half <- size / 2 |
63 if: size <= 2 { | 88 if: size <= 2 { |
64 if: idx = 0 { | 89 if: idx = 0 { |
65 ret <- tree value | 90 ret <- tree value |
74 } | 99 } |
75 } | 100 } |
76 ret | 101 ret |
77 } | 102 } |
78 | 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 | |
79 height <- 0 | 169 height <- 0 |
80 width <- 0 | 170 width <- 0 |
81 | 171 |
82 main <- { | 172 main <- { |
83 /* map <- initWorld value | 173 /* map <- initWorld value |
87 | 177 |
88 lst <- [1 2 3 4 5 6 7 8 9] | 178 lst <- [1 2 3 4 5 6 7 8 9] |
89 print: (length: lst) | 179 print: (length: lst) |
90 print: (map: lst :el { el + 1 }) | 180 print: (map: lst :el { el + 1 }) |
91 print: (split: lst at: (length: lst) / 2) | 181 print: (split: lst at: (length: lst) / 2) |
92 tree <- makeTree: lst (length: lst) | 182 tree <- makeTree: lst |
93 print: tree | 183 print: tree |
184 print: (get: 0 fromTree: tree) | |
185 print: (get: 6 fromTree: tree) | |
186 print: (get: 8 fromTree: tree) | |
187 print: (treeMap: tree :el { el + 1 }) | |
188 print: (tree: tree set: 0 to: 42) | |
189 print: (tree: tree set: 6 to: 42) | |
190 print: (tree: tree set: 8 to: 42) | |
191 print: (fold: lst 0 with: :acc el { acc + el }) | |
192 print: (filter: lst :el { el > 4 }) | |
193 print: (tree: tree update: 8 with: :el { el + 29 }) | |
94 } | 194 } |
95 | 195 |
96 } | 196 } |