Mercurial > repos > icfp2012
comparison src/sim.tp @ 55:b2e9e5ad3ad8
fixed array out of bounds errors. Test maps to proove it.
author | William Morgan <bill@mrgn.org> |
---|---|
date | Sun, 15 Jul 2012 22:06:19 -0700 |
parents | 186fce0c98ee |
children | ca86c88c2336 |
comparison
equal
deleted
inserted
replaced
51:186fce0c98ee | 55:b2e9e5ad3ad8 |
---|---|
127 state <- #{ | 127 state <- #{ |
128 new <- :in_grid in_width in_height { | 128 new <- :in_grid in_width in_height { |
129 _nextGrid <- #[] | 129 _nextGrid <- #[] |
130 _robot <- null | 130 _robot <- null |
131 _ended <- false | 131 _ended <- false |
132 | 132 getSafe <- :collection :index { |
133 if: index >= 0 { | |
134 if: index < (collection length) { | |
135 collection get: index | |
136 } else: { (cellTypes wall) } | |
137 } else: { (cellTypes wall) } | |
138 } | |
133 _succeeded <- false | 139 _succeeded <- false |
134 ret <- #{ | 140 ret <- #{ |
135 grid <- in_grid | 141 grid <- in_grid |
136 width <- in_width | 142 width <- in_width |
137 height <- in_height | 143 height <- in_height |
138 calcIndex <- :x y { x + y * width } | 144 calcIndex <- :x y { x + y * width } |
139 calcX <- :index {index % width} | 145 calcX <- :index {index % width} |
140 calcY <- :index {index / width} | 146 calcY <- :index {index / width} |
141 getCell <- :x y { | 147 getCell <- :x y { |
142 grid get: (calcIndex: x y) | 148 grid getSafe: (calcIndex: x y) |
143 } | 149 } |
144 setCell <- :x y val { | 150 setCell <- :x y val { |
145 grid set: (calcIndex: x y) val | 151 grid set: (calcIndex: x y) val |
146 } | 152 } |
147 getNextCell <- :x y { | 153 getNextCell <- :x y { |
148 _nextGrid get: (calcIndex: x y) | 154 _nextGrid getSafe: (calcIndex: x y) |
149 } | 155 } |
150 setNextCell <- :x y val { | 156 setNextCell <- :x y val { |
151 _nextGrid set: (calcIndex: x y) val | 157 _nextGrid set: (calcIndex: x y) val |
152 } | 158 } |
153 validDest?:from <- :index :fromIndex { | 159 validDest?:from <- :index :fromIndex { |
154 cell <- (grid get: index) | 160 cell <- (grid getSafe: index) |
155 if: (cell navigable) {true} else: { | 161 if: (cell navigable) {true} else: { |
156 if: (cell eq: (cellTypes rock)) { | 162 if: (cell eq: (cellTypes rock)) { |
157 diff <- index - fromIndex | 163 diff <- index - fromIndex |
158 //make sure movement was horizontal | 164 //make sure movement was horizontal |
159 if: (abs: diff) = 1 { | 165 if: (abs: diff) = 1 { |
160 rockdest <- index + diff | 166 rockdest <- index + diff |
161 if: ((grid get: rockdest) eq: (cellTypes empty)) { | 167 if: ((grid getSafe: rockdest) eq: (cellTypes empty)) { |
162 //make sure rock destination doesn't wrap | 168 //make sure rock destination doesn't wrap |
163 (calcY: rockdest) = (calcY: index) | 169 (calcY: rockdest) = (calcY: index) |
164 } | 170 } |
165 } | 171 } |
166 } | 172 } |
279 } | 285 } |
280 printGrid <- { | 286 printGrid <- { |
281 cur <- (grid length) - width | 287 cur <- (grid length) - width |
282 col <- 0 | 288 col <- 0 |
283 while: {cur >= 0} do: { | 289 while: {cur >= 0} do: { |
284 os write: 2 ((grid get: cur) string) | 290 os write: 2 ((grid getSafe: cur) string) |
285 cur <- cur + 1 | 291 cur <- cur + 1 |
286 col <- col + 1 | 292 col <- col + 1 |
287 if: col = width { | 293 if: col = width { |
288 col <- 0 | 294 col <- 0 |
289 cur <- cur - (width + width) | 295 cur <- cur - (width + width) |