シェルピンスキー・ギャスケット(ルール90)
問題
シェルピンスキー・ギャスケットを描画しましょう。
生成には1次元セルオートマトンのルール90を使いましょう。
入力
・整数値n
出力
・n段のシェルピンスキー・ギャスケット
1次元セルオートマトン
1次元配列を細胞(セル)の並びと見なし、ルールに則って更新していく。
大体の場合、bool型もしくはint型の配列であり、各セルは0か1の値をもつ。
ルール90
セルの並びから、次のセルを決定するルール。
プログラム的には配列 i, i - 1, i + 1 番目の要素から、次のi番目の要素の値を決める。
[0][0][0] → [0]
[0][0][1] → [1]
[0][1][0] → [0]
[0][1][1] → [1]
[1][0][0] → [1]
[1][0][1] → [0]
[1][1][0] → [1]
[1][1][1] → [0]
例えば、ある配列が
[0][0][0][1][1][1][0][0][0]
だとした場合、ルール90に則って更新すると次の状態は
[0][0][1][1][0][1][1][0][0]
となる。
例
4 * * * * * * * * *
20 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
解答例
using System; namespace ギャスケット { class Program { static void Main(string[] args) { int n = int.Parse(Console.ReadLine()); int[] cells = new int[(n * 2 - 1) + 2]; int[] buff = new int[(n * 2 - 1) + 2]; cells[cells.Length / 2] = 1; for (int i = 0; i < n; i++) { for (int j = 1; j < cells.Length - 1; j++) { if (cells[j] == 1) { Console.Write("*"); } else { Console.Write(" "); } buff[j] = NextCell(cells[j - 1], cells[j], cells[j + 1]); } buff.CopyTo(cells, 0); Console.WriteLine(); } } static int NextCell(int c1, int c2, int c3) { int sum = c1 + c2 + c3; if ((sum == 0) | (sum == 3)) { return 0; } else if (sum == 2) { return c2; } else if (sum == 1) { if (c2 == 0) return 1; else return 0; } return 0; } } }