import scala.annotation.tailrec trait Life { type Entity type Population = Set[Entity] def generation(pop: Population) = pop.flatMap(neighborhood).filter { entity => willLive(pop.contains(entity), neighbors(entity).count(pop.contains)) } def neighbors(entity: Entity): Seq[Entity] def neighborhood(entity: Entity) = neighbors(entity) :+ entity def willLive(now: Boolean, n: Int): Boolean def render(pop: Population): Unit = println(pop) @tailrec final def run(pop: Population): Unit = { render(pop) if (!pop.isEmpty) run(generation(pop)) } } class Life2D extends Life { type Entity = (Int, Int) override def willLive(now: Boolean, n: Int) = ((now && n == 2) || n == 3) override def neighbors(entity: Entity) = entity match { case (x, y) => for (i <- x-1 to x+1; j <- y-1 to y+1 if !(i == x && j == y)) yield (i, j) } } object Blinker extends Life2D { def main(argv: Array[String]) = run(Set((1, 0), (1, 1), (1, 2))) }
noodling towards a functional brain
Sunday, February 27, 2011
Code Retreat Boulder: Conway's Life
I had a ton of fun yesterday at Code Retreat Boulder, even though I ended up as the Scala guy and thus didn't get to play in other languages as much as I would have liked.
Anyway, this morning I decided to recreate my favorite of the solutions. Small, simple, pure, and relatively flexible:
Subscribe to:
Post Comments (Atom)
So pretty!
ReplyDeleteThere, I prettied it up some. Still haven't shed my Scala 2.7.x habits yet. The new libraries are so much nicer!
ReplyDelete