challenge ライフゲーム

セルオートマトンに関するお題です. 
2次元タイプの'ライフゲーム'を実装して下さい. 
初期値としては10行10列程度の格子上の平面に0.3程度の人口(?)密度を考え, 
末端はループするようにして下さい. (例: 座標[-1, -1] = [10, 10])

それだけだと簡単すぎると思われる方は, 
過密状態で間引きが発生するような機能を組み込んで下さい. 
間引きは, 少なくともその後の1時間ステップにおける死亡率が, 
それをしなかった場合よりも小さくなれば結構です. 
(死亡率の最小化は複雑性が高すぎる感がありますし. )
サンプル:
t = 0
[ ][*][ ][ ][ ][ ][*][*][*][ ]
[ ][ ][ ][ ][*][ ][ ][*][*][ ]
[ ][ ][ ][*][ ][ ][*][ ][*][ ]
[*][ ][*][*][ ][ ][*][ ][ ][ ]
[ ][*][ ][ ][ ][ ][ ][ ][*][ ]
[*][ ][ ][ ][*][ ][*][*][ ][*]
[ ][*][ ][ ][ ][ ][*][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][*]
[*][ ][ ][ ][ ][ ][*][ ][ ][*]
[ ][ ][ ][ ][*][*][ ][ ][*][ ]
t = 1
[ ][ ][ ][ ][*][ ][ ][ ][ ][*]
[ ][ ][ ][ ][ ][*][ ][ ][ ][*]
[ ][ ][*][ ][*][*][*][ ][*][*]
[ ][*][ ][*][ ][ ][ ][ ][ ][*]
[ ][ ][*][*][ ][*][*][ ][*][ ]
[ ][*][ ][ ][ ][*][*][ ][*][*]
[ ][ ][ ][ ][ ][*][*][*][*][*]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][*]
[*][ ][ ][ ][ ][*][ ][ ][*][ ]
[*][ ][ ][ ][ ][ ][ ][ ][ ][ ]

Posted feedbacks - PostScript

PostScript で書いてみました。 このままプリンタに流すと1世代1枚の紙を浪費しますのでご注意下さい。
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
!PS

%---------------- Initialize -----------
/TestMap [ % 10x10
   0 1 0 0 0 0 1 1 1 0
   0 0 0 0 1 0 0 1 1 0
   0 0 0 1 0 0 1 0 1 0
   1 0 1 1 0 0 1 0 0 0
   0 1 0 0 0 0 0 0 1 0
   1 0 0 0 1 0 1 1 0 1
   0 1 0 0 0 0 1 0 0 0
   0 0 0 0 0 0 0 0 0 1
   1 0 0 0 0 0 1 0 0 1
   0 0 0 0 1 1 0 0 1 0
] def
/RandomMap {
    realtime srand
    [1 1 MapSize2 { pop rand 1000 mod 300 gt {0} {1} ifelse } for]
} def

/OrgMap { TestMap } def
/MapSizeX 10 def
/MapSizeY 10 def
/Loop 150 def

%              0    1     2     3     4    5    6     7      8    
/RuleBorn [ false false false  true false false false false false ] def
/RuleKeep [ false false  true  true false false false false false ] def

% ----Printout Size-------------------
/MapWidth 500 def
/MapHeight 500 def
/MapOffsetX 20 def
/MapOffsetY 70 def
% -------------------------------------
/Times-Roman findfont 16 scalefont setfont
/MapSizeX2 MapSizeX 2 add def
/MapSize2 MapSizeX MapSizeY mul def
/MapSize3 MapSizeX2 MapSizeY mul def

/Vect [-1 MapSizeX2 sub 0 MapSizeX2 sub 1 MapSizeX2 sub -1 1 MapSizeX2 1 sub M\
apSizeX2 MapSizeX2 1 add] def

/DispMap {
    20 20 moveto (Life Game: Stage=) show
    10 string cvs show
    /Map exch def
    /VX MapWidth MapSizeX idiv def
    /VY MapHeight MapSizeY idiv def
    0 1 MapSizeY 1 sub {
        /y exch def
        0 1 MapSizeX 1 sub {
            /x exch def
            x VX mul MapOffsetX add
            y VY mul -1 mul MapHeight add MapOffsetY add moveto
            VX 0 rlineto 0 VY rlineto 0 VX sub 0 rlineto closepath
            Map x y MapSizeX2 mul add 1 add get 1 eq { fill } { stroke } ifels\
e
        } for
    } for
} def

/ExpandMap {
    /Offset exch def
    /Width MapSizeX Offset 2 mul add def
    /Map exch def
    [
        0 1 MapSizeY 1 sub {
            Width mul Offset add /v exch def
            Map v MapSizeX add 1 sub get
            0 1 MapSizeX 1 sub {
                v add Map exch get
            } for
            Map v get
        } for
    ]
} def

/NewStage {
    1 ExpandMap
    /Map exch def
    [
    0 1 MapSize3 1 sub {
        /v exch def
        /count 0 def
        0 1 7 {
            Vect exch get
            v add MapSize3 add MapSize3 mod /vx exch def
            /count count Map vx get add def
        } for
        0
        Map v get 0 eq {RuleBorn count get { pop 1 } if }
            {RuleKeep count get { pop 1 } if } ifelse
    } for
    ]
} def

/OrgMap OrgMap 0 ExpandMap def
0 1 Loop {
    OrgMap exch DispMap showpage
    /OrgMap OrgMap NewStage def
} for

Index

Feed

Other

Link

Pathtraq

loading...