เกมที่สั้นที่สุดของชีวิต


59

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

  • เซลล์ที่มีชีวิตยังคงมีชีวิตอยู่ถ้ามันมีเพื่อนบ้านอยู่สองหรือสามคน
  • เซลล์ที่ตายแล้วจะมีชีวิตถ้ามันมีเพื่อนบ้านอยู่สามคน

ภารกิจของคุณหากคุณเลือกที่จะยอมรับมันคือการกำหนดรหัสเกมที่สั้นที่สุดในการใช้ภาษาที่คุณชื่นชอบ

กฎระเบียบ:

  • ตารางต้องมีอย่างน้อย 20x20
  • ตารางจะต้องพันรอบ (ดังนั้นกริดจึงเหมือนกับผิวของทอรัส)
  • การใช้งานของคุณต้องอนุญาตให้ผู้ใช้ป้อนรูปแบบเริ่มต้นของตนเอง
  • GoL นั้นไม่มีจุดหมายหากคุณไม่เห็นสิ่งที่เกิดขึ้นดังนั้นจะต้องมีการแสดงผลภาพของการทำงานของออโตเมติกโดยผลการเลี้ยวของแต่ละรอบจะแสดงให้เห็นนานพอที่จะมองเห็น!

8
ก่อนหน้านี้เกี่ยวกับ Stack Overflow: Code Golf: เกมแห่งชีวิตของ Conwayและอย่าลืมดูที่ลิงค์การใช้งาน APL ในความคิดเห็น
dmckee

1
อาฉันไม่เห็นว่า แต่นี่ไม่แตกต่างกันเล็กน้อย (ช่วยฉันลบงานที่ท้าทายด้วยกันไหม?
กริฟฟิน

6
มันไม่ใช่ปัญหา ปริศนาจำนวนมากที่ทำงานใน Stack Overflow ก็ทำที่นี่เช่นกัน แต่ผู้คนจะบอกคุณว่าฉันกำลังหมกมุ่นกับการเชื่อมโยงกับความท้าทายที่คล้ายกัน
dmckee

@Griffin: คุณสามารถลบทั้งหมดที่;ก่อน}s นอกจากนี้ยังvarสามารถกำจัดได้ในบางครั้ง (หากรหัสของคุณไม่ทำลาย) และสำหรับหนึ่งบรรทัดfors, ifs ฯลฯ คุณสามารถกำจัดสิ่งต่าง ๆ ได้{ }อย่างสมบูรณ์: for(...) for(...) dosomething().
pimvdb

@pvdvdb, ไชโยฉันยังไม่ได้เล่นกอล์ฟอย่างเต็มที่เลยยังไม่มีเวลา แค่อยากจะแสดงให้เห็นว่าฉันต้องไปด้วยเหมือนกันแทนที่จะเป็นเรื่องท้าทาย จะตีกอล์ฟให้มากที่สุดในไม่ช้า
กริฟ

คำตอบ:


27

HTML5 Canvas พร้อม JavaScript, 940 639 586 519 ตัวอักษร

<html><body onload="k=40;g=10;b=[];setInterval(function(){c=[];for(y=k*k;y--;){n=0;for(f=9;f--;)n+=b[(~~(y/k)+k+f%3-1)%k*k+(y+k+~~(f/3)-1)%k];c[y]=n==3||n-b[y]==3;r.fillStyle=b[y]?'red':'tan';r.fillRect(y%k*g,~~(y/k)*g,g-1,g-1)}if(v.nextSibling.checked)b=c},1);v=document.body.firstChild;v.width=v.height=g*k;v.addEventListener('click',function(e){b[~~((e.pageY-v.offsetTop)/g)*k+~~((e.pageX-v.offsetLeft)/g)]^=1},0);r=v.getContext('2d');for(y=k*k;y--;)b[y]=0"><canvas></canvas><input type="checkbox"/>Run</body></html>

ฉันอยากทำบางสิ่งบางอย่างด้วย Canvas ดังนั้นนี่คือความพยายามของฉัน (เวอร์ชั่นดั้งเดิมออนไลน์ ) คุณสามารถสลับเซลล์ได้โดยคลิก (อาจทำได้ในโหมดเรียกใช้)

ขณะนี้คุณสามารถลองรุ่นใหม่ที่นี่

น่าเสียดายที่มีปัญหาที่ฉันยังไม่สามารถแก้ไขได้ เวอร์ชันออนไลน์มีความยาว 11 อักขระเนื่องจาก jsFiddle วางโหนดข้อความไว้ด้านหน้าผืนผ้าใบ (ทำไม?) และทำให้ผืนผ้าใบนั้นไม่ใช่ลูกคนแรกอีกต่อไป

แก้ไข 1:การเพิ่มประสิทธิภาพและการปรับโครงสร้างจำนวนมาก

แก้ไข 2:การเปลี่ยนแปลงเล็ก ๆ น้อย ๆ

แก้ไข 3:บล็อกสคริปต์ที่สมบูรณ์พร้อมการเปลี่ยนแปลงเล็กน้อย


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

คุณสามารถแทนที่ด้วยnew Array('#FFF','#800') ['#FFF','#800']
Lowjacker

แม้ว่าจะพูดว่าเกี่ยวกับการวาดภาพนักกอล์ฟระดับสูงของฉันก็ไม่อนุญาตให้วาดและน่าเกลียดเหมือนบาป ฮ่าฮ่า คุณสามารถตั้งค่าสองสีของคุณในsอาเรย์เป็นtanและredเนื่องจากเป็นสองสีที่มีการนำเสนอสั้นที่สุด - ช่วยให้คุณประหยัดสองตัวอักษร นอกจากนี้หากเป็นไปได้ให้วางเวอร์ชันตัวอักษรjลงในช่วงเวลา ฉันแน่ใจว่ามีอีกมากมายที่จะบีบออกเช่นกัน
กริฟ

@Griffin และ Lowjacker: ขอบคุณมาก ฉันค่อนข้างมั่นใจว่าคุณสามารถเล่นกอล์ฟได้มากกว่านี้ (และมีความคิดอยู่แล้ว) น่าเสียดายที่ฉันไม่ได้หาเวลาทำ รุ่นแข็งแรงเล่นกอล์ฟที่ดีขึ้นจะเป็นไปตามวันพรุ่งนี้ - ฉันหวังว่า ...
ฮาวเวิร์ด

2
คุณสามารถลบ html และแท็กเนื้อหา มันจะทำงานเหมือนเดิม
arodebaugh

32

Python 219 ตัวอักษร

ฉันไปเพื่อ golfage สูงสุดด้วยอินเทอร์เฟซเพียงพอที่จะตอบคำถาม

import time
P=input()
N=range(20)
while 1:
 for i in N:print''.join(' *'[i*20+j in P]for j in N)
 time.sleep(.1);Q=[(p+d)%400 for d in(-21,-20,-19,-1,1,19,20,21)for p in P];P=set(p for p in Q if 2-(p in P)<Q.count(p)<4)

คุณเรียกใช้เช่นนี้:

echo "[8,29,47,48,49]" | ./life.py

ตัวเลขในรายการแสดงถึงพิกัดของเซลล์เริ่มต้น แถวแรกคือ 0-19 แถวที่สองคือ 20-39 เป็นต้น

เรียกใช้ในเทอร์มินัลที่มีแถว 21 แถวและดูน่ารำคาญมาก


1
ทั้งหมดนี้ควรได้รับรางวัล ฉันเดาว่า 'ความง่ายในการป้อนข้อมูล' นั้นมีน้ำหนักค่อนข้างสูง
โม่

@primo ฉันยังไปได้ไกลถึงการแนะนำ mma ควรมีการแข่งขันแยกต่างหาก
luser droog

2
ถ้าเช่นนั้น Life of Py แล้วงั้นเหรอ?
Christopher Wirt

คุณสามารถบันทึกหนึ่งถ่านเพิ่มเติม ... ==2-(p in P) 2-({p}<P)แต่คุณจะต้องเปลี่ยนอินพุตของคุณเป็น{8,29,47,48,49}:)
JBernardo

21

TI-BASIC, 96 ไบต์ (87 สำหรับรายการที่ไม่แข่งขัน)

สำหรับเครื่องคิดเลขกราฟ TI-84 ซีรี่ส์ของคุณ (!) นี่คือค่อนข้างท้าทายเพราะไม่มีวิธีที่ง่ายต่อการเขียนประจำกราฟิกบัฟเฟอร์ (แน่นอนไม่มีอะไรในตัว) และหน้าจอกราฟมีคำสั่งเพียงสี่กราฟิกที่เกี่ยวข้อง: Pxl-On(), Pxl-Off(), และPxl-Change()pxl-Test()

ใช้ทุกพิกเซลที่สามารถเข้าถึงได้บนหน้าจอและห่ออย่างถูกต้อง แต่ละเซลล์มีหนึ่งพิกเซลและโปรแกรมจะอัปเดตทีละบรรทัดในแนวนอนไปทางขวาผ่านหน้าจอ เนื่องจากเครื่องคิดเลขมีเพียงโปรเซสเซอร์ 15MHz z80 และ BASIC เป็นภาษาที่ตีความช้ารหัสจะได้รับเพียงหนึ่งเฟรมทุก ๆ ห้านาที

การป้อนข้อมูลของผู้ใช้เป็นเรื่องง่าย: ก่อนใช้งานโปรแกรมให้ใช้เครื่องมือปากกาเพื่อวาดรูปร่างของคุณบนหน้าจอกราฟ

ที่ดัดแปลงมาจากรายการของฉันไปประกวดรหัสกอล์ฟที่ฟอรั่มเครื่องคิดเลข Omnimaga

