เกมแห่งชีวิตและความเหนื่อยล้า


10

เกมสตีวีของชีวิตและความเมื่อยล้าค่อนข้างคล้ายกับที่มีชื่อเสียงมากขึ้นเกมคอนเวย์ของชีวิต


จักรวาลของเกมแห่งชีวิตและความเหนื่อยล้าของ Stewie (GoLF) เป็นกริด orthogonal สองมิติที่ไม่มีที่สิ้นสุดของสแควร์เซลล์ซึ่งแต่ละแห่งอยู่ในหนึ่งในสามสถานะที่เป็นไปได้มีชีวิตอยู่ตายหรือเหนื่อย ทุกเซลล์มีปฏิสัมพันธ์กับแปดเพื่อนบ้านซึ่งเป็นเซลล์ที่อยู่ในแนวนอนแนวตั้งหรือแนวทแยงมุม ในแต่ละขั้นตอนการเปลี่ยนภาพต่อไปนี้จะเกิดขึ้น:

  • เซลล์ที่มีชีวิตใด ๆ ที่มีเพื่อนบ้านที่มีชีวิตน้อยกว่าสองคนตายราวกับว่าเกิดจากการมีประชากรน้อย
  • เซลล์ที่มีชีวิตใด ๆ ที่มีสองหรือสามเพื่อนบ้านอาศัยอยู่ไปยังรุ่นต่อไป
  • เซลล์ที่มีชีวิตใด ๆ ที่มีเพื่อนบ้านที่มีชีวิตมากกว่าสามคนจะตายไปราวกับว่ามีจำนวนประชากรมากเกินไป
  • เซลล์ที่ตายแล้วใด ๆ ที่มีเพื่อนบ้านที่มีชีวิตสามคนจะกลายเป็นเซลล์มีชีวิตราวกับว่าได้รับการสืบพันธุ์
  • เซลล์ใด ๆ ที่มีชีวิตอยู่สำหรับสองชั่วอายุคนติดต่อกันจะตายราวกับว่าล้า มันไม่สามารถปลุกชีวิตอีกครั้งจนกว่าคนรุ่นต่อไป
  • เซลล์ใด ๆ ที่อยู่นอกขอบเขตของกริดอินพุตจะตายเช่นเดียวกับที่ตกลงมาจากหน้าผา

ท้าทาย:

ความท้าทายของคุณคือการใช้กริดของขนาดn-by-m ซึ่งแสดงสถานะเริ่มต้นของ GoLF และจำนวนเต็มpและแสดงสถานะของเกมหลังรุ่นp

กฎ:

  • รูปแบบอินพุตและเอาต์พุตเป็นทางเลือก แต่กริดอินพุต / เอาต์พุตควรมีการแทนค่าเดียวกัน
  • คุณสามารถเลือกสัญลักษณ์ที่พิมพ์ได้เพื่อแสดงเซลล์ที่มีชีวิตและเซลล์ที่ตายแล้ว (ฉันจะใช้1สำหรับเซลล์ที่มีชีวิตและ0เซลล์ที่ตายแล้ว)
  • คุณสามารถเลือกได้ถ้าคุณมีดัชนี 0 หรือ 1 ในตัวอย่างp=1หมายถึงสถานะหลังจากหนึ่งขั้นตอน
  • รหัสสั้นที่สุดในแต่ละภาษาชนะ
  • อนุญาตให้ใช้ฟังก์ชันในตัวสำหรับระบบเซลลูลาร์อัตโนมัติ

กรณีทดสอบ:

ในตัวอย่างที่เราได้รวมเพียงตารางการป้อนข้อมูลในการป้อนข้อมูลที่ไม่พี ผมได้ให้ผลต่างๆP -values คุณจะต้องส่งออกเพียงตารางที่จะไปด้วยการป้อนข้อมูลที่ได้รับหน้า

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

ใช่ฉันรู้ว่าเมล็ดเริ่มต้นทั้งหมดจะไม่สิ้นสุดในทุกเซลล์ที่ตายไปแล้ว


คุณควรชี้แจงว่ารายการเปลี่ยนแปลง 5 ถูกนำไปใช้ "ในเวลาเดียวกัน" เป็นรายการ 1--4 นั่นคือขึ้นอยู่กับสถานะก่อนที่จะใช้งาน 1--4
Luis Mendo

2
" เซลล์ซึ่งแต่ละแห่งอยู่ในสถานะหนึ่งในสองสถานะที่เป็นไปได้มีชีวิตอยู่หรือตายไปแล้ว " ดูเหมือนจะเป็นคำจำกัดความที่บิดเบือนโดยเจตนาเนื่องจากกฎความเหนื่อยล้าในภายหลังนั้นสามารถแสดงในหุ่นยนต์ จำกัด แน่นอนโดยทำให้แต่ละเซลล์มีสามสถานะ มีชีวิตอยู่มีชีวิตอยู่สองชั่วอายุคนติดต่อกัน)
Peter Taylor

1
ฉันมีกฎ Golly สำหรับเรื่องนี้ถ้าใครต้องการมัน
CalculatorFeline

6
เล่น GoD ใช่มั้ย
Adám

คำตอบ:


3

MATL , 34 30 25 ไบต์

ลบ 5 ไบต์ด้วยคำแนะนำโดย@CalculatorFeline !

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

ลองออนไลน์!

อินพุตเป็นเมทริกซ์และตัวเลข เมทริกซ์ใช้;เป็นตัวคั่นแถว เมทริกซ์สำหรับสามกรณีทดสอบจะถูกป้อนเป็น

[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]

คำอธิบาย

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
คุณสามารถอธิบาย3Y6รายละเอียดเพิ่มเติมได้หรือไม่ นอกจากนี้ถ้าองค์ประกอบกลางของเคอร์เนลเป็น.5คุณสามารถตรวจสอบ CGOL 2<value<4มีเพียง อาจช่วยได้
CalculatorFeline

@CalculatorFeline เป็นคำแนะนำที่ดีมากขอบคุณ! มันนำไปสู่การประหยัดไบต์ 5 5<=value<=7โดยใช้สองครั้งหน้ากากและแล้วการทดสอบว่า สำหรับ3Y6มันเป็นเพียงตัวอักษรที่กำหนดไว้ล่วงหน้า นอกจากนี้ยังมี1Y6ซึ่งเป็นย่าน 4 แห่ง
หลุยส์เมนโด

1
ฮะ. มันใช้งานได้จริง เรียบร้อย
CalculatorFeline

3

APL (Dyalog Classic 16.0) , 59 ไบต์

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

ลองออนไลน์! (จำลองใน Classic 15.0)


APL (Dyalog Unicode 16.0) , 85 ไบต์

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

ลองออนไลน์! (จำลองใน Unicode 15.0)


แจ้งให้สำหรับตารางแล้วสำหรับพี พิมพ์กริดใหม่หลังจากรุ่นp

โปรดทราบว่าสิ่งนี้ใช้ดั้งเดิม (ฉลุ) ดั้งเดิมซึ่งไม่รวมอยู่ในชุดอักขระคลาสสิกดังนั้นรุ่นที่สั้นกว่าและรุ่นไบต์น้อย

คำอธิบายที่จะติดตาม ...


รูปแบบการแสดงผลของ APL ดี :-)
Luis Mendo

@LuisMendo จริง ๆ แล้วมันไม่ใช่ "APL's" แต่ล่ามจะทำการเรียกกลับไปที่ฟังก์ชัน APL นี้เมื่อต้องการส่งออก จากนั้นฟังก์ชั่นวิเคราะห์สิ่งที่เราต้องการที่จะส่งออกและแก้ไขมันตาม คำอธิบายสำหรับdisplayฟังก์ชั่นที่นี่
อดัม

3

Golly RuleLoader, 295 ไบต์

@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

ควรวางกริดอินพุตไว้ขอบเขตอยู่ใน rulename (เช่น5* 3คือY:P5,3) พื้นที่กดเพื่อเลื่อนไปข้างหน้า


2

Java 8, 333 ไบต์

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

คำอธิบาย:

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.