Yaşam ve Yorgunluk Oyunu


10

Stewie'nin Yaşam ve Yorgunluk Oyunu, daha ünlü Conway'in Yaşam Oyununa oldukça benzer .


Stewie'nin Yaşam ve Yorgunluk Oyunu'nun (GoLF) evreni, her biri canlı, ölü veya yorgun üç olası durumdan birinde bulunan sonsuz iki boyutlu dikgen kare hücreler ızgarasıdır. Her hücre, yatay, dikey veya çapraz olarak bitişik olan sekiz komşusuyla etkileşime girer. Zamandaki her adımda aşağıdaki geçişler gerçekleşir:

  • İkiden az canlı komşusu olan herhangi bir canlı hücre, az nüfusun neden olduğu gibi ölür.
  • İki veya üç canlı komşusu olan herhangi bir canlı hücre bir sonraki nesle yaşar.
  • Üçten fazla canlı komşusu olan herhangi bir canlı hücre, aşırı nüfus gibi ölür.
  • Tam olarak üç canlı komşusu olan herhangi bir ölü hücre, üreme gibi canlı bir hücre haline gelir.
  • Birbirini takip eden iki nesil boyunca hayatta kalan herhangi bir hücre, sanki yorgunluktan ölür. Gelecek kuşaklara kadar yeniden hayata uyanamaz
  • Giriş ızgarasının sınırı dışında kalan herhangi bir hücre, sanki bir uçurumdan düşmüş gibi ölür.

Meydan okuma:

Zorluğunuz, bir GoLF'nin başlangıç ​​durumunu ve p tamsayısını temsil eden n-m boyutlarında bir ızgara almak ve p nesillerden sonra Oyun durumunu çıkarmaktır .

Kurallar:

  • Giriş ve çıkış biçimleri isteğe bağlıdır, ancak giriş / çıkış ızgaralarının aynı gösterimi olmalıdır
  • Canlı ve ölü hücreleri temsil etmek için herhangi bir yazdırılabilir sembol seçebilirsiniz ( 1canlı hücreler ve 0ölü hücreler için kullanacağım ).
  • 0 veya 1 dizine sahip olup olmadığınızı seçebilirsiniz. Örneklerde, p=1bir adımdan sonraki durum anlamına gelir.
  • Her dilde en kısa kod kazanır
  • Hücresel otomasyon için yerleşik işleve izin verilir

Test senaryoları:

Örneklerde, giriş ızgarasını yalnızca girişe dahil ettim, p'ye değil . Çeşitli p değerleri için çıktılar sağladım. Yalnızca belirli bir p girişiyle giden ızgarayı çıkartabilirsiniz .

Input:
0   0   0   0   0
0   0   1   0   0
0   0   1   0   0
0   0   1   0   0
0   0   0   0   0

--- Output ---
p = 1
0   0   0   0   0
0   0   0   0   0
0   1   1   1   0
0   0   0   0   0
0   0   0   0   0

p = 2
0   0   0   0   0
0   0   1   0   0
0   0   0   0   0
0   0   1   0   0
0   0   0   0   0

p = 3 -> All dead
---

Input:
0   1   0   0   0   0
0   0   1   0   0   0
1   1   1   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0

--- Output ---
p = 1
0   0   0   0   0   0
1   0   1   0   0   0
0   1   1   0   0   0
0   1   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0

p = 2
0   0   0   0   0   0
0   0   0   0   0   0
1   0   0   0   0   0
0   1   1   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0

p = 3
0   0   0   0   0   0
0   0   0   0   0   0
0   1   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0

p = 4 -> All dead
Input
0   1   1   0   1   1   0
1   1   0   1   1   1   1
0   1   0   0   0   1   0
0   0   0   1   1   0   1
1   0   0   1   0   1   1
0   0   1   1   0   1   1
1   1   0   0   0   0   1

--- Output ---
p = 1
1   1   1   0   0   0   1
1   0   0   1   0   0   1
1   1   0   0   0   0   0
0   0   1   1   0   0   1
0   0   0   0   0   0   0
1   0   1   1   0   0   0
0   1   1   0   0   1   1

p = 2
1   0   0   0   0   0   0
0   0   0   0   0   0   0
1   0   0   1   0   0   0
0   1   1   0   0   0   0
0   1   0   0   0   0   0
0   0   0   0   0   0   0
0   0   1   1   0   0   0   

p = 3
0   0   0   0   0   0   0
0   0   0   0   0   0   0
0   1   1   0   0   0   0
1   1   0   0   0   0   0
0   1   1   0   0   0   0
0   0   1   0   0   0   0
0   0   0   0   0   0   0

p = 4
0   0   0   0   0   0   0
0   0   0   0   0   0   0
1   1   1   0   0   0   0
1   0   0   0   0   0   0
1   0   1   0   0   0   0
0   1   1   0   0   0   0
0   0   0   0   0   0   0

