Dememoised get-neighbours, as the optimisation only works in deep
recursion which I'm no longer doing.
This commit is contained in:
parent
5f73b18d12
commit
3c26408a9f
|
@ -124,7 +124,10 @@
|
|||
(get-int cell species))
|
||||
|
||||
(def memo-get-neighbours
|
||||
"Memoised core primitive for `get-neighbours` for efficiency."
|
||||
"Memoised get neighbours is more efficient when running deeply recursive
|
||||
algorithms on the same world. But it's less efficient when running the
|
||||
engine in its normal iterative style, because then we will rarely call
|
||||
get naighbours on the same cell of the same world twice."
|
||||
(memoize
|
||||
(fn [world x y depth]
|
||||
(remove nil?
|
||||
|
@ -135,28 +138,36 @@
|
|||
(range (- y depth) (+ y depth 1)))))))))
|
||||
|
||||
(defn get-neighbours
|
||||
"Get the neighbours to distance depth of the cell at x, y in this world.
|
||||
"Get the neighbours to distance depth of a cell in this world.
|
||||
|
||||
Several overloads:
|
||||
* `world` a world, as described in world.clj;
|
||||
* `cell` a cell within that world
|
||||
Gets immediate neighbours of the specified cell.
|
||||
|
||||
* `world` a world, as described in world.clj;
|
||||
* `cell` a cell within that world
|
||||
* `depth` an integer representing the depth to search from the
|
||||
`cell`
|
||||
Gets neighbours within the specified distance of the cell.
|
||||
|
||||
* `world` a world, as described in world.clj;
|
||||
* `x` an integer representing an x coordinate in that world;
|
||||
* `y` an integer representing an y coordinate in that world;
|
||||
* `depth` an integer representing the distance from [x,y] that
|
||||
should be searched."
|
||||
should be searched
|
||||
Gets the neighbours within the specified distance of the cell at
|
||||
coordinates [x,y] in this world."
|
||||
([world x y depth]
|
||||
(memo-get-neighbours world x y depth))
|
||||
(remove nil?
|
||||
(map #(get-cell world (first %) (first (rest %)))
|
||||
(remove #(= % (list x y))
|
||||
(combo/cartesian-product
|
||||
(range (- x depth) (+ x depth 1))
|
||||
(range (- y depth) (+ y depth 1)))))))
|
||||
([world cell depth]
|
||||
"Get the neighbours to distance depth of this cell in this world.
|
||||
|
||||
* `world` a world, as described in world.clj;
|
||||
* `cell` a cell within that world;
|
||||
* `depth` an integer representing the distance from [x,y] that
|
||||
should be searched."
|
||||
(memo-get-neighbours world (:x cell) (:y cell) depth))
|
||||
([world cell]
|
||||
"Get the immediate neighbours of this cell in this world
|
||||
|
||||
* `world` a world, as described in world.clj;
|
||||
* `cell` a cell within that world."
|
||||
(get-neighbours world cell 1)))
|
||||
|
||||
(defn get-neighbours-with-property-value
|
||||
|
@ -166,10 +177,10 @@
|
|||
* `world` a world, as described in `world.clj`;
|
||||
* `cell` a cell within that world;
|
||||
* `depth` an integer representing the distance from [x,y] that
|
||||
should be searched;
|
||||
should be searched (optional);
|
||||
* `property` a keyword representing a property of the neighbours;
|
||||
* `value` a value of that property (or, possibly, the name of another);
|
||||
* `op` a comparator function to use in place of `=`.
|
||||
* `op` a comparator function to use in place of `=` (optional).
|
||||
|
||||
It gets messy."
|
||||
([world x y depth property value op]
|
||||
|
|
Loading…
Reference in a new issue