0
While 1
For(X,0,94
Ans/7+49seq(pxl-Test(remainder(Y,63),remainder(X+1,95)),Y,62,123
For(Y,0,62
If 1=pxl-Test(Y,X)+int(3fPart(3cosh(fPart(6ֿ¹iPart(sum(Ans,Y+1,Y+3
Pxl-Change(Y,X
End
End
End

รุ่น Omnimaga (87 ไบต์)

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

0
While 1
For(X,0,93
Ans/7+49seq(pxl-Test(Y,X+1),Y,0,62
For(Y,1,61
If 2rand>isClockOn=pxl-Test(Y,X)+int(3fPart(3cosh(fPart(6ֿ¹iPart(sum(Ans,Y,Y+2
Pxl-Change(Y,X
End
End
ClockOff
End

รุ่นนี้น่าจะเป็นรหัส golfed ที่สุดที่ฉันเคยเขียนและมีการเพิ่มประสิทธิภาพ obfuscatory น่ารังเกียจอย่างแท้จริง:

  • ฉันใช้สถานะนาฬิกาเป็นธง เมื่อเริ่มต้นโปรแกรมนาฬิกาวันที่ / เวลาถูกเปิดใช้งานและฉันใช้ค่าของการตั้งค่าสถานะ isClockOn ทั่วโลกเพื่อตรวจสอบว่ามันคือการทำซ้ำครั้งแรก หลังจากวาดเฟรมแรกฉันจะปิดนาฬิกา บันทึกหนึ่งไบต์บนวิธีอื่นที่สั้นที่สุดและประมาณสี่วิธีที่ชัดเจน

  • ฉันจัดเก็บสถานะของสามคอลัมน์ถัดจากสถานะที่ถูกอัปเดตในอาร์เรย์ 63 องค์ประกอบของตัวเลขฐาน 7 สถานที่ 49 เก็บคอลัมน์ทางด้านขวาสถานที่ 7 เก็บคอลัมน์กลางและสถานที่หน่วยเก็บคอลัมน์ซ้าย - 1 สำหรับเซลล์สดและ 0 สำหรับเซลล์ตาย จากนั้นฉันก็ใช้โมเดอเรเตอร์ที่เหลือ 6 จากผลรวมของตัวเลขสามตัวรอบเซลล์ที่ถูกแก้ไขเพื่อค้นหาจำนวนเซลล์ไลฟ์เพื่อนบ้านทั้งหมด (มันเหมือนกับการหารด้วย 9 ลูกเล่น - ในฐาน 7, ส่วนที่เหลือ mod 6 เท่ากับผลรวมของ ตัวเลข) บันทึกประมาณ 10 ไบต์ด้วยตัวเองและให้โอกาสในการใช้การเพิ่มประสิทธิภาพสองครั้งถัดไป แผนภาพตัวอย่าง (สมมติว่ามีเครื่องร่อนอยู่ตรงกลางที่คอลัมน์หนึ่งที่ Y = 45:

    Row # | Cell State       | Stored number | Mod 6 = cell count
    ...
    44      Live, Live, Live   49+7+1 = 57     3
    45      Dead, Dead, Live   49+0+0 = 49     1
    46      Dead, Live, Dead   0+7+0  = 7      1
    ...
    

    เซลล์ตรงกลางจะยังคงอยู่เพราะมันถูกล้อมรอบด้วยห้าเซลล์ที่มีชีวิต

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

  • ตัวอย่างint(3fPart(3cosh(ให้1เมื่ออินพุทเท่ากับ 3/6 2เมื่อมันเท่ากับ 4/6 และ0เมื่อมันเท่ากับ 0, 1/6, 2/6 หรือ 5/6 บันทึกประมาณ 6 ไบต์


19

Mathematica - 333

คุณสมบัติ:

  • อินเทอร์เฟซแบบโต้ตอบ: คลิกเซลล์เพื่อสร้างรูปแบบของคุณ

  • ตารางที่ดี

  • ปุ่ม: RUN, PAUSE, CLEAR

รหัสด้านล่าง

Manipulate[x=Switch[run,1,x,2,CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},
{1,1}},x],3,Table[0,{k,40},{j,40}]];EventHandler[Dynamic[tds=Reverse[Transpose[x]];
ArrayPlot[tds,Mesh->True]],{"MouseClicked":>(pos=Ceiling[MousePosition["Graphics"]];
x=ReplacePart[x,pos->1-x[[Sequence@@pos]]];)}],{{run,3,""},{1->"||",2->">",3->"X"}}]

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการทราบวิธีการทำงานนี้ตัวอย่างที่ 2 ในบล็อกนี้เป็นเพียงรุ่นที่ซับซ้อนมากขึ้น (การวิเคราะห์ฟูริเยร์สดอินเทอร์เฟซที่ดีกว่า) ของโค้ดด้านบน ตัวอย่างควรรันในเบราว์เซอร์ของคุณหลังจากดาวน์โหลดปลั๊กอินฟรี


2
+1 เป็นคนดีสำหรับการเดินทาง ใช่ว่าเป็นปัญหากับเว็บไซต์นี้มีคำถามเก่า ๆ ที่น่าจะพลาด
กริฟ

ขอบคุณสำหรับ @Griffin สังเกตเห็นมันเลย;)
Vitaliy Kaurov

15

C 1,063 ตัวอักษร

เป็นเรื่องที่ท้าทายฉันทำสิ่งนี้ใน C โดยใช้ Windows API กอล์ฟที่ไม่เป็นมิตรในแบบเรียลไทม์ IO หากเปิดใช้งาน capslock การจำลองจะทำงาน มันจะยังคงอยู่หากปิดล็อค วาดรูปแบบด้วยเมาส์ คลิกซ้ายฟื้นเซลล์และคลิกขวาฆ่าเซลล์

#include <windows.h>
#include<process.h>
#define K ][(x+80)%20+(y+80)%20*20]
#define H R.Event.MouseEvent.dwMousePosition
#define J R.Event.MouseEvent.dwButtonState
HANDLE Q,W;char*E[3],O;Y(x,y){return E[0 K;}U(x,y,l,v){E[l K=v;}I(){E[2]=E[1];E[1]=*E;*E=E[2];memset(E[1],0,400);}A(i,j,k,l,P){while(1){Sleep(16);for(i=0;i<20;++i)for(j=0;j<20;++j){COORD a={i,j};SetConsoleCursorPosition(Q,a);putchar(E[0][i+j*20]==1?'0':' ');}if(O){for(i=0;i<20;++i)for(j=0;j<20;++j){for(k=i-1,P=0;k<i+2;++k)for(l=j-1;l<j+2;++l){P+=Y(k,l);}U(i,j,1,P==3?1:Y(i,j)==1&&P==4?1:0);}I();}}}main(T,x,y,F,D){for(x=0;x<21;++x)puts("#####################");E[0]=malloc(800);E[1]=E[0]+400;I();I();W=GetStdHandle(-10);Q=GetStdHandle(-11);SetConsoleMode(W,24);INPUT_RECORD R;F=D=O=0;COORD size={80,25};SetConsoleScreenBufferSize(Q,size);_beginthread(A,99,0);while(1){ReadConsoleInput(W,&R,1,&T);switch(R.EventType){case 1:O=R.Event.KeyEvent.dwControlKeyState&128;break;case 2:switch(R.Event.MouseEvent.dwEventFlags){case 1:x=H.X;y=H.Y;case 0:F=J&1;D=J&2;}if(F)U(x,y,0,1);if(D)U(x,y,0,0);}}}

สามารถรวบรวม EXE ที่รวบรวมได้ที่นี่

แก้ไข: ฉันได้แสดงความคิดเห็นถึงแหล่งที่มา มันมีอยู่ที่นี่


ฉันชอบที่จะเห็นรุ่นนี้แสดงความคิดเห็น!
luser droog

1
แน่นอนถ้าฉันจำสิ่งที่ฉันคิดได้ ... = p
Kaslai

1
@luserdroog นี่คือpastebin.com/BrX6wgUj
Kaslai

มันยอดเยี่ยมมาก
rayryeng - Reinstate Monica

12

J (39 ตัวอักษร)

l=:[:+/(3 4=/[:+/(,/,"0/~i:1)|.])*.1,:]

อิงตามเวอร์ชัน APL นี้ (อัลกอริทึมเดียวกันการบิดแบบวงแหวน)

ตัวอย่างการใช้งาน:

   r =: (i.3 3) e. 1 2 3 5 8
   r
0 1 1          NB. A glider!
1 0 1
0 0 1

   R =: _1 _2 |. 5 7 {. r
   R
0 0 0 0 0 0 0  NB. Test board
0 0 0 1 1 0 0
0 0 1 0 1 0 0
0 0 0 0 1 0 0
0 0 0 0 0 0 0

   l R
0 0 0 0 0 0 0  NB. Single step
0 0 0 1 1 0 0
0 0 0 0 1 1 0
0 0 0 1 0 0 0
0 0 0 0 0 0 0

10

Mathematica, 123 ตัวอักษร

การใช้งานพื้นฐานที่ไม่ได้ใช้ฟังก์ชัน CellularAutomaton ในตัวของ Mathematica

ListAnimate@NestList[ImageFilter[If[3<=Total@Flatten@#<=3+#[[2]][[2]],1,0]&,#,1]&,Image[Round/@RandomReal[1,{200,200}]],99]

8

Ruby 1.9 + SDL (380 325 314)

แก้ไข : 314 ตัวอักษรและแก้ไขข้อผิดพลาดที่มีเซลล์พิเศษปรากฏขึ้นในการทำซ้ำครั้งแรก เพิ่มขนาดกริดเป็น 56 เนื่องจากรูทีนสีจะดูเพียง 8 บิตที่ต่ำที่สุดเท่านั้น

แก้ไข : Golfed ลงไปที่ 325 ตัวอักษร ความกว้าง / ความสูงของกริดคือ 28 ตั้งแต่ 28 * 9 เป็นขนาดที่ใหญ่ที่สุดที่คุณสามารถมีได้ในขณะที่ยังคงใช้ค่าเป็นสีพื้นหลัง นอกจากนี้ยังประมวลผลเหตุการณ์ SDL เพียงเหตุการณ์เดียวต่อการวนซ้ำในตอนนี้ซึ่งตัดการวนรอบด้านในโดยสมบูรณ์ ฉันคิดว่าแน่นดี!

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

การห่อเป็นสิ่งเล็กน้อย

require'sdl'
SDL.init W=56
R=0..T=W*W
b=[]
s=SDL::Screen.open S=W*9,S,0,0
loop{r="#{e=SDL::Event.poll}"
r['yU']?$_^=1:r[?Q]?exit: r['nU']?b[e.y/9*W+e.x/9]^=1:0
b=R.map{|i|v=[~W,-W,-55,-1,1,55,W,57].select{|f|b[(i+f)%T]}.size;v==3||v==2&&b[i]}if$_
R.map{|i|s.fillRect i%W*9,i/W*9,9,9,[b[i]?0:S]*3}
s.flip
sleep 0.1}

ดูเหมือนว่านี้:

ภาพหน้าจอของแอปที่กำลังทำงาน

สนุกท้าทาย! ฉันยินดีต้อนรับการปรับปรุงใด ๆ ที่ทุกคนสามารถมองเห็นได้


เป็นเรื่องที่ดี แต่ฉันสามารถเห็นได้ทันทีว่าคุณทำผิดไป คุณไม่สามารถมีรูปแบบเช่นนั้นใน GoL อ่านกฎอีกครั้ง: en.wikipedia.org/wiki/Conway%27s_Game_of_Life#Rules
Griffin

@Griffin ฉันคิดว่าภาพหน้าจอถูกถ่ายหลังจากหยุดชั่วคราวและสลับเซลล์ด้วยตนเอง - ฉันจะตรวจสอบกฎอีกครั้ง ขอบคุณ!
Paul Prestidge

7
@Griffin ไม่สามารถกำหนดรูปแบบของเมล็ดพันธุ์ให้เป็นไปได้หรือไม่?
เริ่ม

7

สกาลา, 1181 1158 1128 1063 1018 1003 999 992 987 ตัวละคร

import swing._
import event._
object L extends SimpleSwingApplication{import java.awt.event._
import javax.swing._
var(w,h,c,d,r)=(20,20,20,0,false)
var x=Array.fill(w,h)(0)
def n(y:Int,z:Int)=for(b<-z-1 to z+1;a<-y-1 to y+1 if(!(a==y&&b==z)))d+=x((a+w)%w)((b+h)%h)
def top=new MainFrame with ActionListener{preferredSize=new Dimension(500,500)
menuBar=new MenuBar{contents+=new Menu("C"){contents+={new MenuItem("Go/Stop"){listenTo(this)
reactions+={case ButtonClicked(c)=>r= !r}}}}}
contents=new Component{listenTo(mouse.clicks)
reactions+={case e:MouseClicked=>var p=e.point
x(p.x/c)(p.y/c)^=1
repaint}
override def paint(g:Graphics2D){for(j<-0 to h-1;i<-0 to w-1){var r=new Rectangle(i*c,j*c,c,c)
x(i)(j)match{case 0=>g draw r
case 1=>g fill r}}}}
def actionPerformed(e:ActionEvent){if(r){var t=x.map(_.clone)
for(j<-0 to h-1;i<-0 to w-1){d=0
n(i,j)
x(i)(j)match{case 0=>if(d==3)t(i)(j)=1
case 1=>if(d<2||d>3)t(i)(j)=0}}
x=t.map(_.clone)
repaint}}
val t=new Timer(200,this)
t.start}}

Ungolfed:

import swing._
import event._

object Life extends SimpleSwingApplication
{
    import java.awt.event._
    import javax.swing._
    var(w,h,c,d,run)=(20,20,20,0,false)
    var x=Array.fill(w,h)(0)
    def n(y:Int,z:Int)=for(b<-z-1 to z+1;a<-y-1 to y+1 if(!(a==y&&b==z)))d+=x((a+w)%w)((b+h)%h)
    def top=new MainFrame with ActionListener
    {
        title="Life"
        preferredSize=new Dimension(500,500)
        menuBar=new MenuBar
        {
            contents+=new Menu("Control")
            {
                contents+={new MenuItem("Start/Stop")
                {
                    listenTo(this)
                    reactions+=
                    {
                        case ButtonClicked(c)=>run= !run
                    }
                }}
            }
        }
        contents=new Component
        {
            listenTo(mouse.clicks)
            reactions+=
            {
                case e:MouseClicked=>
                    var p=e.point
                    if(p.x<w*c)
                    {
                        x(p.x/c)(p.y/c)^=1
                        repaint
                    }
            }
            override def paint(g:Graphics2D)
            {
                for(j<-0 to h-1;i<-0 to w-1)
                {
                    var r=new Rectangle(i*c,j*c,c,c)
                    x(i)(j) match
                    {
                        case 0=>g draw r
                        case 1=>g fill r
                    }
                }
            }
        }
        def actionPerformed(e:ActionEvent)
        {
            if(run)
            {
                var t=x.map(_.clone)
                for(j<-0 to h-1;i<-0 to w-1)
                {
                    d=0
                    n(i,j)
                    x(i)(j) match
                    {
                        case 0=>if(d==3)t(i)(j)=1
                        case 1=>if(d<2||d>3)t(i)(j)=0
                    }
                }
                x=t.map(_.clone)
                repaint
            }
        }
        val timer=new Timer(200,this)
        timer.start
    }
}

ส่วนใหญ่ของรหัสที่นี่คือสิ่งสวิง GUI ตัวเกมอยู่ในactionPerformedวิธีการที่ถูกกระตุ้นโดยTimerและฟังก์ชันผู้ช่วยnที่นับจำนวนเพื่อนบ้าน

การใช้งาน:

รวบรวมไว้ด้วยแล้วเรียกมันด้วยscalac filename การคลิกที่สี่เหลี่ยมจัตุรัสจะพลิกจากการแสดงสดเป็นตายและตัวเลือกเมนูจะเริ่มและหยุดเกม หากคุณต้องการเปลี่ยนขนาดของกริดให้เปลี่ยนค่าสามค่าแรกในบรรทัดนั่นคือความกว้างความสูงและขนาดเซลล์ (เป็นพิกเซล) ตามลำดับscala L
var(w,h,c,d,r)=(20,20,20,0,false)


ฉันพบการปรับปรุงการเล่นกอล์ฟ 2 ครั้ง: import java.awt.event._และcontents+=m("Go",true)+=m("Stop",false)}}นำไปสู่ ​​1,093 ตัวอักษร
ไม่ทราบผู้ใช้

@user ไม่ทราบขอบคุณ ฉันพบการปรับปรุงบางอย่างด้วยตัวเอง - จนถึง 1063 ตอนนี้
Gareth

ประณามคุณไม่ว่าง ตามทัน! ฉันจะทดสอบคำตอบเมื่อมีคนอีกไม่กี่คนโพสต์
กริฟ

7

Pure Bash ขนาด 244 ไบต์

ทำงานบนจักรวาลขนาด 36x24 ที่ห่อด้วย toroidally:

mapfile a
for e in {0..863};{
for i in {0..8};{
[ "${a[(e/36+i/3-1)%24]:(e+i%3-1)%36:1}" == O ]&&((n++))
}
d=\ 
c=${a[e/36]:e%36:1}
[ "$c" == O ]&&((--n==2))&&d=O
((n-3))||d=O
b[e/36]+=$d
n=
}
printf -vo %s\\n "${b[@]}"
echo "$o"
exec $0<<<"$o"

เนื่องจากนี่เป็นเชลล์สคริปต์วิธีการอินพุตจะสอดคล้องกับคำสั่งเชลล์อื่น ๆ - เช่นจาก stdin:

$ ./conway.sh << EOF

   O 
    O 
  OOO 

EOF


  O O                                                       
   OO                                                       
   O                                                        

















    O                                                       
  O O                                                       
   OO                                                       

... ฯลฯ

เราสามารถเปลี่ยนเส้นทางอินพุตจากแหล่งข้อความใด ๆ ส่งผ่านtrตัวกรองเพื่อรับรุ่นเริ่มต้นที่น่าสนใจเช่น

man tr | tr [:alnum:] O | ./conway.sh

6

JavaScript, 130

ไม่ตอบสนองต่อความท้าทายทั้งหมด แต่สำหรับบันทึกแล้วนี่คือเกมแห่งชีวิตใน 130 ไบต์ที่ทำโดย Subzey และฉันในปี 2013

http://xem.github.io/miniGameOfLife/

/* Fill an array with 0's and 1's, and call g(array, width, height) to iterate */
g=function(f,c,g,d,e,b,h){g=[];e=[c+1,c,c-1,1];for(b=c*c;b--;g[b]=3==d||f[b]&&2==d,d=0)for(h in e)d+=f[b+e[h]]+f[b-e[h]];return g}

ดูเหมือนว่าจะมีปัญหากับแถวแรก ยกตัวอย่างเช่นการตั้งค่า@@\n@@(2 จาก 2 ตารางในมุมบนซ้าย) .@\n.@\n.@หรือ (1 คูณ 3 คอลัมน์)
Annan

5

C # - 675 ตัวอักษร

ฉันอยากจะเขียนโปรแกรมนี้เป็นเวอร์ชั่นเสมอ ไม่เคยรู้เลยว่ามันจะใช้เวลาเพียงครึ่งชั่วโมงในการสร้างเวอร์ชั่นที่สกปรก (การเล่นกอล์ฟมันใช้เวลานานกว่าแน่นอน)

using System.Windows.Forms;class G:Form{static void Main(){new G(25).ShowDialog();}
public G(int z){var g=new Panel[z,z];var n=new int [z,z];int x,y,t;for(int i=0;i<z;
i++)for(int j=0;j<z;j++){var p=new Panel{Width=9,Height=9,Left=i*9,Top=j*9,BackColor
=System.Drawing.Color.Tan};p.Click+=(s,a)=>p.Visible=!p.Visible;Controls.Add(g[i,j]=
p);}KeyUp+=(s,_)=>{for(int i=0;i<99;i++){for(x=0;x<z;x++)for(y=0;y<z;y++){t=0;for(int 
c=-1;c<2;c++)for(int d=-1;d<2;d++)if(c!=0||d!=0){int a=x+c,b=y+d;a=a<0?24:a>24?0:a;b=
b<0?24:b>24?0:b;t+=g[a,b].Visible?0:1;}if(t==3||t>1&&!g[x,y].Visible)n[x,y]=1;if(t<2
||t>3)n[x,y]=0;}for(x=0;x<z;x++)for(y=0;y<z;y++)g[x,y].Visible=n[x,y]<1;Update();}};}}

การใช้

  • ป้อนรูปแบบเริ่มต้นโดยคลิกที่เซลล์เพื่อเปิดใช้งาน (ยังมีชีวิตอยู่)
  • เริ่มเกมด้วยการกดแป้นคีย์บอร์ดใด ๆ
  • เกมนี้ทำงานมาแล้ว 99 รุ่นทุกครั้งที่มีการกดปุ่ม (ฉันสามารถสร้างมันขึ้นมา 9 เพื่อช่วยประหยัดถ่าน แต่มันก็ดูอ่อนแอเกินไป)

การเล่นกอล์ฟประนีประนอม

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

5

GW-BASIC, 1086 1035 ไบต์ (โทเค็น)

ในรูปแบบโทเค็นนี่คือ 1,035 ไบต์ (แน่นอนว่ารูปแบบ ASCII นั้นยาวไปหน่อย) คุณจะได้รับแบบฟอร์มโดยใช้SAVE"lifeคำสั่งโดยไม่ต้องต่อท้าย",aล่าม

10 DEFINT A-Z:DEF SEG=&HB800:KEY OFF:COLOR 7,0:CLS:DEF FNP(X,Y)=PEEK((((Y+25)MOD 25)*80+((X+80)MOD 80))*2)
20 X=0:Y=0
30 LOCATE Y+1,X+1,1
40 S$=INKEY$:IF S$=""GOTO 40
50 IF S$=CHR$(13)GOTO 150
60 IF S$=" "GOTO 130
70 IF S$=CHR$(0)+CHR$(&H48)THEN Y=(Y-1+25)MOD 25:GOTO 30
80 IF S$=CHR$(0)+CHR$(&H50)THEN Y=(Y+1)MOD 25:GOTO 30
90 IF S$=CHR$(0)+CHR$(&H4B)THEN X=(X-1+80)MOD 80:GOTO 30
100 IF S$=CHR$(0)+CHR$(&H4D)THEN X=(X+1)MOD 80:GOTO 30
110 IF S$="c"THEN CLS:GOTO 20
120 GOTO 40
130 Z=PEEK((Y*80+X)*2):IF Z=42 THEN Z=32ELSE Z=42
140 POKE(Y*80+X)*2,Z:GOTO 40
150 LOCATE 1,1,0:ON KEY(1)GOSUB 320:KEY(1) ON
160 V!=TIMER+.5:FOR Y=0 TO 24:FOR X=0 TO 79:N=0
170 Z=FNP(X-1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
180 Z=FNP(X,Y-1):IF Z=42 OR Z=46 THEN N=N+1
190 Z=FNP(X+1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
200 Z=FNP(X-1,Y):IF Z=42 OR Z=46 THEN N=N+1
210 Z=FNP(X+1,Y):IF Z=42 OR Z=46 THEN N=N+1
220 Z=FNP(X-1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
230 Z=FNP(X,Y+1):IF Z=42 OR Z=46 THEN N=N+1
240 Z=FNP(X+1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
250 Z=PEEK((Y*80+X)*2):IF Z=32 THEN IF N=3 THEN Z=43
260 IF Z=42 THEN IF N<2 OR N>3 THEN Z=46
270 POKE(Y*80+X)*2,Z:NEXT:NEXT:FOR Y=0 TO 24:FOR X=0 TO 79:Z=PEEK((Y*80+X)*2):IF Z=46 THEN Z=32
280 IF Z=43 THEN Z=42
290 POKE(Y*80+X)*2,Z:NEXT:NEXT
300 IF TIMER<V!GOTO 300
310 IF INKEY$=""GOTO 160
320 SYSTEM

นี่เป็นรุ่นที่เล่นกอล์ฟได้สูงสุด แต่ยังมีคุณสมบัติ: เมื่อเริ่มต้นคุณจะได้รับโปรแกรมแก้ไขซึ่งคุณสามารถเคลื่อนที่ได้ด้วยปุ่มลูกศร พื้นที่สลับแบคทีเรียเปิด / ปิดบนสนามปัจจุบันcล้างหน้าจอกลับมาเริ่มโหมดเกม

ต่อไปนี้เป็นเวอร์ชั่นที่สับสนน้อยกว่าซึ่งยังกำหนดบอร์ดเกมเริ่มต้นที่มีสองโครงสร้าง (สิ่งหมุนเวียนหมุนเวียนและเครื่องร่อน):

1000 REM Conway's Game of Life
1001 REM -
1002 REM Copyright (c) 2012 Thorsten "mirabilos" Glaser
1003 REM All rights reserved. Published under The MirOS Licence.
1004 REM -
1005 DEFINT A-Z:DEF SEG=&hB800
1006 KEY OFF:COLOR 7,0:CLS
1007 DEF FNP(X,Y)=PEEK((((Y+25) MOD 25)*80+((X+80) MOD 80))*2)
1010 PRINT "Initial setting mode, press SPACE to toggle, RETURN to continue"
1020 PRINT "Press C to clear the board, R to reset. OK? Press a key then."
1030 WHILE INKEY$="":WEND
1050 CLS
1065 DATA 3,3,4,3,5,3,6,3,7,3,8,3,3,4,4,4,5,4,6,4,7,4,8,4
1066 DATA 10,3,10,4,10,5,10,6,10,7,10,8,11,3,11,4,11,5,11,6,11,7,11,8
1067 DATA 11,10,10,10,9,10,8,10,7,10,6,10,11,11,10,11,9,11,8,11,7,11,6,11
1068 DATA 4,11,4,10,4,9,4,8,4,7,4,6,3,11,3,10,3,9,3,8,3,7,3,6
1069 DATA 21,0,22,1,22,2,21,2,20,2,-1,-1
1070 RESTORE 1065
1080 READ X,Y
1090 IF X=-1 GOTO 1120
1100 POKE (Y*80+X)*2,42
1110 GOTO 1080
1120 X=0:Y=0
1125 LOCATE Y+1,X+1,1
1130 S$=INKEY$
1140 IF S$="" GOTO 1130
1150 IF S$=CHR$(13) GOTO 1804
1160 IF S$=" " GOTO 1240
1170 IF S$=CHR$(0)+CHR$(&h48) THEN Y=(Y-1+25) MOD 25:GOTO 1125
1180 IF S$=CHR$(0)+CHR$(&h50) THEN Y=(Y+1) MOD 25:GOTO 1125
1190 IF S$=CHR$(0)+CHR$(&h4B) THEN X=(X-1+80) MOD 80:GOTO 1125
1200 IF S$=CHR$(0)+CHR$(&h4D) THEN X=(X+1) MOD 80:GOTO 1125
1210 IF S$="c" THEN CLS:GOTO 1120
1220 IF S$="r" GOTO 1050
1225 IF S$=CHR$(27) THEN END
1230 GOTO 1130
1240 Z=PEEK((Y*80+X)*2)
1250 IF Z=42 THEN Z=32 ELSE Z=42
1260 POKE (Y*80+X)*2,Z
1270 GOTO 1130
1804 LOCATE 1,1,0
1900 ON KEY(1) GOSUB 2300
1910 KEY(1) ON
2000 V!=TIMER+.5
2010 FOR Y=0 TO 24
2020  FOR X=0 TO 79
2030   N=0
2040   Z=FNP(X-1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2050   Z=FNP(X  ,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2060   Z=FNP(X+1,Y-1):IF Z=42 OR Z=46 THEN N=N+1
2070   Z=FNP(X-1,Y  ):IF Z=42 OR Z=46 THEN N=N+1
2080   Z=FNP(X+1,Y  ):IF Z=42 OR Z=46 THEN N=N+1
2090   Z=FNP(X-1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2100   Z=FNP(X  ,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2110   Z=FNP(X+1,Y+1):IF Z=42 OR Z=46 THEN N=N+1
2120   Z=PEEK((Y*80+X)*2)
2130   IF Z=32 THEN IF N=3 THEN Z=43
2140   IF Z=42 THEN IF N<2 OR N>3 THEN Z=46
2150   POKE (Y*80+X)*2,Z
2160  NEXT X
2170 NEXT Y
2200 FOR Y=0 TO 24
2210  FOR X=0 TO 79
2220   Z=PEEK((Y*80+X)*2)
2230   IF Z=46 THEN Z=32
2240   IF Z=43 THEN Z=42
2250   POKE (Y*80+X)*2,Z
2260  NEXT X
2270 NEXT Y
2280 IF TIMER<V! GOTO 2280
2290 IF INKEY$="" GOTO 2000
2300 SYSTEM

ฉันเขียนสิ่งนี้ในเวลา 15 นาทีในขณะที่เบื่อและรอเพื่อนคนหนึ่งซึ่งเป็นผู้เล่นโค๊ชกับ "ผู้ฝึกสอน" สำหรับเกมแห่งชีวิตของคอนเวย์ในเวลาเดียวกัน

มันทำหน้าที่ดังนี้: ใช้บัฟเฟอร์หน้าจอโหมดข้อความ 80x25 ทันที (เปลี่ยนค่าเริ่มต้นDEF SEGเป็นใช้&hB000หากคุณอยู่บนการ์ดกราฟิก Hercules การตั้งค่าเหล่านี้จะทำงานกับ Qemu และ (ช้าลง) dosbox เครื่องหมายดอกจัน*เป็นแบคทีเรีย

มันทำงานได้สองรอบแรก birthplaces มีเครื่องหมายและความตายนับเป็นเป้าหมายด้วย+ .ในรอบที่สอง+และ.ถูกแทนที่ด้วย*และตามลำดับ

TIMERสิ่งคือการทำให้มันรอครึ่งหลังหลังจากที่แต่ละรอบในกรณีที่โฮสต์ Qemu ของคุณ☺รวดเร็วมาก

ฉันไม่ได้หวังว่าจะได้ราคาที่สั้นที่สุดที่นี่ แต่สำหรับคนที่มีความเท่โดยเฉพาะเมื่อพิจารณาการตั้งค่าเริ่มต้นของบอร์ด ฉันยังมีรุ่นที่เอ็นจิ้นเกมถูกแทนที่ด้วยรหัสการประกอบในกรณีที่คุณสนใจ ...


เมื่อพิจารณาว่าคุณเพิ่มระดับป้ายกำกับของคุณทีละ 1 ในเวอร์ชันที่ไม่ใช่กอล์ฟคุณสามารถทำเช่นเดียวกันกับเวอร์ชันที่ตีกอล์ฟได้หรือไม่ (เช่น1, 2, 3ฯลฯ ) หรือทำหมายเลขบรรทัดไม่นับ?
Zacharý

หมายเลขบรรทัดเมื่อโทเค็นนับเป็นคำ (16 บิต) ถ้าฉันไม่เข้าใจผิดทั้งหมด
mirabilos

เอาล่ะเดาว่าฉันคงต้องคิดถึงภาษาเบสิกอื่น ๆ บ้างแล้ว
Zacharý

@ Zacharýคลิกที่ "รูปแบบโปรแกรมโทเค็น GW-BASIC" จากนั้นคลิกที่ "รูปแบบโปรแกรม" ที่นี่เพื่อดูว่าที่จริงแล้วหมายเลขบรรทัดมีสองไบต์อย่างต่อเนื่องและสำหรับรายละเอียดเชิงลึกเกี่ยวกับรูปแบบโทเค็น
mirabilos

5

Mathematica, 115 ไบต์

ต่อไปนี้เป็นวิธีแก้ปัญหาที่ง่าย:

ListAnimate[ArrayPlot/@CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},
{2,2,2}}},{1,1}},{RandomInteger[1,{9,9}],0},90]]

1
Mathematica นั้นใช้ได้ แต่ตามกฎที่ระบุโปรแกรมจะต้องอนุญาตให้ผู้ใช้ป้อนรูปแบบของตนเอง กฎนี้มีเจตนาเนื่องจากบางภาษาอนุญาตให้มีการใช้งานสั้น ๆ เช่นนี้ แต่ไม่มีการโต้ตอบกับผู้ใช้ แน่นอนว่าคุณสามารถใส่อาเรย์ของคุณเองได้ แต่มันจะไม่ชนะ
กริฟ

"อินพุต" ใน Mathematica ส่วนใหญ่ผ่านอินเทอร์เฟซโน้ตบุ๊กดังนั้นฉันไม่คิดว่า "การโต้ตอบผู้ใช้" เป็นไปได้จริง ๆ คุณเพียงแค่แทนที่อาร์กิวเมนต์ RandomInteger เป็นฟังก์ชัน CellularAutomaton ด้วยสิ่งที่คุณต้องการและประเมินโค้ดอีกครั้ง
JeremyKun

3
การโต้ตอบกับผู้ใช้เป็นไปได้ วิธีที่ง่ายที่สุดที่ฉันนึกได้ตอนนี้คือปุ่มต่างๆ ให้มันเป็นคนไป
กริฟ

4

Java (OpenJDK 8) - 400 388 367 ไบต์

ที่สองและ (อาจ) แก้ไขขั้นสุดท้าย: จัดการกอล์ฟเพิ่มอีก 21 ไบต์หลังจากค้นหาเหมืองทองคำ (imo) เหล่านี้- ขอแนะนำให้ผู้คนใหม่ ๆ อ่านอย่างแน่นอน

โค้ดผลลัพธ์ (อาจจะลงเอยด้วยการตีกอล์ฟให้มากขึ้นหากฉันพบวิธีย่อให้ซ้อนกันสองเท่าสำหรับลูป ... ):

u->{int w=u.length,h=u[0].length,x,y,i,j,n;Stack<Point>r=new Stack<Point>();for(;;){for(Point c:r)u[c.x][c.y]=1;r.clear();for(x=0;x<w;++x)for(y=0;y<h;++y){boolean o=u[x][y]>0;n=o?-1:0;for(i=-2;++i<2;)for(j=-2;++j<2;)if(u[(w+x+i)%w][(h+y+j)%h]>0)++n;if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y));System.out.print(u[x][y]+(y>h-2?"\n":""));}for(int[]t:u)Arrays.fill(t,0);}}

ลองออนไลน์!

(โพสต์ต้นฉบับเริ่มต้นที่นี่)

จริง ๆ แล้วฉันคิดว่าสักครู่ที่ฉันจะสามารถท้าทายคำตอบของ Python ที่ดีที่สุดด้วยความรู้ (จำกัด เนื้อหา) ของฉันเกี่ยวกับ Java lol ... มันเป็นความท้าทายที่ฉันมีความสุขที่ได้มีส่วนร่วม สายไปนิดหน่อย ... )

มีไม่มากนัก - คำอธิบายพื้นฐานดังต่อไปนี้ (ไม่ได้รับการเสริม):

/*
 * Explanation of each variable's usage:
 * w=height* of array
 * h=width* of array
 * x=y* coord of point in array
 * y=x* coord of point in array
 * i and j are counters for calculating the neighbours around a point in the array
 * n=neighbour counter
 * r=temporary array to store the cells from the current generation
 * u=the 2d array used for all the calculations (parameter from lambda expression)
 * c=temporary variable used to help populate the 2d array
 * o=boolean variable that stores the value of whether the cell is alive or not
 */
u-> // start of lambda statement with u as parameter (no need for brackets as it's only one parameter being passed)
{
    int w=u.length,h=u[0].length,x,y,i,j,n; // defines all the necessary integer variables;
    Stack<Point>r=new Stack<Point>(); // same with the only array list needed (note how I only use two data structures);
    for(;;) // notice how this is still an infinite loop but using a for loop;
    {
        for(Point c:r)u[c.x][c.y]=1; //for every point in the "previous" generation, add that to the 2D array as a live (evil?) cell;
        r.clear(); // clears the array list to be populated later on
        for(x=0;x<w;++x) // a pair of nested for loops to iterate over every cell of the 2D array;
        {
            for(y=0;y<h;++y)
            {
                // sets o to be the presence of a live cell at (x,y) then uses said value in initialising the neighbour counter;
                boolean o=u[x][y]>1;n=o?-1:0;
                for(i=-2;++i<2;) // another pair of nested for loops - this one iterates over a 3x3 grid around *each* cell of the 2D array;
                {                // this includes wrap-around (note the modulus sign in the if statement below);
                    for(j=-2;++j<2;)
                    {
                        if(u[(w+x+i)%w][(h+y+j)%h]>0)++n; // this is where the first interesting thing lies - the bit which makes wrap-around a reality;
                    }
                }
                if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y)); // this is the second interesting bit of my code - perhaps more so as I use bitwise operators to calculate the number of neighbours (x,y) has;
                                                            // (since I'm technically dealing with 0s and 1s, it's not a total misuse of them imo);
                System.out.print(u[x][y]+(y>h-2?"\n":""));  // that extra part of the print statement adds a newline if we reached the end of the current 'line';
            }
        }
        // since the information about the new generation is now in the array list, this array can be emptied out, ready to receive said info on the new generation;
        for(int[]t:u)Arrays.fill(t,0);
    }
} // end of lambda statement

(ข้อมูลเพิ่มเติมเกี่ยวกับคำสั่ง lambda ใน Java 8 ที่นี่ )

ใช่มีการจับกับวิธีการของฉัน

อย่างที่พวกคุณหลายคนอาจสังเกตุเห็นรหัสของฉันที่เล่นกอล์ฟขณะนี้มันจะวนซ้ำตลอดไป เพื่อป้องกันสิ่งนี้สามารถใช้ตัวนับที่ด้านบนและใช้ในขณะที่ลูปเพื่อแสดงเฉพาะn(ในกรณีนี้ 5) การวนซ้ำดังนี้ (สังเกตว่าbมีการเพิ่มตัวแปรใหม่):

u->{int b=0,w=u.length,h=u[0].length,x,y,i,j,n;Stack<Point>r=new Stack<Point>();for(;++b<6;){for(Point c:r)u[c.x][c.y]=1;r.clear();for(x=0;x<w;++x)for(y=0;y<h;++y){boolean o=u[x][y]>0;n=o?-1:0;for(i=-2;++i<2;)for(j=-2;++j<2;)if(u[(w+x+i)%w][(h+y+j)%h]>0)++n;if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y));System.out.print(u[x][y]+(y>h-2?"\n":""));}for(int[]t:u)Arrays.fill(t,0);}}

นอกจากนี้บางจุดที่ควรค่าแก่การกล่าวถึง โปรแกรมนี้ไม่ตรวจสอบว่าอินพุตถูกต้องและจะล้มเหลวด้วย (ส่วนใหญ่) และArrayOutOfBoundsException; ดังนั้นโปรดตรวจสอบให้แน่ใจว่าอินพุตนั้นถูกต้องโดยการกรอกข้อมูลในส่วนของอาร์เรย์อย่างสมบูรณ์ (อาร์เรย์ที่เอียงจะโยนข้อยกเว้นที่กล่าวถึงข้างต้น) ยิ่งไปกว่านั้นกระดานที่ดูเหมือนจะเป็น 'ของเหลว' ในปัจจุบัน - นั่นคือไม่มีการแยกระหว่างรุ่นหนึ่งกับรุ่นถัดไป หากคุณต้องการที่จะเพิ่มเข้าไปในการตรวจสอบอีกครั้งว่ารุ่นที่ผลิตนั้นถูกต้องต้องมีการเพิ่มพิเศษSystem.out.println();ก่อนfor(int[]t:u)Arrays.fill(t,0);(ดูที่นี่ลองออนไลน์!เพื่อความชัดเจน) และสุดท้าย แต่ไม่ท้ายสุดนี่เป็นรหัสแรกของฉันข้อเสนอแนะใด ๆ ที่ชื่นชมอย่างมาก :)

รหัสเก่าจาก 388 ไบต์ตอบก่อนหน้า:

u->{int w=u.length,h=u[0].length,x,y,i,j,n;ArrayList<Point>r=new ArrayList<Point>();while(true){for(Point c:r)u[c.x][c.y]=1;r.clear();for(x=0;x<w;++x){for(y=0;y<h;++y){boolean o=u[x][y]==1;n=o?-1:0;for(i=-2;++i<2;)for(j=-2;++j<2;)if(u[(w+x+i)%w][(h+y+j)%h]==1)++n;if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y));System.out.print(u[x][y]);}System.out.println();}for(int[]t:u)Arrays.fill(t,0);}}

และจากคำตอบแรก 400 ไบต์:

int w=35,h=20,x,y,i,j,n;ArrayList<Point>l=new ArrayList<Point>(),r;while(true){int[][]u=new int[w][h];for(Point c:l)u[c.x][c.y]=1;r=new ArrayList<Point>();for(x=0;x<w;++x){for(y=0;y<h;++y){boolean o=u[x][y]==1;n=o?-1:0;for(i=-2;++i<2;)for(j=-2;++j<2;)if(u[(w+x+i)%w][(h+y+j)%h]==1)++n;if(o&n>1&n<4|!o&n==3)r.add(new Point(x,y));System.out.print(u[x][y]);}System.out.println();}l.clear();l.addAll(r);}

โพสต์แรกที่น่าอัศจรรย์ยินดีต้อนรับสู่ PPCG!
Zacharý

ขอบคุณฉันจะทำสิ่งเหล่านี้ให้มากขึ้นอย่างแน่นอน - พวกเขาสนุก :)
NotBaal

เข้าร่วมกับเราเรามีเดนนิส นอกจากนี้นี่ไม่ใช่โปรแกรมหรือฟังก์ชั่นที่สมบูรณ์ซึ่งจำเป็นต้องมี IIRC
Zacharý

โอ้ถูกต้องลืมส่วน 'โปรแกรม': P การแก้ไขในบิต
NotBaal

มันสามารถเป็นฟังก์ชั่นได้เช่นกัน
Zacharý

4

ลายฉลุขนาด 6 ไบต์

ไม่ใช่ภาษาที่ชื่นชอบ แต่มันคือสั้น ...

โค้ดไบต์ 4 บวกกับแฟล็กnlist และTorus

3me

ลองออนไลน์!

คือ ...
3 3
 สมาชิกของเมตร oore-ย่านนับด้วยตนเองหรือ ทุ่งอี -neighbourhood โดยไม่นับตัวเอง ... ?
m
e


3

สกาล่า - 799 ตัวอักษร

ทำงานเป็นสคริปต์ คลิกเมาส์ที่ช่องสี่เหลี่ยมเพื่อเปิดหรือปิดและปุ่มใด ๆ ที่เริ่มต้นหรือหยุดการสร้าง

import java.awt.Color._
import swing._
import event._
import actors.Actor._
new SimpleSwingApplication{var(y,r,b)=(200,false,Array.fill(20,20)(false))
lazy val u=new Panel{actor{loop{if(r){b=Array.tabulate(20,20){(i,j)=>def^(i:Int)= -19*(i min 0)+(i max 0)%20
var(c,n,r)=(0,b(i)(j),-1 to 1)
for(x<-r;y<-r;if x!=0||y!=0){if(b(^(i+x))(^(j+y)))c+=1}
if(n&&(c<2||c>3))false else if(!n&&c==3)true else n}};repaint;Thread.sleep(y)}}
focusable=true
preferredSize=new Dimension(y,y)
listenTo(mouse.clicks,keys)
reactions+={case e:MouseClicked=>val(i,j)=(e.point.x/10,e.point.y/10);b(i)(j)= !b(i)(j)case _:KeyTyped=>r= !r}
override def paintComponent(g:Graphics2D){g.clearRect(0,0,y,y);g.setColor(red)
for(x<-0 to 19;y<-0 to 19 if b(x)(y))g.fillRect(x*10,y*10,9,9)}}
def top=new Frame{contents=u}}.main(null)

3

J, 45

ฉันคิดว่าฉันจะลอง J ยังไม่ได้ลงเล่นกอล์ฟโดยเฉพาะอย่างยิ่ง แต่ฉันจะลองอีกครั้งในไม่ช้า

(]+.&(3&=)+)+/((4&{.,(_4&{.))(>,{,~<i:1))&|.

ตัวอย่าง:

   f =: 5 5 $ 0 1 0 0 0   0 0 1 0 0   1 1 1 0 0   0 0 0 0 0    0 0 0 0 0
   f
0 1 0 0 0
0 0 1 0 0
1 1 1 0 0
0 0 0 0 0
0 0 0 0 0
   f (]+.&(3&=)+)+/((4&{.,(_4&{.))(>,{,~<i:1))&|. f
0 0 0 0 0
1 0 1 0 0
0 1 1 0 0
0 1 0 0 0
0 0 0 0 0

3

กำลังดำเนินการ 536 532

int h=22,t=24,i,j;int[][]w=new int[t][t],b=new int[t][t];int[]q={1,0,-1};void draw(){if(t<9){clear();for(i=2;i<h;i++){for(j=2;j<h;j++)w[i][j]=b[i][j];w[i][1]=w[i][21];w[i][h]=w[i][2];w[1][i]=w[21][i];w[h][i]=w[2][i];}for(i=1;i<23;i++)for(j=1;j<23;j++){t=-w[i][j];for(int s:q)for(int d:q)t+=w[i+s][j+d];b[i][j]=w[i][j]>0&(t<2|t>3)?0:t==3?1:b[i][j];}a();}}void keyPressed(){t=0;}void mousePressed(){int i=mouseX/5+2,j=mouseY/5+2;w[i][j]=b[i][j]=1;a();}void a(){for(i=0;i<h-2;i++)for(j=0;j<h-2;j++)if(w[i+2][j+2]==1)rect(i*5,j*5,5,5);}

ฉันเชื่อว่านี่เป็นไปตามข้อกำหนดทั้งหมด

Ungolfed:

int h=22,t=24,i,j;
int[][]w=new int[t][t],b=new int[t][t];
int[]q={1,0,-1};
void draw(){
  if(t<9){
  clear();
  for(i=2;i<h;i++){
    for(j=2;j<h;j++)
      w[i][j]=b[i][j];  
    w[i][1]=w[i][21];
    w[i][h]=w[i][2];
    w[1][i]=w[21][i];
    w[h][i]=w[2][i];
  }
  for(i=1;i<23;i++)
    for(j=1;j<23;j++){
      t=-w[i][j];
      for(int s:q)
        for(int d:q)
          t+=w[i+s][j+d];        
      b[i][j]=w[i][j]>0&(t<2|t>3)?0:t==3?1:b[i][j];  
  }
  a();
}
}
void keyPressed(){
  t=0;
}
void mousePressed(){
  int i=mouseX/5+2,j=mouseY/5+2;
  w[i][j]=b[i][j]=1;
  a();
}
void a(){
  for(i=0;i<h-2;i++)
    for(j=0;j<h-2;j++)
      if(w[i+2][j+2]==1)
        rect(i*5,j*5,5,5);
  }  

3

Matlab (152)

b=uint8(rand(20)<0.2)
s=@(m)imfilter(m,[1 1 1;1 0 1;1 1 1],'circular')
p=@(m,n)uint8((n==3)|(m&(n==2)))
while 1
imshow(b)
drawnow
b=p(b,s(b))
end

ฉันไม่ได้ติดตั้ง Matlab ตอนนี้เพื่อทดสอบฉันเพิ่งเล่นกอล์ฟรหัสที่ฉันเขียนเมื่อไม่กี่ปีที่ผ่านมา
Ungolfed:

%% initialize
Bsize = 20;
nsteps = 100;
board = uint8(rand(Bsize)<0.2); % fill 20% of the board
boardsum = @(im) imfilter(im,[1 1 1; 1 0 1; 1 1 1], 'circular');
step = @(im, sumim) uint8((sumim==3) | (im & (sumim==2)) );

%% run
for i = 1:nsteps
    imshow(kron(board,uint8(ones(4))), [])
    drawnow
    ss(p,i) = sum(board(:));
    board = step(board, boardsum(board));
end
  • บอร์ดเซสเป็นฮาร์ดโค้ด แต่อาจเป็นอะไรก็ได้
  • ล้อมรอบ
  • สำหรับการป้อนข้อมูลของผู้ใช้สามารถเปลี่ยนบอร์ด inital ได้ทั้งโดย hardcoding เมทริกซ์อื่นหรือใช้โปรแกรมแก้ไขตัวแปร ไม่สวย แต่ใช้งานได้
  • สามารถบันทึกได้ 20 ตัวอักษรหากมีการข้ามเอาท์พุทกราฟิกบอร์ดจะยังคงพิมพ์เป็นข้อความทุกการวนซ้ำ เซลล์หนึ่งพิกเซลซึ่งเปลี่ยนไปทุกมิลลิวินาทีจะไม่มีประโยชน์มาก

ทำงานใน R2014a เพิ่งทดสอบ
masterX244

3

Perl, 218 216 211 202 ไบต์

$,=$/;$~=AX3AAAx76;$b=pack('(A79)23',<>)x6;{print unpack'(a79)23a0',$b;select$v,$v,$v,0.1;$b=pack'(A)*',unpack'((x7a/(x13)X4Ax!18)1817@0)4',pack'((a*)17xx!18)*',unpack"x1737(AA$~Ax$~AA$~@)2222",$b;redo}

(ไม่มีการขึ้นบรรทัดใหม่ในตอนท้ายของรหัสนี้)

อ่านรูปแบบเริ่มต้นจากอินพุตมาตรฐานเป็นไฟล์ข้อความที่แสดงเซลล์ที่มี1ชีวิตเซลล์ที่ตายแล้วแสดงเป็นช่องว่างบรรทัดจะถูกคั่นด้วยบรรทัดใหม่ อินพุตจะต้องไม่มีอักขระอื่นนอกเหนือจากนี้ เส้นสามารถมีความยาวผันแปรได้และจะถูกทับหรือตัดให้มีความกว้างถึง 79 พอดี ตัวอย่างการป้อนข้อมูลเป็นปืนเครื่องร่อน:

                                  1
                                1 1
                      11      11            11
                     1   1    11            11
          11        1     1   11
          11        1   1 11    1 1
                    1     1       1
                     1   1
                      11









                                         11
                                         1
                                          111
                                            1

เมื่อโปรแกรมรัน Game of Life ทุกสถานะจะถูกดัมพ์ไปยังเอาต์พุตมาตรฐานในรูปแบบที่คล้ายกับอินพุตจากนั้นหน่วงเวลา 0.1 วินาที ความล่าช้าสามารถปรับแต่งได้โดยเปลี่ยนอาร์กิวเมนต์ที่สี่ของการโทรที่เลือก

บอร์ดเกมนั้นเขียนด้วยรหัสขนาด 79x23 มันถูกห่อหุ้มด้วยพรู: ถ้าคุณออกจากบอร์ดที่ด้านล่างคุณจะจบลงที่ด้านบน; หากคุณออกทางด้านขวาคุณจะสิ้นสุดที่ด้านซ้าย แต่เลื่อนลงหนึ่งแถว

นี่เป็นเวอร์ชั่นอื่นที่ไม่อ่านอินพุตใด ๆ และเริ่มจากกระดานสุ่ม:

$,=$/;$/=AX3AAAx76;$b=pack("(A)*",map{rand 3<1}0..1816)x6;{print unpack'(a79)23a0',$b;select$v,$v,$v,0.1;$b=pack'(A)*',unpack'((x7a/(x13)X4Ax!18)1817@0)4',pack'((a*)17xx!18)*',unpack"x1737(AA$/Ax$/AA$/@)2222",$b;redo}

รหัสนี้ได้มาจากเกมที่ปกปิดของโปรแกรม Perl ชีวิตผมเขียนปีที่ผ่านมา ฉันได้เปลี่ยนมันมากมายเพื่อให้บอร์ด toroidal และรหัสกอล์ฟ

นี่อาจไม่ใช่วิธีที่สั้นที่สุดในการใช้ Game of Life ในภาษา Perl แต่เป็นหนึ่งในวิธีที่เข้าใจได้น้อยกว่า

บอร์ดถูกเก็บไว้ใน$bรูปของสตริง'1'และ' 'หนึ่งเซลล์สำหรับแต่ละเซลล์มีเพียงสิ่งเดียวที่ทำซ้ำทั้งหมดอย่างน้อยสามครั้ง การคลายการเรียกครั้งที่สามจะแยกค่า 17 ค่าสำหรับแต่ละเซลล์: หนึ่งค่าสำหรับเซลล์เองและอีกสองค่าสำหรับเซลล์เพื่อนบ้านแปดเซลล์ตามลำดับโดยพลการและแต่ละค่าเป็น'1'สตริงว่างหรือ เซลล์ควรมีชีวิตอยู่ในการทำซ้ำครั้งต่อไปถ้าจำนวน'1'ค่าระหว่าง 17 ค่าเหล่านี้คือ 5, 6, หรือ 7 การเรียกชุดที่สามเชื่อมต่อค่าเหล่านี้ 17 กับเขตกว้างตัวอักขระ 18 ที่จัดชิดซ้ายและปรับด้วย nul bytes ด้านขวา . การคลายสายครั้งที่สองใช้ฟิลด์กว้าง 18 กระจายตัวอักษรที่ตำแหน่ง 7 ปลดช่องว่างออกจากตำแหน่ง 17 หากเป็น'1'หรือคลายอักขระจากตำแหน่ง 4 เป็นอย่างอื่น ผลลัพธ์นี้เป็นค่าที่เซลล์ควรมีในรุ่นต่อไป


2

Python 589 ไบต์

ปุ่มเมาส์: ซ้าย - ใส่เซลล์ด้านขวา - ลบเซลล์ตรงกลาง - เริ่ม / หยุด

จากการนำเข้า Tkinter *
คัดลอกนำเข้า
Z = ช่วง
F = 50
T = Tk ()
S = 9
f = [F * [0] สำหรับฉัน in'7 '* F]
c = ผ้าใบ (T, width = S * F, height = S * F)
c.pack ()
def p (x, y, a): f [y] [x] = f [y] [x] หรือ c.create_oval (x * S, y * S, x * S + S, y * S + S) ถ้าคนอื่น c.delete (f [y] [x])
r = 1
def R (e): global r; r = 1-r
exec ("c.bind ('<ปุ่ม -% i>', แลมบ์ดา e: p (ex / S, ey / S,% i));" * 2% (1,1,3,0))
c.bind ( '<ปุ่ม-2>', r)
def L ():
 T.after (99 ลิตร)
 ถ้า r: return
 g = copy.deepcopy (ฉ)
 สำหรับ y ใน z (F):
	สำหรับ x in z (F):
	 n = 8
	 สำหรับ j in z (-1,2):
		สำหรับฉันใน z (-1,2):
		 ถ้าฉันหรือ j: n- = ไม่ใช่ g [(y + j)% F] [(x + i)% F]
	 ถ้า 1 <n <4:
		ถ้า n == 3 และไม่ใช่ g [y] [x]: p (x, y, 1)
	 อื่น ๆ : p (x, y, 0)
L ()
T.mainloop ()

และนี่คือรุ่นที่คุณสามารถลากเมาส์เพื่อวาด กราฟิกเป็นที่น่าพอใจมากขึ้น

from Tkinter import*
import copy
z=range
F=50
T=Tk()
S=9
f=[F*[0]for i in'7'*F]
c=Canvas(T,bg='white',width=S*F,height=S*F)
c.pack()
def p(x,y,a):f[y][x]=f[y][x]or c.create_rectangle(x*S,y*S,x*S+S,y*S+S,fill='gray')if a else c.delete(f[y][x])
r=1
def R(e):global r;r=1-r
exec("c.bind('<Button-%i>',lambda e:p(e.x/S,e.y/S,%i));c.bind('<B%i-Motion>',lambda e:p(e.x/S,e.y/S,%i));"*2%(1,1,1,1,3,0,3,0))
c.bind('<Button-2>',R)
def L():
 T.after(99,L)
 if r:return
 g=copy.deepcopy(f)
 for y in z(F):
  for x in z(F):
   n=8
   for j in z(-1,2):
    for i in z(-1,2):
     if i or j:n-=not g[(y+j)%F][(x+i)%F]
   if 1<n<4:
    if n==3and not g[y][x]:p(x,y,1)
   else:p(x,y,0)
L()
T.mainloop()

สิ่งนี้ไม่เป็นไปตามกฎของเกมแห่งชีวิตอย่างถูกต้อง
Steven Rumbalski

1
@StevenRumbalski: โอ้จริงเหรอ?
Oleh Prypin

2
จริงๆ. คุณมีข้อผิดพลาดในการเยื้องในรุ่นที่สองของคุณ ส่วนที่เริ่มต้นด้วยif 1<n<4:ควรมีการเยื้องในระดับเดียวกับfor j in z(-1,2):
Steven Rumbalski

2

Python 2, 456 ไบต์

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

Golf.py

import time,itertools as w,sys;t,q=map(lambda x:list(x[:-1]),sys.stdin.readlines()),list(w.product(range(-1,2),range(-1,2)));del q[4];n=map(lambda x:x[:],t[:])
while time.sleep(0.1)==None:
 for j in range(1,len(t)-1):
  for i in range(1,len(t[j])-1):x=sum(map(lambda s:1 if t[j+s[0]][i+s[1]]in'@'else 0,q));f=t[j][i];n[j][i]='@'if(f=='@'and(x==3 or x==2))or(f==' 'and x==3)else' '
 t=map(lambda x:x[:],n[:]);print'\n'.join(list(map(lambda x:''.join(x),t)))

Input.txt (จดบันทึกพื้นที่พิเศษในบรรทัดสุดท้าย)

+----------------------------------------+
|                    @                   |
|                     @                  |
|                   @@@                  |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
|                                        |
+----------------------------------------+ 

วิธีการวิ่ง

python Golf.py < input.txt

time.sleep(0.1)==None=> not time.sleep(.1), (f=='@'and(x==3 or x==2)) หรือ (f == '' และ x == 3) =>x==3or f=='@'and x==2
CalculatorFeline

^ คุณลืมหนึ่ง=>1 if 1if
Zacharý

2

การประมวลผล 270261 249 ไบต์

Grid เป็นหน้าจอ 100 * 100 พิกเซลอินพุตมาในรูปแบบของภาพ png

void setup(){image(loadImage("g.png"),0,0);}void draw(){loadPixels();int n,i=0,j,l=10000;int[]a=new int[l],p=pixels;for(;i<l;a[i]=n==5?-1<<24:n==6?p[i]:-1,i++)for(j=n=0;j<9;j++)n+=j!=4?p[(i+l-1+j%3+100*(j/3-1))%l]&1:0;arrayCopy(a,p);updatePixels();}

Ungolfed

void setup() {
  image(loadImage("g.png"), 0, 0);
}
void draw() {
  loadPixels();
  int c=100, i=0, n, l=c*c, b=color(0);
  int[]a=new int[l], p=pixels;
  for (; i<l; i++) {
    n=p[(i+l-101)%l]&1;
    n+=p[(i+l-100)%l]&1;
    n+=p[(i+l-99)%l]&1;
    n+=p[(i+l-1)%l]&1;
    n+=p[(i+1)%l]&1;
    n+=p[(i+99)%l]&1;
    n+=p[(i+100)%l]&1;
    n+=p[(i+101)%l]&1;
    a[i]=n==5?b:p[i]==b&&n==6?b:-1;
  }
  arrayCopy(a, pixels, l);
  updatePixels();
}

ภาพหน้าจอ


2

Lua + LÖVE / Love2D , 653 ไบต์

l=love f=math.floor t={}s=25 w=20 S=1 for i=1,w do t[i]={}for j=1,w do t[i][j]=0 end end e=0 F=function(f)loadstring("for i=1,#t do for j=1,#t[i]do "..f.." end end")()end function l.update(d)if S>0 then return end e=e+d if e>.2 then e=0 F("c=0 for a=-1,1 do for b=-1,1 do if not(a==0 and b==0)then c=c+(t[((i+a-1)%w)+1][((j+b-1)%w)+1]>0 and 1 or 0)end end end g=t[i][j]t[i][j]=(c==3 or(c==2 and g==1))and(g==1 and 5 or-1)or(g==1 and 4 or 0)")F("t[i][j]=t[i][j]%2")end end function l.draw()F("l.graphics.rectangle(t[i][j]==1 and'fill'or'line',i*s,j*s,s,s)")end function l.mousepressed(x,y)S=0 o,p=f(x/s),f(y/s)if t[o]and t[o][p]then t[o][p]=1 S=1 end end

หรือเว้นระยะ:

l=love
f=math.floor
t={}s=25
w=20
S=1
for i=1,w do
    t[i]={}
    for j=1,w do
        t[i][j]=0
    end
end
e=0
F=function(f)
    loadstring("for i=1,#t do for j=1,#t[i] do  "..f.." end end")()
end
function l.update(d)
    if S>0 then
        return
    end
    e=e+d
    if e>.2 then
        e=0
        F([[
        c=0
        for a=-1,1 do
            for b=-1,1 do
                if not(a==0 and b==0)then
                    c=c+(t[((i+a-1)%w)+1][((j+b-1)%w)+1]>0 and 1 or 0)
                end
            end
        end
        g=t[i][j]
        t[i][j]=(c==3 or(c==2 and g==1))and(g==1 and 5 or-1) or (g==1 and 4 or 0)]])
        F("t[i][j]=t[i][j]%2")
    end
end
function l.draw()
    F("l.graphics.rectangle(t[i][j]==1 and'fill'or'line',i*s,j*s,s,s)") end
function l.mousepressed(x,y)
    S=0
    o,p=f(x/s),f(y/s)
    if t[o]and t[o][p] then
        t[o][p]=1
        S=1
    end
end

คลิกที่ฟิลด์เพื่อเพิ่มเซลล์ที่มีชีวิต คลิกนอกเขตข้อมูลเพื่อเรียกใช้

ลองออนไลน์!

ป้อนคำอธิบายรูปภาพที่นี่


1

ป.ล. 529 515

เริ่มด้วยตัวอย่างจากRosetta รหัส เรียกใช้ด้วยอาร์กิวเมนต์ชื่อไฟล์ ( gs -- gol.ps pulsar) ไฟล์ที่มีเลขฐานสอง 20 * 20 (คั่นด้วยช่องว่าง) วงไม่สิ้นสุด: กระดานวาดรูปรอป้อนการคำนวณรุ่นต่อไป

[/f ARGUMENTS 0 get(r)file/n 20>>begin[/m
n 1 sub/b[n{[n{f token pop}repeat]}repeat]/c 400
n div/F{dup 0 lt{n add}if dup n ge{n sub}if}>>begin{0
1 m{dup 0 1 m{2 copy b exch get exch get 1 xor setgray
c mul exch c mul c c rectfill dup}for pop pop}for
showpage/b[0 1 m{/x exch def[0 1 m{/y exch def 0
y 1 sub 1 y 1 add{F dup x 1 sub 1 x
1 add{F b exch get exch get 3 2 roll add exch
dup}for pop pop}for b x get y get sub b x get y get
0 eq{3 eq{1}{0}ifelse}{dup 2 eq exch 3 eq
or{1}{0}ifelse}ifelse}for]}for]def}loop

เว้นระยะโดยมีข้อคิดเห็นสแต็กไม่กี่รายการ (เฉพาะที่ฉันต้องการ)

[
/f ARGUMENTS 0 get(r)file
/n 20
/sz 400
%/r{rand 2147483647 div}
>>begin
[
/m n 1 sub
/b[
%n{[n{r .15 le{1}{0}ifelse}repeat]}repeat
 n{[n{f token pop}repeat]}repeat
]
/c sz n div
/F{dup 0 lt{n add}if dup n ge{n sub}if}
>>begin
{
    0 1 m{dup % y y
    0 1 m{ % y y x
        2 copy b exch get exch get 1 xor setgray
        c mul exch c mul c c rectfill
        dup 
    }for pop pop}for
    pstack
    showpage
    /b[0 1 m{/x exch def
      [0 1 m{/y exch def
          0   
          y 1 sub 1 y 1 add{F dup %s y y
          x 1 sub 1 x 1 add{F %s y y x
              b exch get exch get %s y bxy
              3 2 roll add exch %s+bxy y
              dup %s y y
          }for pop pop}for
          b x get y get sub
          b x get y get
          0 eq{3 eq{1}{0}ifelse}{dup 2 eq exch 3 eq or{1}{0}ifelse}ifelse
      }for]
      }for]def
}loop

ไฟล์ข้อมูล pulsar:

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 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 0 0 0 0
0 0 0 0 0 1 1 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 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 1 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 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 1 0 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 0 0
0 0 0 0 0 1 1 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 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 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 0 0

1

JavaScript 676

ขออภัยกริฟฟินฉันไม่สามารถดูรหัสของคุณและไม่ได้เขียนมันซ้ำอีกเล็กน้อย ... ต้องกำจัดตัวละครสองตัว แต่มันก็คุ้มค่ามาก!

b=[];r=c=s=20;U=document;onload=function(){for(z=E=0;z<c;++z)for(b.push(t=[]),j=0;j<r;j++)with(U.body.appendChild(U.createElement("button")))t.push(0),id=z+"_"+j,style.position="absolute",style.left=s*j+"px",style.top=s*z+"px",onclick=a}; ondblclick=function(){A=E=E?clearInterval(A):setInterval(function(){Q=[];for(z=0;z<c;++z){R=[];for(j=0;j<r;)W=(c+z-1)%c,X=(c+z+1)%c,Y=(r+j-1)%r,Z=(r+j+1)%r,n=b[W][Y]+b[z][Y]+b[X][Y]+b[W][j]+b[X][j]+b[W][Z]+b[z][Z]+b[X][Z],R.push(b[z][j++]?4>n&&1<n:3==n);Q.push(R)}b=Q.slice();d()})};function a(e){E?0:P=e.target.id.split("_");b[P[0]][P[1]]^=1;d()}function d(){for(z=0;z<c;++z)for(j=0;j<r;)U.getElementById(z+"_"+j).innerHTML=b[z][j++]-0}

แต่อย่างที่พวกเขาพูดมันง่ายกว่าที่จะขอการให้อภัยมากกว่าการอนุญาต ... ;)


1

ระดับแปดเสียง (153)

เช่นเดียวกับ Matlab โดย DenDenDo ที่Shortest Game of Lifeแต่ต้องเปลี่ยน imshow เป็น imagesc:

b=uint8(rand(20)<0.2)
s=@(m)imfilter(m,[1 1 1;1 0 1;1 1 1],'circular')
p=@(m,n)uint8((n==3)|(m&(n==2)))
while 1
imagesc(b)
drawnow
b=p(b,s(b))
end

1

Python 2: 334 ไบต์

สายเพียง 6 ปี

import time
s='';s=map(list,iter(raw_input,s));k=len(s);l=(-1,0,1);n=int;z=range
while 1:
 r=[[0]*k for i in z(k)]
 for i in z(k*k):
  a,b=i//k,i%k
  m,g=sum([n(s[(a+c)%k][(b+d)%k])for c in l for d in l if c|d]),n(s[a][b])
  r[a][b]=n((m==2)&g or m==3)
  print'*'if r[a][b]else' ',
  if b-k+1==0:print
 s=r;time.sleep(.2);print"\033c"

คุณสามารถเรียกใช้เช่น:

python gol.py
0000000
0001000
0000100
0011100
0000000
0000000
0000000

ในกรณีที่ 0 และ 1 แทนเซลล์ที่ตายแล้วและเซลล์มีชีวิตขึ้นบรรทัดใหม่พิเศษในตอนท้ายจะเริ่มดำเนินการ

กริดต้องเป็นรูปสี่เหลี่ยมจัตุรัส

มันง่ายกว่าที่จะวิ่งกว่างูหลามที่สั้นที่สุดรองรับกริดทุกขนาดและดูสวยเมื่อวิ่ง

นอกจากนี้ยังมีขนาด 100 ไบต์ขึ้นไปดังนั้นจึงมี


0

PHP, 201 ไบต์ (ไม่ได้ทดสอบ)

for($s=file(f);print"\n";$s=$t)foreach($s as$y=>$r)for($x=-print"
";"
"<$c=$s[$y][++$x];print$t[$y][$x]=" X"[$n<4&$n>2-$a])for($n=-$a=$c>A,$i=$x-!!$x-1;$i++<=$x;)for($k=$y-2;$k++<=$y;)$n+=$s[$k][$i]>A;

-nrทำงานด้วย

ชำรุด

for($s=file(f);                         # import input from file "f"
    print"\n";                              # infinite loop: 1. print newline
    $s=$t)                                  # 3. copy target to source, next iteration
    foreach($s as$y=>$r)                    # 2. loop through lines
        for($x=-print"\n";"\n"<$c=$s[$y][++$x]; # print newline, loop $x/$c through line characters (before line break)
            print                                   # 5. print new cell
                $t[$y][$x]=" X"[$n>2-$a&$n<4])      # 4. new cell is alive if neighbour count<4 and >2 (>1 if alive)
            for($n=-                                # 2. init neighbour count: exclude self
                $a=$c>A,                            # 1. $a=cell is alife
                $i=$x-!!$x-1;$i++<=$x;)             # 3. loop $i from one left to one right of current position
                for($k=$y-2;$k++<=$y;)                  # loop $k from one above to one below current position
                    $n+=$s[$k][$i]>A;                       # increase neighbor count if neighbour is alife
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.