Want more features on Pastebin? Sign Up, it's FREE!

Sand falling automaton

By: Matthen on Nov 13th, 2012  |  syntax: None  |  size: 2.59 KB  |  views: 186  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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]
clone this paste RAW Paste Data