Mercurial > repos > icfp2014
changeset 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 | edc89d9c9e10 |
children | ec0b74f4f2d9 |
files | code/dotScanner.lm |
diffstat | 1 files changed, 191 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/code/dotScanner.lm Fri Jul 25 22:30:56 2014 -0700 +++ b/code/dotScanner.lm Fri Jul 25 22:37:53 2014 -0700 @@ -1,4 +1,183 @@ #{ + length <- :lst { + len <- [] + while: { not: (lst isInteger?)} do: { + lst <- lst tail + len <- len + 1 + } + len + } + + reverse <- :lst { + new <- [] + while: { not: (lst isInteger?)} do: { + new <- (lst value) | new + lst <- lst tail + } + new + } + + split:at <- :lst :pos { + first <- [] + i <- 0 + while: { i < pos } do: { + first <- (lst value) | first + lst <- lst tail + i <- i + 1 + } + #[(reverse: first) lst] + } + + map <- :lst fun { + new <- [] + while: { not: (lst isInteger?) } do: { + new <- (fun: (lst value)) | new + lst <- lst tail + } + reverse: new + } + + 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 + if: size = 2 { + ret <- #[(lst value) ((lst tail) value)] + } else: { + if: size = 1 { + ret <- lst + } else: { + sub <- split: lst at: half + ret <- #[ + (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 { + if: idx = 0 { + ret <- tree value + } else: { + ret <- tree tail + } + } else: { + if: idx < half { + ret <- get: idx fromTree: (tree value) size: half + } else: { + ret <- get: idx-half fromTree: (tree tail) size: size-half + } + } + 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 } + } + + grid:update:with <- :grid :pos :fun { + x <- pos value + y <- pos tail + tree: grid update: y with: :row { + tree: row update: x with: fun + } + } + + grid:set:to <- :grid :pos :val { + grid: grid update: pox with: :el { val } + } + /* ListGet <- :cell idx { if: idx = 0 {cell value} else: { @@ -22,7 +201,16 @@ //} counterLoad <- 4 step <- :myState world { - print: (world value) + grid <- makeTree: (map: (world value) :row { makeTree: row }) + lmState <- (world value) tail + myLoc <- (lmState tail) value + + + visited <- treeMap: grid :el { 0 } + visited <- tree: visited set: myLoc to: 1 + + + //myPos <- path <- [3 1 3 1] //scanFor: 2 3 [myPos] move <- myState value @@ -34,11 +222,11 @@ move <- 0 } else: {} } else: {} - #[#[move counter] ((path tail) value)] + #[0 ((path tail) value)] } main <- :initWorld mystery { - #[#[0 counterLoad] step] + #[0 step] } }