I had some fun with playing around with faster solutions. https://gist.github.com/favila/0573e3f644dea252bdaaed5be9d1519f
The biggest speedup comes from avoiding set creation in expanded-range (i.e., the function that produces the collection of affected coordinates) and ensuring that the ops run on the accumulating set of on-lights using transients. clojure.set/* functions require both items be sets and does not use transients internally, so it was much slower. Another big speedup comes from encoding the light coordinates more efficiently. You can encode a light as a number (in my case, a long, with high bits the x coordinate and low bits the y coordinate) instead of a vector. This creates fewer objects which are easier to hash. Finally, I tried an approach which doesn't use sets, but instead naively creates a 1000x1000 array of booleans and mutates it in place with every op. This is the fastest approach: 4 seconds on a 2010-era i3! I'm sure a proper matrix library (e.g. core.matrix) could do even better. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.