SHOW:
|
|
- or go back to the newest paste.
| 1 | - | simpleDeltas =: (1 0),(0 _1),(_1 0),,:(0 1) |
| 1 | + | NB. true for rows in x which index true value in y |
| 2 | - | eightdirDeltas =: (_1 1),(_1 _1),(1 _1),(1 1),simpleDeltas |
| 2 | + | validIn =: (<"1@(|~ #) { ]) *. (|~ #) -:"1 [
|
| 3 | ||
| 4 | - | indexOutOfBounds =: (0 > ]) +./@:, <: NB. x={vect}shapeOfArray, y={vect}index; z=bit
|
| 4 | + | filter =: 1 : '#~ u' NB. removes all elements of y where u(y[i]) is false |
| 5 | ||
| 6 | - | atIndex =: ({~ <@:|.)"_ 1 NB. equivalent of x[y2][...][y0] in C-style language
|
| 6 | + | |
| 7 | manhattanDeltas=: 3 :'(,-)=i.#$y' NB. unit vectors oriented on coordinate axes | |
| 8 | - | filter =: 1 : '((0~:u)"_1 y) # y' NB. removes all elements of y where u(y[i]) = 0 |
| 8 | + | |
| 9 | NB. x = [[bit]] valid squares | |
| 10 | NB. y = [num] index | |
| 11 | NB. z = [[num]] neighbors | |
| 12 | - | shuffle =: (#?#) { ]
|
| 12 | + | gridNeighbors =: 1 : 0 |
| 13 | [: validIn&m filter (manhattanDeltas m) +"1 ] | |
| 14 | ) | |
| 15 | ||
| 16 | NB. m = [[bit]] valid squares | |
| 17 | - | gridNeighbors =: 4 : 0 |
| 17 | + | |
| 18 | - | neighbors =. simpleDeltas +"1 y |
| 18 | + | |
| 19 | - | neighbors =. (-.@(($x)&indexOutOfBounds)) filter neighbors NB. remove those leaving the grid |
| 19 | + | |
| 20 | - | neighbors =. x&atIndex filter neighbors NB. remove those entering a wall |
| 20 | + | > <@,"_ 1 m gridNeighbors@{:@>
|
| 21 | ) | |
| 22 | ||
| 23 | - | NB. Path<T> =: [{boxed num}distance, {boxed [T]}path]
|
| 23 | + | |
| 24 | NB. u = (Path<Node>)->[Path<Node>] extendPath | |
| 25 | NB. v = (Node,Node)->num heuristicDist | |
| 26 | NB. y = Node start | |
| 27 | NB. z = Path<Node> shortest path | |
| 28 | aStar =: 2 : 0 | |
| 29 | - | newDist =. 1 + > {. y
|
| 29 | + | |
| 30 | - | path =. > {: y
|
| 30 | + | |
| 31 | - | lastPos =. {: path
|
| 31 | + | frontier =. ,<,:y |
| 32 | - | newPoses =. m gridNeighbors lastPos |
| 32 | + | |
| 33 | - | newPaths =. path ,"_ 1 newPoses |
| 33 | + | |
| 34 | - | (newDist ; <)"_1 newPaths |
| 34 | + | |
| 35 | last =. {: > currentPath
| |
| 36 | if. last e. closed do. continue. end. | |
| 37 | if. last -: x do. >currentPath return. end. | |
| 38 | closed =. closed, last | |
| 39 | frontier =. frontier, u currentPath | |
| 40 | NB. SORT FRONTIER | |
| 41 | scores =. (# + x v {:)&> frontier
| |
| 42 | frontier =. frontier /: scores | |
| 43 | end. | |
| 44 | exception_message=:'No path found.' throw. | |
| 45 | - | frontier =. ,: 0;<,:y |
| 45 | + | |
| 46 | ||
| 47 | exampleG =: '#' = ];._2]0 :0 | |
| 48 | ....##..## | |
| 49 | - | last =. {: > {: currentPath
|
| 49 | + | .##.##..## |
| 50 | - | if. last e. closed do. continue. end. |
| 50 | + | #..#####.. |
| 51 | - | if. last -: x do. currentPath return. end. |
| 51 | + | #.#...##.. |
| 52 | .##...###. | |
| 53 | - | frontier =. frontier, (u currentPath) |
| 53 | + | .##.####.# |
| 54 | ..#..##.#. | |
| 55 | - | scores =. (>@{. + (x v {:@:>@:{:))"_1 frontier
|
| 55 | + | ###.##..## |
| 56 | #.#####..# | |
| 57 | ...####..# | |
| 58 | ) | |
| 59 | ||
| 60 | exampleSolution =: 0 8 (((|:exampleG) gridExtendPath) aStar manhattanDistance) 5 0 | |
| 61 | - | exampleG =: 10 10 $ (0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 0 1) |
| 61 | + | |
| 62 | - | exampleSolution =: 0 8 ((exampleG gridExtendPath) aStar manhattanDistance) 5 0 |
| 62 | + | NB. to inspect this solution, use: |
| 63 | '*' (<"1 exampleSolution)} '.#' {~ |:exampleG
| |
| 64 | ||
| 65 | NB. or | |
| 66 | ||
| 67 | '*' (<@|."1 exampleSolution)} '.#' {~ exampleG |