Mercurial > repos > icfp2012
view src/sim.tp @ 37:2dc785f67327
Use new tpc shell script so that errors are displayed on the console
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 15 Jul 2012 13:06:58 -0700 |
parents | 814e3d482ad3 |
children | 9bccdb3ac979 f38437d22ebd |
line wrap: on
line source
{ null <- #{} eachbyte <- :string action { strLen <- string byte_length: index <- 0 while: {index < strLen} do: { element <- (string byte: index) action: index element index <- index + 1 } } debugLog <- :str { os write: 2 str } makeCellTypes <- { typedict <- dict linear new <- :idStr { cannav <- if: idStr = " " {true} else: { if: idStr = "." {true} else: { if: idStr = "\\" {true} else: { if: idStr = "O" {true} else: { false }}}} ret <- #{ id <- (idStr byte: 0) string <- idStr isrobot <- { false } eq <- :other { id = (other id) } navigable <- { cannav } } typedict set: (ret id) ret ret } #{ find <- :id { if: id = ("R" byte: 0) { robot: } else: { typedict get: id withDefault: empty } } wall <- new: "#" empty <- new: " " earth <- new: "." rock <- new: "*" lambda <- new: "\\" closedLift <- new: "L" openLift <- new: "O" newline <- new: "\n" robot <- { commands <- dict linear ret <- #{ id <- ("R" byte: 0) string <- "R" x <- 0 y <- 0 isrobot <- { true } eq <- :other { id = (other id) } collected <- 0 heldBreath <- 0 razors <- 0 busted <- false mine <- null doCmd <- :cmd { action <- commands get: cmd action: } move <- :xDelta yDelta { xPrime <- x + xDelta yPrime <- y + yDelta writeMove <- { mine setCell: xPrime yPrime self mine setCell: x y empty x <- xPrime y <- yPrime } consequenceOf <- :cur { if: (cur eq: lambda) {collected <- collected + 1} if: (cur eq: openLift) {mine succeeded!: true} } destination <- mine getCell: xPrime yPrime if: (destination navigable: ) { consequenceOf: destination writeMove: } else: { if: (destination eq: rock) { xPrimePrime <- xDelta * 2 + x rockDestination <- mine getCell: xPrimePrime y if: (rockDestination eq: empty) { mine setCell: xPrimePrime y rock writeMove: } } } } } commands set: "L" {ret move: (-1) 0 } commands set: "R" {ret move: 1 0 } commands set: "U" {ret move: 0 1 } commands set: "D" {ret move: 0 (-1) } //commands set: "A" {mine ended!: true} ret } } } #{ cellTypes <- makeCellTypes: state <- #{ new <- :in_grid in_width in_height { nextGrid <- #[] robot <- null endreached <- false ret <- #{ grid <- in_grid width <- in_width height <- in_height calcIndex <- :x y { x + y * width } calcX <- :index {index % width} calcY <- :index {index / width} setCell <- :x y val { grid set: (calcIndex: x y) val } getCell <- :x y { grid get: (calcIndex: x y) } updatePos <- :obj Index { obj x!: (calcX: Index) obj y!: (calcY: Index) } water <- 0 flooding <- 0 waterproof <- 10 moves <- 0 ended <- {endreached} succeeded <- false doUpdate <- { true } advance <- :roboCmd { endreached <- roboCmd = "A" if: (not: endreached) { robot doCmd: roboCmd moves <- moves + 1 doUpdate: } self } printGrid <- { cur <- (grid length) - width col <- 0 while: {cur >= 0} do: { os write: 2 ((grid get: cur) string) cur <- cur + 1 col <- col + 1 if: col = width { col <- 0 cur <- cur - (width + width) os write: 2 "\n" } } } } foreach: in_grid :index el{ nextGrid append: el if: (el isrobot) { robot <- el robot mine!: ret ret updatePos: robot index } // adding a 'new' method to robot and doing this instead // wolud allow me to treat robots and other cellTypes equaly // particularly for adding methods or state to other cellTypess. // // if: (el = (cellTypes robot)) { // robot <- el new: // (ret grid) set: index robot // robot mine!: ret // ret updatePos: robot index // nextGrid append: el // } else: { // nextGrid append: el // } } ret } fromStr <- :str { strLen <- str byte_length: maxCol <- 0 nl <- (cellTypes newline) id blank <- cellTypes empty lines <- #[] curline <- #[] eachbyte: str :index element { if: element = nl { col <- curline length maxCol <- if: col > maxCol {col} else: {maxCol} lines append: curline curline <- #[] } else: { curline append: (cellTypes find: element) } } grid <- #[] cur <- (lines length) - 1 while: { cur >= 0 } do: { curline <- (lines get: cur) foreach: curline :idx el { grid append: el } extra <- maxCol - (curline length) while: { extra > 0 } do: { grid append: blank extra <- extra - 1 } cur <- cur - 1 } new: grid maxCol (lines length) } } readFd <- :fd { if: fd < 0 { "" } else: { cur <- "" part <- "" while: { part <- os read: fd 128 part != "" } do: { cur <- cur . part } cur } } readFile <- :path { fd <- os open: path (os O_RDONLY) out <- readFd: fd os close: fd out } getMove <- { ret <- os read: 0 1 while: {ret = "\n"} do: { ret <- os read: 0 1 } ret } main <- :args { if: (args length) < 2 { print: "usage: sim filename\n" } else: { verbose <- true text <- readFile: (args get: 1) print: text //os close: 1 simState <- state fromStr: text while: { not: (simState ended: ) } do: { simState advance: (getMove: ) if: verbose { simState printGrid } } } } } }