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