# logji

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:
```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)))
}
```