1. count = 0;
  2. rules = {
  3. ({
  4. {0, 0},
  5. {0, 0}
  6. }) -> ({
  7. {0, 0},
  8. {0, 0}
  9. }), ({
  10. {1, 0},
  11. {0, 0}
  12. }) -> ({
  13. {0, 0},
  14. {1, 0}
  15. }), ({
  16. {0, 1},
  17. {0, 0}
  18. }) -> ({
  19. {0, 0},
  20. {0, 1}
  21. }), ({
  22. {1, 1},
  23. {0, 0}
  24. }) -> ({
  25. {0, 0},
  26. {1, 1}
  27. }),
  28. ({
  29. {0, 0},
  30. {1, 0}
  31. }) -> ({
  32. {0, 0},
  33. {1, 0}
  34. }), ({
  35. {1, 0},
  36. {1, 0}
  37. }) -> ({
  38. {0, 0},
  39. {1, 1}
  40. }), ({
  41. {0, 1},
  42. {1, 0}
  43. }) -> ({
  44. {0, 0},
  45. {1, 1}
  46. }), ({
  47. {1, 1},
  48. {1, 0}
  49. }) -> ({
  50. {1, 0},
  51. {1, 1}
  52. }),
  53. ({
  54. {0, 0},
  55. {0, 1}
  56. }) -> ({
  57. {0, 0},
  58. {0, 1}
  59. }), ({
  60. {1, 0},
  61. {0, 1}
  62. }) -> ({
  63. {0, 0},
  64. {1, 1}
  65. }), ({
  66. {0, 1},
  67. {0, 1}
  68. }) -> ({
  69. {0, 0},
  70. {1, 1}
  71. }), ({
  72. {1, 1},
  73. {0, 1}
  74. }) -> ({
  75. {0, 1},
  76. {1, 1}
  77. }),
  78. ({
  79. {0, 0},
  80. {1, 1}
  81. }) -> ({
  82. {0, 0},
  83. {1, 1}
  84. }), ({
  85. {1, 0},
  86. {1, 1}
  87. }) -> ({
  88. {1, 0},
  89. {1, 1}
  90. }), ({
  91. {0, 1},
  92. {1, 1}
  93. }) -> ({
  94. {0, 1},
  95. {1, 1}
  96. }), ({
  97. {1, 1},
  98. {1, 1}
  99. }) -> ({
  100. {1, 1},
  101. {1, 1}
  102. })
  103. };
  104. nextgen0[m_] := Block[{a, c}, c = Flatten@Table[
  105. a = (({
  106. {m[[i, j]], m[[i, j + 1]]},
  107. {m[[i + 1, j]], m[[i + 1, j + 1]]}
  108. }) /. rules); {{i, j} -> a[[1, 1]], {i, j + 1} ->
  109. a[[1, 2]], {i + 1, j} -> a[[2, 1]], {i + 1, j + 1} ->
  110. a[[2, 2]]},
  111. {i, 1, Dimensions[m][[1]] - 1, 2}, {j, 1,
  112. Dimensions[m][[2]] - 1, 2}
  113. ];
  114. Table[{i, j} /. c
  115. , {i, Dimensions[m][[1]]}
  116. , {j, Dimensions[m][[2]]}
  117. ]
  118. ];
  119. nextgen[m_] := If[count++; Mod[count, 2] == 0,
  120. nextgen0[m]
  121. ,
  122. Block[{last, mt},
  123. last = Last[m];
  124. mt = m[[;; -2]];
  125. Join[
  126. Map[#[[3 ;; -3]] &,
  127. (moveforward[nextgen0[movebackward[
  128.  
  129. PadRight[PadLeft[mt, Dimensions[mt] + {2, 2}],
  130. Dimensions[mt] + {4, 4}]
  131. ]]]
  132. )[[3 ;; -3]]]
  133. ,
  134. {last}
  135. ]
  136. ]
  137. ];
  138. moveforward[m_] := Transpose[RotateRight[Transpose[RotateRight[m]]]];
  139. movebackward[m_] := Transpose[RotateLeft[Transpose[RotateLeft[m]]]];
  140.  
  141. m = Table[
  142. If[((i - 14)^2 + (j - 10)^2 < 4^2) ||
  143. i < 20 - 16 Exp[-(j - 10)^2/(800/25)], 0, 1], {i, 20}, {j, 20}];
  144.  
  145. gens = NestList[nextgen, m, 30];
  146. ListAnimate[ArrayPlot /@ gens]