Rewrite rules automaton
This idea is solely based on an amazing project MarkovJunior, which is essentially probabilistic pattern matching machine. I though, "ha. This must be the best fit for Wolfram Language!".
Indeed, no tricks were used, except mirroring and rotating the "canvas" to generalize 1D rules into 2D, the rest is purely default pattern matching of the language:
r[{before___, {a___, (RGBColor[1, 0, 0]),(GrayLevel[0]),(GrayLevel[0]), b___}, after___}] :=
{before, {a, (RGBColor[0, 0, 1]),(RGBColor[0, 0, 1]),(RGBColor[1, 0, 0]), b}, after} /; (RandomReal[]<=0.5);
r[{before___, {a___, (RGBColor[1, 0, 0]),n_,(RGBColor[0, 0, 1]), b___}, after___}] :=
{before, {a, (RGBColor[0, 0, 1]),n,(RGBColor[1, 0, 0]), b}, after} /; (RandomReal[]<=0.5);
r[any_] := any
field = Table[(GrayLevel[0]), {30}, {30}];
field[[RandomInteger[{1,30}],RandomInteger[{1,30}]]] = (RGBColor[1, 0, 0]);
Refresh[ArrayPlot[field = applyInAllSymmetries[field]], 0.04]
where
rot[0][m_] := m;
rot[1][m_] := Transpose[Reverse[m]];
rot[2][m_] := Reverse[Reverse /@ m];
rot[3][m_] := Reverse[Transpose[m]];
mirror[m_] := Reverse /@ m; (* left-right mirror *)
symmetries = Join[
Table[rot[k], {k, 0, 3}],
Table[rot[k] @* mirror, {k, 0, 3}]
];
inverseSymmetries = Join[
Table[rot[Mod[-k, 4]], {k, 0, 3}],
Table[mirror @* rot[Mod[-k, 4]], {k, 0, 3}]
];
applyInAllSymmetries[m_] :=
Fold[
#2[[2]][r[#2[[1]][#1]]] &,
m,
Transpose[{symmetries, inverseSymmetries}]
];
u/Inst2f — 4 days ago