Mercurial > repos > icfp2014
diff 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 |
line wrap: on
line diff
--- a/code/mike00.lm Fri Jul 25 22:52:05 2014 -0700 +++ b/code/mike00.lm Fri Jul 25 22:52:52 2014 -0700 @@ -37,7 +37,26 @@ reverse: new } - makeTree <- :lst size { + fold:with <- :lst acc :fun { + while: { not: (lst isInteger?) } do: { + acc <- fun: acc (lst value) + lst <- lst tail + } + acc + } + + filter <- :lst pred { + new <- [] + while: { not: (lst isInteger?) } do: { + if: (pred: (lst value)) { + new <- (lst value) | new + } else: {} + lst <- lst tail + } + reverse: new + } + + makeTree:size <- :lst :size { ret <- 0 sub <- 0 half <- size / 2 @@ -49,15 +68,21 @@ } else: { sub <- split: lst at: half ret <- #[ - (makeTree: (sub value) half) - (makeTree: (sub tail) size-half) + (makeTree: (sub value) size: half) + (makeTree: (sub tail) size: size-half) ] } } ret } + makeTree <- :lst { + size <- lst length + #[size (makeTree: lst size: size)] + } + get:fromTree:size <- :idx :tree :size { + print: #[1 tree size] ret <- 0 half <- size / 2 if: size <= 2 { @@ -76,6 +101,71 @@ ret } + get:fromTree <- :idx :tree { + size <- tree value + print: #[0 size] + get: idx fromTree: (tree tail) size: size + } + + treeMap:size <- :tree fun :size { + ret <- 0 + half <- size / 2 + if: size = 2 { + ret <- #[(fun: (tree value)) (fun: (tree tail))] + } else: { + if: size = 1 { + ret <- #[(fun: (tree value)) 0] + } else: { + ret <- #[ + (treeMap: (tree value) fun size: half) + (treeMap: (tree tail) fun size: size-half) + ] + } + } + ret + } + + treeMap <- :tree fun { + #[(tree value) (treeMap: (tree tail) fun size: (tree value))] + } + + tree:size:update:with <- :tree :size :idx :fun { + ret <- 0 + half <- size / 2 + if: size = 2 { + if: idx = 0 { + ret <- #[(fun: (tree value)) (tree tail)] + } else: { + ret <- #[(tree value) (fun: (tree tail))] + } + } else: { + if: size = 1 { + ret <- #[(fun: (tree value)) 0] + } else: { + if: (idx < half) { + ret <- #[ + (tree: (tree value) size: half update: idx with: fun) + (tree tail) + ] + } else: { + ret <- #[ + (tree value) + (tree: (tree tail) size: size-half update: idx-half with: fun) + ] + } + } + } + ret + } + + tree:update:with <- :tree :idx :fun { + #[(tree value) (tree: (tree tail) size: (tree value) update: idx with: fun)] + } + + tree:set:to <- :tree :idx :val { + tree: tree update: idx with: :el { val } + } + height <- 0 width <- 0 @@ -89,8 +179,18 @@ print: (length: lst) print: (map: lst :el { el + 1 }) print: (split: lst at: (length: lst) / 2) - tree <- makeTree: lst (length: lst) + tree <- makeTree: lst print: tree + print: (get: 0 fromTree: tree) + print: (get: 6 fromTree: tree) + print: (get: 8 fromTree: tree) + print: (treeMap: tree :el { el + 1 }) + print: (tree: tree set: 0 to: 42) + print: (tree: tree set: 6 to: 42) + print: (tree: tree set: 8 to: 42) + print: (fold: lst 0 with: :acc el { acc + el }) + print: (filter: lst :el { el > 4 }) + print: (tree: tree update: 8 with: :el { el + 29 }) } } \ No newline at end of file