Mercurial > repos > icfp2014
view 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 |
line wrap: on
line source
#{ 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: { ListGet: (cell tail) (idx - 1) } } TupGet <- :cell depth size { if: idx = 0 {cell value} else: { if: size = 1 {cell tail} else: { // warning, out-of-bounds idx will return a value! TupGet: (cell tail) (idx - 1) (size - 1) }} } // rowmajor lists GridGet <- :x y w h{ ListGet ... } */ //scanFor <- :target depth visited{ //} counterLoad <- 4 step <- :myState world { 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 counter <- (myState tail) - 1 if: counter = 0 { move <- move + 1 counter <- counterLoad if: move = 4 { move <- 0 } else: {} } else: {} #[0 ((path tail) value)] } main <- :initWorld mystery { #[0 step] } } //does not work: //someListOrTup get: 0 //lambdaman program (step function) faulted TagMismatch