APL で書かれたライフゲームをネタに R に再挑戦


id:sumim:20090218:p1 に対して ライフゲーム - MEMO:はてな支店 でいろいろとアイデアをいただいたので、それを手がかりに別途仕入れた知識を活用して書いてみました。

life3 = function(m){
  rot = function(n,d) (1:n + d-1)%%n + 1
  shift2 = function(dx,dy) m[rot(nrow(m),dx),rot(ncol(m),dy)]
  s = apply(mapply(shift2,matrix(-1:1,3,3,T),matrix(-1:1,3,3)),1,sum)
  (m & (s==4)) + (s==3)
}


途中の dim にはこだわらないとか、なるべく list にしない(たとえば Map ではなく mapply を使う、とか)などが、簡潔にするコツみたいですね。


追記
mapply の部分はもっと簡略化できるようです。

life4 = function(m){
  rot = function(n,d) (1:n + d-1)%%n + 1
  shift2 = function(dx,dy) m[rot(nrow(m),dx),rot(ncol(m),dy)]
  s = apply(mapply(shift2,matrix(-1:1,3,3,T),-1:1),1,sum)
  (m & (s==4)) + (s==3)
}