1
1

More than 3 years have passed since last update.

短いコードで複雑な結果を得る~一次元セル・オートマトン~

Last updated at Posted at 2020-07-16

これは何?

できるだけ簡潔なコードで複雑(面白)な出力を得たいと思いました。
そんなときに便利なのがオートマトン。
パラメータをカオス領域において実行するだけで摩訶不思議なパターンを描いてくれます。
参考:ルール30

コード(説明付き)

# 1次元セルオートマトン

# [ルール30](https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%BC%E3%83%AB30)
#  88 : ルール30の内部状態を左右逆にしたもの
# 135 : 状態のビットを反転したもの
# 149 : 内部状態を左右逆にし、状態のビットも反転させたもの

RULE_ID = 30 # [0, 0, 0, 1, 1, 1, 1, 0]
rule = list(map(int, f'{RULE_ID:08b}'))

N_CELL = 80  # セルサイズ
T_CNT = 100  # 実行時間

# セルの初期状態
INIT_ID = 12345678987654321 # 適当
cell_c = list(map(int, f'{INIT_ID:b}'.zfill(N_CELL)[-N_CELL:]))

for t in range(T_CNT):
    print(''.join(map(lambda n:'*' if n else ' ', cell_c))) # 1を「*」で出力

    # 次の状態
    cell_n = []
    for i in range(N_CELL):
        # 隣接する3セルの状態=[0,0,0]...[1,1,1]=0...7の8通り
        # 次の状態は、そのビット位置の値(0 or 1)を採用する
        # セルはリング状につながっているものとする
        pos = cell_c[i-1]*4 + cell_c[i]*2 + cell_c[(i+i) % N_CELL]
        cell_n.append( rule[pos])

    cell_c = cell_n # 状態の入替

コード(短縮版)

RULE_ID = 30 # [0, 0, 0, 1, 1, 1, 1, 0]
rule = list(map(int, f'{RULE_ID:08b}'))

N_CELL, T_CNT = 80, 100  # セルサイズ, 実行時間

INIT_ID = 12345678987654321 # 初期セル状態。適当
cell_c = list(map(int, f'{INIT_ID:b}'.zfill(N_CELL)[-N_CELL:]))

for t in range(T_CNT):
    print(''.join(map(lambda n:'*' if n else ' ', cell_c))) # 1を「*」で出力
    cell_n = [ rule[cell_c[i-1]*4 + cell_c[i]*2 + cell_c[(i+i) % N_CELL]] for i in range(N_CELL)] # 次の状態
    cell_c = cell_n # 状態の入替

結果

                          * * **** ***   * * *   **   * *  *   ***** *  * **   *
*                          * **  *** **   * * *  ***   * *  *  *   ** *  ****
 *                          **** * *****   * * * * **   * *  *  *  *** * *  **
  *                         *  ** **   **   * * * ****   * *  *  * * ** * * ***
   *                         * ******  ***   * * **  **   * *  *  * **** * ** **
*   *                         **    ** * **   * **** ***   * *  *  **  ** ******
**   *                        ***   *** ****   **  *** **   * *  * *** ****
***   *                       * **  * ***  **  *** * *****   * *  ** ***  **
* **   *                       ****  ** ** *** * ** **   **   * * **** ** ***
 ****   *                      *  ** ******* ** *******  ***   * **  ****** **
 *  **   *                      * ****     ******     ** * **   **** *    *****
  * ***   *                      **  **    *    **    *** ****  *  ** *   *   **
*  ** **   *                     *** ***    *   ***   * ***  **  * *** *   *  **
** ******   *                    * *** **    *  * **   ** ** ***  ** ** *   * *
****    **   *                    ** *****    *  ****  ******* ** ****** *   * *
   **   ***   *                   ****   **    * *  ** *     ******    ** *   **
*  ***  * **   *                  *  **  ***    * * *** *    *    **   *** *  **
** * **  ****   *                  * *** * **    * ** ** *    *   ***  * ** * *
*** **** *  **   *                  ** ** ****    ******* *    *  * **  **** * *
  ***  ** * ***   *                 *******  **   *     ** *    *  **** *  ** **
* * ** *** ** **   *                *     ** ***   *    *** *    * *  ** * *****
** ***** ********   *                *    **** **   *   * ** *    * * *** **
****   ***      **   *                *   *  *****   *   **** *    * ** *****
*  **  * **     ***   *                *   * *   **   *  *  ** *    *****   **
 * ***  ****    * **   *                *   * *  ***   *  * *** *   *   **  ***
  ** ** *  **    ****   *                *   * * * **   *  ** ** *   *  *** * **
* ****** * ***   *  **   *                *   * * ****   * ****** *   * * ** ***
***    ** ** **   * ***   *                *   * **  **   **    ** *   * *****
* **   *********   ** **   *                *   **** ***  ***   *** *   **   **
 ****  *       **  ******   *                *  *  *** ** * **  * ** *  ***  ***
**  **  *      *** *    **   *                *  * * ***** ****  **** * * ** * *
 ** ***  *     * ** *   ***   *                *  * **   ***  ** *  ** * **** **
***** **  *     **** *  * **   *                *  ****  * ** *** * *** **  ****
    *****  *    *  ** *  ****   *                * *  **  ***** ** ** ***** *
    *   **  *    * *** * *  **   *                * * *** *   *********   ** *
     *  ***  *    ** ** * * ***   *                * ** ** *  *       **  *** *
      * * **  *   ****** * ** **   *                ******* *  *      *** * ** *