p = 5
0   0   0   0   0   0   0
0   1   0   0   0   0   0
1   0   0   0   0   0   0
0   0   1   0   0   0   0
1   0   0   0   0   0   0
0   1   0   0   0   0   0
0   0   0   0   0   0   0

p = 6
0   0   0   0   0   0   0
0   0   0   0   0   0   0
0   1   0   0   0   0   0
0   1   0   0   0   0   0
0   1   0   0   0   0   0
0   0   0   0   0   0   0
0   0   0   0   0   0   0

p = 7
0   0   0   0   0   0   0
0   0   0   0   0   0   0
0   0   0   0   0   0   0
1   1   1   0   0   0   0
0   0   0   0   0   0   0
0   0   0   0   0   0   0
0   0   0   0   0   0   0

p = 8
0   0   0   0   0   0   0
0   0   0   0   0   0   0
0   1   0   0   0   0   0
0   0   0   0   0   0   0
0   1   0   0   0   0   0
0   0   0   0   0   0   0
0   0   0   0   0   0   0

p = 9 -> All dead

Evet, ilk tohumların tüm hücrelerin ölmesi ile bitmeyeceğinin farkındayım.


Belki de geçiş kalemi 5'in 1--4 maddeleriyle "aynı zamanda" uygulandığını, yani 1--4
Luis Mendo

2
" Her biri iki olası durumdan birinde, canlı veya ölü olan hücreler ", daha sonraki yorgunluk kuralının, her bir hücrenin üç durumuna (ölü, yeni iki nesildir canlı, canlı)
Peter Taylor

1
Herkes isterse bunun için bir Golly kuralım var.
CalculatorFeline

6
GoD oynuyor ha?
Adám

Yanıtlar:


3

MATL , 34 30 25 bayt

@CalculatorFeline tarafından yapılan bir öneri sayesinde 5 bayt kaldırıldı !

0ii:"wy*~wt3Y6QZ+5:7mb*]&

Çevrimiçi deneyin!

Girişler bir matris ve bir sayıdır. Matris, ;satır ayırıcı olarak kullanılır. Üç test vakasının matrisleri şu şekilde girilir:

[0 0 0 0 0; 0 0 1 0 0; 0 0 1 0 0; 0 0 1 0 0;0 0 0 0 0]
[0 1 0 0 0 0; 0 0 1 0 0 0; 1 1 1 0 0 0; 0 0 0 0 0 0; 0 0 0 0 0 0; 0 0 0 0 0 0; 0 0 0 0 0 0]
[0 1 1 0 1 1 0; 1 1 0 1 1 1 1; 0 1 0 0 0 1 0; 0 0 0 1 1 0 1; 1 0 0 1 0 1 1; 0 0 1 1 0 1 1; 1 1 0 0 0 0 1]

açıklama

0     % Push 0. This represents the generation previous to the input one. Actually
      % This should be an array of zeros, but thanks to broadcasting it is
      % equivalent (and saves bytes)
i     % Input: array with starting generation
i     % Input: number of iterations, p.
      % STACK (bottom to top): 0, array with initial generation, p
:"    % Do the following p times
      %   STACK: previous gen, current gen
  wy  %   Swap, duplicate from below
      %   STACK: current gen, previous gen, current gen
  *~  %   Multiply element-wise, negate. This creates a mask of cells that do not 
      %   die of fatigue (they were 0 in the current or in the previous generation)
      %   STACK: current gen, fatigue mask
  wt  %   Swap, duplicate
      %   STACK: Fatigue mask, current gen, current gen
  3Y6 %   Push predefined literal: 8-neighbourhood: [1 1 1; 1 0 1; 1 1 1]
      %   STACK: Fatigue mask, current gen, current gen, 8-neighbourhood
  Q   %   Add 1 element-wise. This gives [2 2 2; 2 1 2; 2 2 2], which will be
      %   used as convolution kernel. Active cells with 2 neighbours will give 5;
      %   inactive cells with 3 neighbours will give 6; and active cells with 3
      %   neighbours will give 7
      %   STACK: Fatigue mask, current gen, current gen, convolution kernel
  Z+  %   2D convolution, keeping size
      %   STACK: Fatigue mask, current gen, convolution result
  5:7 %   Push array [5 6 7]
  m   %   Ismember, element-wise. Cells that give true will survive, unless fatigued
      %   STACK: Fatigue mask, current gen, cells that can survive
  b   %   Bubble up
      %   STACK: Current gen, cells that can survive, fatigue mask
  *   %   Multiply element-wise. This tells which cells survive considering fatigue.
      %   The result is the new generation
      %   STACK: "Current" gen which now becomes old, "new" gen which now becomes
      %   current
]     % End 
&     % Specify that implicit display will show only top of the stack

