Skip to content

Instantly share code, notes, and snippets.

@aharisu
Created October 16, 2010 06:12
Show Gist options
  • Save aharisu/629501 to your computer and use it in GitHub Desktop.
Save aharisu/629501 to your computer and use it in GitHub Desktop.
Life game in Scala ver Iterator
import _root_.scala.util.Random
def lifeGameIterator(stride:Int) = new Iterator[Array[Array[Boolean]]] {
private def pathFilter(num : Int) = num
private def prevFilter(num : Int) = if(num == 0) stride - 1 else num - 1
private def nextFilter(num : Int) = if(num == stride - 1) 0 else num + 1
private def cellArriveGetter(xFilter:(Int)=>Int, yFilter: (Int)=>Int)
(cells:Array[Array[Boolean]], x:Int, y:Int) = cells(yFilter(y))(xFilter(x))
private val _isArriveGetter = List(
cellArriveGetter(prevFilter, prevFilter)_ , cellArriveGetter(pathFilter, prevFilter)_ , cellArriveGetter(nextFilter, prevFilter)_ ,
cellArriveGetter(prevFilter, pathFilter)_ , cellArriveGetter(nextFilter, pathFilter)_ ,
cellArriveGetter(prevFilter, nextFilter)_,cellArriveGetter(pathFilter, nextFilter)_,cellArriveGetter(nextFilter, nextFilter)_)
private var _cells = Array.tabulate(stride, stride)((_,_) => Random.nextInt % 5 == 0)
def hasNext = true
def next:Array[Array[Boolean]] = {
_cells.zipWithIndex.map(row => row._1.zipWithIndex.map(cell => {
val count = _isArriveGetter.foldLeft(0)((acc, f) => acc + (if(f(_cells, cell._2, row._2)) 1 else 0))
count == 3 || count == 2 && cell._1
}))
}
}
lifeGameIterator(30).foreach(cells => {
cells.foreach(row => {
row.foreach(cell => {print(if(cell) "●" else "○")})
println
})
println
Thread.sleep(500)
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment