読者です 読者をやめる 読者になる 読者になる

プログラム問題集

多分プログラミングの問題集でも書いていく

シェルピンスキー・ギャスケット(ルール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
                   *
                  * *
                 *   *
                * * * *
               *       *
              * *     * *
             *   *   *   *
            * * * * * * * *
           *               *
          * *             * *
         *   *           *   *
        * * * *         * * * *
       *       *       *       *
      * *     * *     * *     * *
     *   *   *   *   *   *   *   *
    * * * * * * * * * * * * * * * *
   *                               *
  * *                             * *
 *   *                           *   *
* * * *                         * * * *
解答例


C#

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