1
3Y6Daha ayrıntılı açıklayabilir misiniz ? Ayrıca, çekirdeğin orta elemanı olsaydı, .5CGOL'u sadece kontrol edebilirsiniz 2<value<4. Yardımcı olabilir.
CalculatorFeline

@CalculatorFeline Bu çok iyi bir öneri, teşekkürler! Maskeyi iki kez kullanarak ve sonra test ederek 5 bayt tasarrufu sağladı 5<=value<=7. Gelince 3Y6, bu sadece önceden tanımlanmış bir değişmezdir. Ayrıca 1Y6, 4 mahalle olan
Luis Mendo

1
Huh. Aslında işe yaradı. Temiz.
CalculatorFeline

3

APL (Dyalog Klasik 16.0) , 59 bayt

⌊{((3∊⌊{⍵,⍵-c}+/,⍵)∧.1>1|c)×(.1×c)+1c2 2⌷⍵}⎕U233A 3 3⍣⎕⊢⎕

Çevrimiçi deneyin! (Klasik 15.0'da taklit edilmiştir)


APL (Dyalog Unicode 16.0) , 85 bayt

⌊{((3∊⌊{⍵,⍵-c}+/,⍵)∧.1>1|c)×(.1×c)+1c2 2⌷⍵}⌺3 3⍣⎕⊢⎕

Çevrimiçi deneyin! (Unicode 15.0'da taklit edilmiştir)


Önce ızgarayı sonra s . Sonra yeni bir ızgarayı yazdırır s kuşak.

Bunun , Klasik karakter kümesinde bulunmayan yeni (Şablon) ilkelini, dolayısıyla daha kısa bir sürümü ve daha az baytlık bir sürümünü kullandığını unutmayın.

Takip edilecek açıklama…


APL'nin görüntü formatı güzel :-)
Luis Mendo

@LuisMendo Aslında, "APL" değil, yorumlayıcı çıktı almak istediğinde bu APL işlevine geri arama yapar . Fonksiyon daha sonra çıktısını almak istediğimizi analiz eder ve buna göre değiştirir. displayFonksiyonun açıklaması burada .
Adám

3

Golly KuralıYükleyici, 295 bayt

@RULE Y
@TABLE
n_states:3
neighborhood:Moore
symmetries:permute
var z={1,2}
var y=z
var x=z
var w=z
var u=z
var a={0,z}
var b=a
var c=a
var d=a 
var e=a
var f=a
var g=a 
var h=a
0,z,y,x,0,0,0,0,0,1
z,a,0,0,0,0,0,0,0,0
z,y,x,w,u,a,b,c,d,0
2,a,b,c,d,e,f,g,h,0
1,a,b,c,d,e,f,g,h,2
@COLORS
2 255 0 0

Girdi ızgara yapıştırılan edilmelidir, sınırları (örneğin kuralismi içindedir 5* 3ise Y:P5,3,) önceden basın alanı.


2

Java 8, 333 bayt

int[][]G(int p,int[][]s){for(int h=s.length,w=s[0].length,y,x,n,a,b,t[][]=new int[h][w],i=0;i++<2*p;)for(y=0;y<h;++y)for(x=0;x<w;++x)if(i%2>0){for(n=0,a=y-2;++a<y+2;)for(b=x-2;++b<x+2;)n+=a>=0&a<h&b>=0&b<w&(a!=y|b!=x)&&s[a][b]>0?1:0;t[y][x]=s[y][x]<1?n==3?1:0:n<2|n>3|s[y][x]>1?0:2;}else s[y][x]=i==2*p&t[y][x]>1?1:t[y][x];return s;}

Açıklama:

int[][]G(int p,int[][]s){
    for(int h=s.length,w=s[0].length,y,x,n,a,b,t[][]=new int[h][w],       //height, width, vars, temp array
            i=0;i++<2*p;)                                                 //for 2*generations: 1. calculate in temporary t, 2. copying to s
        for(y=0;y<h;++y)                                                  //for each row
            for(x=0;x<w;++x)                                              //for each column
                if(i%2>0){                                                //1. calculate
                    for(n=0,a=y-2;++a<y+2;)                               //n = number of alive cells around [y][x]. row above, at and below y
                        for(b=y-2;++b<y+2;)                               //column left, at and right of x
                            n+=a>=0&a<h&b>=0&b<w&(a!=y|b!=x)&&s[a][b]>0?1:0;    //if within bounds and not the cell itself, add 1 if alive.
                    t[y][x]=s[y][x]<1?n==3?1:0:n<2|n>3|s[y][x]>1?0:2;     //save next state in temporary, depending on rules. alive cells become 2.
                }
                else                                                      //2. copy temporary t to s
                    s[y][x]=i==2*p&t[y][x]>1?1:t[y][x];                   //if last generation, replace 2 by 1
    return s;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.