*      * ****  *  *    ** *******   *               *     ** *  *     * ** ****
 *      **  **  *  *   ****     **   *               *    *** *  *     *****  **
* *     *** ***  *  *  *  **    ***   *               *   * ** *  *    *   ** **
** *    * *** **  *  *  * ***   * **   *               *   **** *  *    *  ****
*** *    ** *****  *  *  ** **   ****   *               *  *  ** *  *    * *  **
  ** *   ****   **  *  * ******  *  **   *               *  * *** *  *    * * *
  *** *  *  **  ***  *  **    **  * ***   *               *  ** ** *  *    * * *
* * ** *  * *** * **  * ***   ***  ** **   *               * ****** *  *    * *
 * **** *  ** ** ****  ** **  * ** ******   *               **    ** *  *    * *
* **  ** * *******  ** ******  *****    **   *              ***   *** *  *    *
 **** *** **     ** ****    ** *   **   ***   *             * **  * ** *  *    *
**  *** *****    ****  **   *** *  ***  * **   *             ****  **** *  *
*** * ***   **   *  ** ***  * ** * * **  ****   *            *  ** *  ** *  *
* ** ** **  ***   * **** **  **** * **** *  **   *            * *** * *** *  *
 ********** * **   **  ***** *  ** **  ** * ***   *            ** ** ** ** *  *
 *        ** ****  *** *   ** * ****** *** ** **   *           ************ *  *
* *       ****  ** * ** *  *** **    *** ********   *          *          ** *
 * *      *  ** *** **** * * *****   * ***      **   *          *         *** *
  * *      * **** ***  ** * **   **   ** **     ***   *          *        * ** *
*  * *      **  *** ** *** ****  ***  ******    * **   *          *        ****
 *  * *     *** * ****** ***  ** * ** *    **    ****   *          *       *  **
* *  * *    * ** **    *** ** *** **** *   ***   *  **   *          *       * **
** *  * *    *******   * ****** ***  ** *  * **   * ***   *          *       **
*** *  * *   *     **   **    *** ** *** *  ****   ** **   *          *      ***
  ** *  * *   *    ***  ***   * ****** ** * *  **  ******   *          *     *
  *** *  * *   *   * ** * **   **    ***** * * *** *    **   *          *     *
  * ** *  * *   *   **** ****  ***   *   ** * ** ** *   ***   *          *     *
*  **** *  * *   *  *  ***  ** * **   *  *** ******* *  * **   *          *
 * *  ** *  * *   *  * * ** *** ****   * * ***     ** *  ****   *          *
  * * *** *  * *   *  * ***** ***  **   * ** **    *** * *  **   *          *
   * ** ** *  * *   *  **   *** ** ***   *******   * ** * * ***   *          *
    ******* *  * *   * ***  * ****** **  *     **   **** * ** **   *          *
    *     ** *  * *   ** **  **    *****  *    ***  *  ** *******   *          *
*    *    *** *  * *  ****** ***   *   **  *   * **  * ****     **   *
 *    *   * ** *  * * *    *** **   *  ***  *   ****  **  **    ***   *
  *    *   **** *  * * *   * *****   * * **  *  *  ** *** ***   * **   *
   *    *  *  ** *  * * *   **   **   * ****  *  * **** *** **   ****   *
    *    *  * *** *  * * *  ***  ***   **  **  *  **  *** *****  *  **   *
     *    *  ** ** *  * * * * ** * **  *** ***  * *** * ***   **  * ***   *
      *    * ****** *  * * * **** **** * *** **  ** ** ** **  ***  ** **   *
       *    **    ** *  * * **  ***  ** ** ***** ************ * ** ******   *
        *   ***   *** *  * **** * ** *******   ***          ** *****    **   *
         *  * **  * ** *  **  ** *****     **  * **         ****   **   ***   *
          *  ****  **** * *** ****   **    ***  ****        *  **  ***  * **   *
*          * *  ** *  ** ** ***  **  ***   * ** *  **        * *** * **  ****
 *          * * *** * ******* ** *** * **   **** * ***        ** ** **** *  **
  *          * ** ** **     ****** ** ****  *  ** ** **       *******  ** * ***
   *          **********    *    ******  **  * *********      *     ** *** ** **
*   *         *        **    *   *    ** ***  **       **      *    **** *******
**   *         *       ***    *   *   **** ** ***      ***      *   *  ***
***   *         *      * **    *   *  *  ****** **     * **      *   * * **
* **   *         *      ****    *   *  * *    *****     ****      *   * ****
 ****   *         *     *  **    *   *  * *   *   **    *  **      *   **  **
 *  **   *         *     * ***    *   *  * *   *  ***    * ***      *  *** ***
  * ***   *         *     ** **    *   *  * *   * * **    ** **      * * *** **
   ** **   *         *    ******    *   *  * *   * ****   ******      * ** *****
*  ******   *         *   *    **    *   *  * *   **  **  *    **      *****   *
** *    **   *         *   *   ***    *   *  * *  *** ***  *   ***     *   **  *
 ** *   ***   *         *   *  * **    *   *  * * * *** **  *  * **     *  *** *
**** *  * **   *         *   *  ****    *   *  * * ** *****  *  ****     * * **
*  ** *  ****   *         *   * *  **    *   *  * *****   **  * *  **     * ****
** *** * *  **   *         *   * * ***    *   *  **   **  ***  * * ***     **
**** ** * * ***   *         *   * ** **    *   * ***  *** * **  * ** **    ***
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1