Trò chơi ngắn nhất của cuộc sống


59

Trò chơi cuộc sống của Conway là ví dụ kinh điển về tự động hóa tế bào. Các tế bào tạo thành một lưới vuông và mỗi có hai trạng thái: sống hoặc chết. Trên mỗi lượt, mỗi ô cập nhật đồng thời theo trạng thái của nó và của tám ô lân cận:

  • Một tế bào sống vẫn còn sống nếu nó có chính xác hai hoặc ba hàng xóm sống
  • Một tế bào chết trở nên sống động nếu nó có chính xác ba hàng xóm sống

Nhiệm vụ của bạn, nếu bạn chọn chấp nhận nó, là viết mã triển khai Trò chơi Cuộc sống ngắn nhất bằng ngôn ngữ yêu thích của bạn.

Những quy định:

  • Lưới phải có kích thước tối thiểu 20x20
  • Lưới phải quấn quanh (vì vậy lưới giống như bề mặt của Torus)
  • Việc triển khai của bạn phải cho phép người dùng nhập các mẫu bắt đầu của riêng họ
  • GoL là một chút vô nghĩa nếu bạn không thể nhìn thấy những gì đang xảy ra, do đó phải có đầu ra trực quan của máy tự động đang chạy, với mỗi kết quả được hiển thị đủ lâu để được nhìn thấy!

8
Trước đây về Stack Overflow: Code Golf: Conway's Game of Life , và hãy chắc chắn xem liên kết triển khai APL trong các bình luận.
dmckee

1
À, tôi không thấy điều đó. Nhưng điều này hơi khác một chút (tiết kiệm cho tôi xóa công việc đặt thử thách cùng nhau?
Griffin

6
Không vấn đề gì. Nhiều câu đố đã chạy trên Stack Overflow cũng đã được thực hiện ở đây, nhưng mọi người sẽ nói với bạn rằng tôi bị ám ảnh về việc liên kết với các thử thách tương tự.
dmckee

@Griffin: Bạn có thể xóa tất cả những cái đó ;trước }s. Cũng varcó thể loại bỏ s (đôi khi nó không phá vỡ mã của bạn). Và đối với một dòng for, ifv.v., bạn có thể loại bỏ { }hoàn toàn : for(...) for(...) dosomething().
pimvdb

@pimvdb, chúc mừng, tôi chưa chơi golf đầy đủ, chưa có thời gian. chỉ muốn chứng tỏ rằng tôi cũng đã đi, hơn là nhàn rỗi đặt ra một thử thách. Sẽ golf nó đến tối đa sớm.
Griffin

Câu trả lời:


27

Canvas Canvas với JavaScript, 940 639 586 519 ký tự

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

Tôi luôn muốn làm một cái gì đó với canvas, vì vậy đây là nỗ lực của tôi (phiên bản gốc trực tuyến ). Bạn có thể chuyển đổi các ô bằng cách nhấp (cũng có thể trong chế độ chạy).

Bây giờ bạn cũng có thể thử phiên bản mới tại đây .

Thật không may, có một vấn đề tôi không thể giải quyết được. Phiên bản trực tuyến dài hơn 11 ký tự vì jsFiddle đặt một nút văn bản ngay trước khung vẽ (tại sao?) Và do đó, khung vẽ không còn là con đầu tiên.

Chỉnh sửa 1: Rất nhiều tối ưu hóa và tái cấu trúc.

Chỉnh sửa 2: Một số thay đổi nhỏ hơn.

Chỉnh sửa 3: Nội tuyến khối kịch bản hoàn chỉnh cộng với các thay đổi nhỏ.


Đẹp, nhưng thay đổi độ trễ khoảng để 1làm cho nó nhanh như của tôi chứ không phải là bước chậm. Ngoài ra nếu bạn muốn thực hiện vẽ (thay vì nhấp vào từng ô vuông), bạn có thể làm tròn vị trí chuột đến kích thước khối gần nhất và điền vào hình chữ nhật tại điểm đó. Nhiều nhân vật hơn nhưng nhiều điểm hơn.
Griffin

Bạn có thể thay thế new Array('#FFF','#800')bằng ['#FFF','#800'].
Lowjacker

Mặc dù nói rằng về vẽ, siêu golf của tôi không cho phép vẽ và xấu như tội lỗi. Haha. Bạn có thể đặt hai màu của mình trong smảng thành tanredvì chúng là hai màu có biểu diễn ngắn nhất - giúp bạn tiết kiệm hai ký tự. Ngoài ra, nếu có thể, hãy đặt phiên bản theo nghĩa đen jvào khoảng. Tôi chắc chắn có nhiều hơn để vắt kiệt quá.
Griffin

@Griffin và Lowjacker: cảm ơn bạn rất nhiều. Tôi cũng khá chắc chắn rằng bạn có thể chơi golf này nhiều hơn nữa (và đã có một số ý tưởng). Thật không may, tôi đã không tìm thấy thời gian để làm như vậy. Một phiên bản golf tốt hơn sẽ diễn ra vào ngày mai - Tôi hy vọng ...
Howard

2
Bạn có thể loại bỏ các thẻ html và body. Nó sẽ hoạt động tương tự
arodebaugh

32

Python, 219 ký tự

Tôi đã đi chơi golf tối đa, với giao diện vừa đủ để đáp ứng câu hỏi.

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)

Bạn chạy nó như thế này:

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

Các số trong danh sách đại diện cho tọa độ của các ô bắt đầu. Hàng đầu tiên là 0-19, hàng thứ hai là 20-39, v.v.

Chạy nó trong một thiết bị đầu cuối với 21 hàng và nó trông khá hấp dẫn.


1
Điều này hoàn toàn nên đã giành chiến thắng. Tôi đoán "sự dễ dàng của đầu vào" có trọng số khá cao.
primo

@primo Tôi thậm chí còn đi xa hơn để đề nghị mma nên có một cuộc thi riêng.
kẻ lừa đảo rủ rê

2
Vậy đây là Life of Py?
Christopher Wirt

Bạn luôn có thể lưu thêm một char ... 2-(p in P)== 2-({p}<P). Nhưng sau đó, bạn sẽ phải thay đổi đầu vào của mình thành {8,29,47,48,49}:)
JBernardo

21

TI-BASIC, 96 byte (87 cho mục không cạnh tranh)

Đối với máy tính vẽ đồ thị sê-ri TI-84 của bạn (!). Đây là một thách thức khá, bởi vì không có cách nào dễ dàng để viết một thói quen đồ họa đệm (chắc chắn không có gì được xây dựng trong), và màn hình đồ thị có lệnh chỉ có bốn đồ họa liên quan: Pxl-On(), Pxl-Off(), Pxl-Change(), và pxl-Test().

Sử dụng mọi pixel có thể truy cập trên màn hình và kết thúc chính xác. Mỗi ô là một pixel và chương trình cập nhật từng dòng theo chiều ngang sang phải trên màn hình. Bởi vì các máy tính chỉ có bộ xử lý z80 15 MHz và BASIC là ngôn ngữ được giải thích chậm, mã chỉ nhận được một khung hình cứ sau năm phút.

Đầu vào của người dùng rất dễ dàng: trước khi chạy chương trình, hãy sử dụng công cụ Pen để vẽ hình của bạn trên màn hình đồ thị.

Chuyển thể từ mục nhập của tôi đến một cuộc thi golf mã tại diễn đàn máy tính 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

Phiên bản Omnimaga (87 byte)

Mã này có một tính năng bổ sung: nó phát hiện nếu nó được chạy lần đầu tiên và nếu ngẫu nhiên hóa trạng thái màn hình. Trong các lần chạy tiếp theo, nó sẽ tự động tiếp tục mô phỏng nếu dừng sau khi khung hình kết thúc. Tuy nhiên, nó không phải là một mục cạnh tranh vì nó không bao bọc màn hình; các ô ở viền ngoài sẽ luôn bị coi là chết nếu màn hình đồ thị bị xóa trước.

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

Phiên bản này có lẽ là mã được chơi nhiều nhất tôi từng viết và chứa một số tối ưu hóa khó chịu thực sự khó chịu:

  • Tôi sử dụng trạng thái đồng hồ như một lá cờ. Khi bắt đầu chương trình, đồng hồ ngày / giờ được bật và tôi sử dụng giá trị của cờ isClockOn toàn cầu để xác định xem đó có phải là lần lặp đầu tiên hay không. Sau khi khung đầu tiên được vẽ, tôi tắt đồng hồ. Lưu một byte qua phương thức khác ngắn nhất và khoảng bốn byte so với phương thức rõ ràng.

  • Tôi lưu trữ trạng thái của ba cột bên cạnh cột được cập nhật trong một mảng gồm 63 phần tử gồm các số cơ sở 7. Vị trí của 49 giữ cột bên phải, vị trí 7 giữ cột giữa và vị trí đơn vị giữ cột bên trái - 1 cho ô sống và 0 cho ô chết. Sau đó, tôi lấy phần mod 6 còn lại của tổng số ba số xung quanh ô được sửa đổi để tìm tổng số ô lân cận còn sống (nó giống như cách chia của 9 trò lừa trong cơ sở 7, phần còn lại của mod 6 bằng tổng của các chữ số). Tự lưu khoảng 10 byte và tạo cơ hội sử dụng hai tối ưu hóa tiếp theo. Sơ đồ ví dụ (giả sử có một tàu lượn tập trung tại một cột nhất định tại 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
    ...
    

    Tế bào trung tâm sẽ chết, bởi vì nó được bao quanh bởi chính xác năm tế bào sống.

  • Sau khi mỗi hàng được hoàn thành, các số trong mảng được cập nhật bằng cách chia các số hiện có cho 7, loại bỏ phần thập phân và thêm 49 lần giá trị của các ô trong cột mới. Việc lưu trữ tất cả ba cột mỗi lần sẽ chậm hơn và kém thanh lịch hơn, mất ít nhất 20 byte và sử dụng ba danh sách thay vì một danh sách, bởi vì các giá trị của các ô trong mỗi hàng phải được lưu trữ trước khi các ô được cập nhật. Đây là cách nhỏ nhất để lưu trữ các vị trí di động.

  • Đoạn mã int(3fPart(3cosh(đưa ra 1khi đầu vào bằng 3/6, 2khi nó bằng 4/6 và 0khi nó bằng 0, 1/6, 2/6 hoặc 5/6. Tiết kiệm khoảng 6 byte.


19

Toán học - 333

Đặc trưng:

  • Giao diện tương tác: nhấp vào các ô để tạo mẫu của bạn

  • Lưới đẹp

  • Nút: CHẠY, PAUSE, RAR RÀNG

Mã dưới đây.

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"}}]

nhập mô tả hình ảnh ở đây

Nếu bạn muốn cảm nhận cách thức hoạt động của nó, ví dụ thứ 2 trong blog này chỉ là một phiên bản phức tạp hơn (phân tích Fourier trực tiếp, giao diện tốt hơn) của mã ở trên. Ví dụ sẽ chạy ngay trong trình duyệt của bạn sau khi tải xuống plugin miễn phí.


2
+1, một trong những tốt đẹp để có một đi. Vâng, đó là vấn đề với trang web này, có hàng tấn câu hỏi cũ mà một người có xu hướng bỏ lỡ.
Griffin

@Griffin cảm ơn vì đã chú ý đến nó;)
Vitaliy Kaurov

15

C 1063 ký tự

Như một thách thức, tôi đã làm điều này trong C bằng cách sử dụng API Windows không thân thiện với golf cho IO thời gian thực. Nếu capslock được bật, mô phỏng sẽ chạy. Nó sẽ đứng yên nếu capslock tắt. Vẽ các mẫu bằng chuột; nhấp chuột trái sẽ hồi sinh các ô và nhấp chuột phải giết chết các ô.

#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 được biên dịch có thể được tìm thấy ở đây

Chỉnh sửa: Tôi đã nhận xét lên nguồn. Nó có sẵn ở đây


Tôi muốn thấy một phiên bản bình luận về điều này!
luser droog

1
Chắc chắn, nếu tôi có thể nhớ những gì tôi đã nghĩ ... = p
Kaslai

1
@luserdroog Đây là pastebin.com/BrX6wgUj
Kaslai

Điều này thật tuyệt vời.
rayryeng - Phục hồi lại

12

J (39 ký tự)

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

Dựa trên phiên bản APL này (cùng thuật toán, tích chập hình xuyến).

Ví dụ sử dụng:

   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

Toán học, 123 ký tự

Một triển khai rất thô sơ không sử dụng hàm CellularAutomaton tích hợp của Mathistica.

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)

EDIT : 314 ký tự và sửa lỗi với các ô thừa xuất hiện ở lần lặp đầu tiên. Giảm kích thước lưới thành 56 vì thói quen màu chỉ nhìn vào 8 bit thấp nhất.

EDIT : Được giảm xuống còn 325 ký tự. Chiều rộng / chiều cao của lưới hiện là 28 vì 28 * 9 là lớn nhất bạn có thể có trong khi vẫn sử dụng giá trị làm màu nền. Nó cũng chỉ xử lý một sự kiện SDL trên mỗi lần lặp, điều này hoàn toàn làm mờ vòng lặp bên trong. Tôi nghĩ khá chặt chẽ!

Mô phỏng bắt đầu tạm dừng, với tất cả các tế bào chết. Bạn có thể nhấn bất kỳ phím nào để chuyển đổi tạm dừng / bỏ tạm dừng và nhấp vào bất kỳ ô nào để chuyển đổi giữa sống và chết. Chạy một vòng lặp cứ sau một phần mười giây.

Các gói là một chút wonky.

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}

Trông như thế này:

Ảnh chụp màn hình của ứng dụng đang hoạt động

Thử thách thú vị! Tôi hoan nghênh bất kỳ cải tiến bất cứ ai có thể nhìn thấy.


Rất cố gắng nhưng tôi có thể thấy ngay rằng bạn đã sai. Bạn không thể có một mô hình như thế trong GoL. Có một quy tắc khác: en.wikipedia.org/wiki/Conway%27s_Game_of_Life#Rules
Griffin

@Griffin Tôi nghĩ rằng ảnh chụp màn hình đã được chụp sau khi tạm dừng và chuyển đổi một số ô theo cách thủ công - mặc dù vậy, tôi sẽ kiểm tra lại các quy tắc. Cảm ơn!
Paul Prestidge

7
@Griffin không thể mô hình hạt giống trong bất kỳ cấu hình có thể?
ardew

7

Scala, 1181 1158 1128 1063 1018 1003 999 992 987 ký tự

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

Ung dung:

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

Phần lớn hơn của mã ở đây là công cụ GUI GUI. Bản thân trò chơi nằm trong actionPerformedphương thức được kích hoạt bởi Timerchức năng trợ giúp nvà tính toán hàng xóm.

Sử dụng:

Biên dịch nó với scalac filenamevà sau đó chạy nó với scala L.
Nhấp vào hình vuông sẽ lật nó từ sống sang chết và tùy chọn menu bắt đầu và dừng trò chơi. Nếu bạn muốn thay đổi kích thước của lưới, hãy thay đổi ba giá trị đầu tiên trong dòng: var(w,h,c,d,r)=(20,20,20,0,false)chúng lần lượt là chiều rộng, chiều cao và kích thước ô (tính bằng pixel).


Tôi đã tìm thấy 2 cải tiến chơi gôn: import java.awt.event._contents+=m("Go",true)+=m("Stop",false)}}, dẫn đến 1093 ký tự.
người dùng không xác định

@user chưa biết Cảm ơn. Tôi đã tìm thấy một vài cải tiến bản thân - xuống đến 1063 bây giờ.
Gareth

Chết tiệt, bạn đang bận rộn. Giữ nó lên! Tôi sẽ kiểm tra câu trả lời khi có thêm một vài người đăng chúng.
Griffin

7

Bash thuần túy, 244 byte

Hoạt động trên vũ trụ 36x24 được bao bọc hình xuyến:

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"

Vì đây là tập lệnh shell, nên phương thức nhập phù hợp với các lệnh shell khác - tức là từ stdin:

$ ./conway.sh << EOF

   O 
    O 
  OOO 

EOF


  O O                                                       
   OO                                                       
   O                                                        

















    O                                                       
  O O                                                       
   OO                                                       

... Vân vân

Chúng tôi có thể chuyển hướng đầu vào từ bất kỳ nguồn văn bản nào, được dẫn qua trbộ lọc để có được các thế hệ ban đầu thú vị, ví dụ:

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

6

JavaScript, 130

Không hoàn toàn đáp ứng với thử thách, nhưng đối với hồ sơ, đây là một công cụ Trò chơi Cuộc sống với 130 byte được tạo bởi Subzey và tôi vào năm 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}

Điều này dường như có một số vấn đề với hàng đầu tiên. Ví dụ: cài đặt @@\n@@(2 x 2 vuông ở góc trên cùng bên trái) hoặc .@\n.@\n.@. (1 cột 3)
Annan

5

C # - 675 ký tự

Tôi đã luôn muốn viết một phiên bản của chương trình này. Không bao giờ biết rằng nó sẽ chỉ mất nửa giờ lười biếng cho một phiên bản nhanh và bẩn. (Tất nhiên là chơi golf mất nhiều thời gian hơn.)

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

Sử dụng

  • Nhập một mẫu bắt đầu bằng cách nhấp vào các ô để bật chúng (còn sống).
  • Bắt đầu trò chơi bằng cách nhấn bất kỳ phím bàn phím.
  • Trò chơi chạy trong 99 thế hệ mỗi lần nhấn phím (tôi có thể thực hiện 9 lần để lưu char, nhưng điều đó dường như quá khập khiễng).

Thỏa hiệp chơi gôn

  • Bạn chỉ có thể bật các ô bằng chuột, không tắt, vì vậy nếu bạn mắc lỗi, bạn phải khởi động lại chương trình.
  • Không có đường lưới, nhưng điều đó không ảnh hưởng quá nhiều đến khả năng chơi.
  • Tốc độ cập nhật tỷ lệ thuận với tốc độ CPU, vì vậy trên các máy tính rất nhanh, nó có thể sẽ chỉ là một vệt mờ.
  • Các tế bào sống có màu đỏ vì "đen" sử dụng thêm 2 ký tự.
  • Sự nhỏ bé của các tế bào và thực tế là chúng không sử dụng hết tất cả không gian biểu mẫu cũng là những thỏa hiệp tiết kiệm ký tự.

5

GW-BASIC, 1086 1035 byte (mã thông báo)

Ở dạng mã thông báo, đây là 1035 byte. (Tất nhiên, biểu mẫu ASCII dài hơn một chút.) Bạn nhận được biểu mẫu mã thông báo bằng cách sử dụng SAVE"lifelệnh mà không cần nối thêm ",atrong trình thông dịch.

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

Đây là phiên bản được chơi golf tối đa, nhưng vẫn có tính năng: khi bắt đầu, bạn có một trình chỉnh sửa, trong đó bạn có thể di chuyển bằng các phím con trỏ; không gian bật / tắt vi khuẩn trên trường hiện tại, cxóa màn hình, Quay lại bắt đầu chế độ trò chơi.

Dưới đây là một phiên bản ít bị xáo trộn, cũng đặt một bảng trò chơi ban đầu với hai cấu trúc (một thứ xoay vòng và một tàu lượn):

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

Tôi đã viết nó trong 15 phút trong khi buồn chán và chờ đợi một người bạn, người đang chơi golf với người học việc của anh ấy trong trò chơi Cuộc sống của Conway cùng một lúc.

Nó hoạt động như thế này: Nó ngay lập tức sử dụng bộ đệm màn hình chế độ văn bản 80x25 (thay đổi tên ban đầu DEF SEGđể sử dụng &hB000nếu bạn sử dụng thẻ đồ họa Hercules; các cài đặt này hoạt động với Qemu và (chậm hơn) dosbox). Một dấu hoa thị *là một vi khuẩn.

Nó hoạt động hai lần: đầu tiên, nơi sinh được đánh dấu +và cái chết đánh dấu mục tiêu của nó .. Trong lần thứ hai, +.được thay thế bằng *, tương ứng.

Vấn đề TIMERlà làm cho nó chờ nửa giây sau mỗi vòng, trong trường hợp máy chủ Qemu của bạn rất nhanh

Tôi không hy vọng cho một mức giá chiến thắng ngắn nhất ở đây nhưng cho một sự mát mẻ, đặc biệt là xem xét thiết lập bảng ban đầu. Tôi cũng đã có một phiên bản trong đó công cụ trò chơi được thay thế bằng mã lắp ráp, trong trường hợp bạn quan tâm


Xem xét bạn tăng nhãn của bạn lên 1 trên phiên bản không chơi gôn, liệu có thể làm điều tương tự trên phiên bản golf không? (ví dụ 1, 2, 3, vv) Hoặc làm số dòng không đếm?
Zacharý

số dòng, khi được mã hóa, được tính là từ (16 bit), nếu tôi không hoàn toàn nhầm lẫn
mirabilos

Được rồi, đoán xem tôi đã nghĩ về một số phương ngữ BASIC khác rồi.
Zacharý

@ Zacharý Nhấp vào định dạng chương trình mã thông báo mã hóa GW-BASIC, sau đó vào định dạng chương trình ở đây để thấy rằng, thực sự, số dòng liên tục là hai byte và để biết thêm chi tiết về định dạng mã thông báo.
mirabilos

5

Toán học, 115 byte

Đây là một cách dễ dàng để giải quyết vấn đề này:

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

1
Mathematica vẫn ổn, nhưng theo quy định, chương trình phải cho phép người dùng nhập các mẫu riêng của họ. Quy tắc này là có chủ ý vì một vài ngôn ngữ cho phép triển khai ngắn như thế này nhưng không có tương tác người dùng. Chắc chắn bạn có thể đặt mảng của riêng mình vào đó, nhưng nó sẽ không thắng.
Griffin

"đầu vào" trong Mathicala chủ yếu thông qua giao diện máy tính xách tay, vì vậy tôi không nghĩ "tương tác người dùng" là thực sự có thể. Bạn chỉ cần thay thế đối số RandomInteger thành hàm CellularAutomaton bằng bất cứ điều gì bạn muốn và đánh giá lại mã.
JeremyKun

3
Tương tác người dùng là có thể. Phương pháp đơn giản nhất mà tôi có thể nghĩ ra ngay bây giờ là một loạt các nút. Cho nó đi một người đàn ông.
Griffin

4

Java (OpenJDK 8) - 400 388 367 byte

Chỉnh sửa lần thứ hai và (có lẽ): Được quản lý để chơi thêm 21 byte sau khi tìm thấy các mỏ vàng (imo) này - chắc chắn khuyên mọi người mới nên đọc chúng (đặc biệt là nếu bạn sẽ thử một số thử thách này bằng Java).

Mã kết quả (có thể sẽ kết thúc việc chơi golf thậm chí nhiều hơn nếu tôi tìm ra cách rút ngắn những vòng lặp lồng nhau đó cho các vòng lặp ...):

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

Hãy thử trực tuyến!

(Bài gốc bắt đầu từ đây.)

Tôi thực sự đã nghĩ đến một lúc rằng tôi sẽ có thể ít nhất thách thức câu trả lời Python tốt nhất với kiến ​​thức về Java (có thể bị hạn chế) của tôi ... Đó là một thử thách mà tôi vẫn thích tham gia (mặc dù đã tham gia bữa tiệc có lẽ chỉ là một muộn một chút ...)

Thực sự không có gì nhiều - giải thích cơ bản như sau (chưa được giải thích):

/*
 * 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

(thêm thông tin về các câu lệnh lambda trong Java 8 tại đây )

Vâng, có một cách bắt với cách tiếp cận của tôi.

Như hầu hết các bạn có thể nhận thấy, mã golf của tôi như hiện tại sẽ tồn tại mãi mãi. Để ngăn chặn điều này, một bộ đếm có thể được giới thiệu ở trên cùng và được sử dụng trong vòng lặp while để chỉ hiển thị n(trong trường hợp này là 5) các lần lặp như sau (chú ý bbiến mới được thêm vào):

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

Ngoài ra, một vài điểm đáng nói. Chương trình này không kiểm tra xem đầu vào có đúng không và do đó, sẽ thất bại với (rất có thể) một ArrayOutOfBoundsException; như vậy, đảm bảo kiểm tra xem đầu vào có hợp lệ không bằng cách điền hoàn toàn vào một phần của mảng (mảng bị lệch sẽ ném ngoại lệ được đề cập ở trên). Ngoài ra, bảng như hiện tại trông có vẻ 'lỏng' - nghĩa là, không có sự tách biệt giữa thế hệ này và thế hệ tiếp theo. Nếu bạn muốn thêm điều đó vào để kiểm tra kỹ xem các thế hệ được sản xuất có thực sự hợp lệ hay không, System.out.println();cần phải thêm một thông tin bổ sung ngay trước đó for(int[]t:u)Arrays.fill(t,0);(xem phần này Hãy thử trực tuyến! Để rõ ràng). Và cuối cùng, nhưng không kém phần quan trọng, cho rằng đây là mã golf đầu tiên của tôi, mọi phản hồi đều được đánh giá cao :)

Mã cũ từ câu trả lời 388 byte trước đó:

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

Và từ câu trả lời 400 byte ban đầu:

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

Bài đăng đầu tiên tuyệt vời, chào mừng bạn đến với PPCG!
Zacharý

Cảm ơn, tôi chắc chắn sẽ làm nhiều hơn những thứ này - chúng rất vui :)
NotBaal

Tham gia với chúng tôi, chúng tôi có Dennis. Ngoài ra, đây không phải là một chương trình hoàn chỉnh cũng không phải là một chức năng, mà nó cần phải là, IIRC.
Zacharý

Oh phải quên phần 'chương trình': P Chỉnh sửa nó trong một lát.
Không phải

Nó chỉ có thể là một chức năng quá.
Zacharý

4

Stt , 6 byte

Không ngôn ngữ yêu thích của tôi, nhưng nó ngắn ...

4 byte mã cộng với các cờ nlist và Torus.

3me

Hãy thử trực tuyến!

Là ...
3 3
 thành viên của
m các m oore-khu-count với tự hoặc
e đồng hoang e -neighbourhood-count mà không tự
...?


3

Scala - 799 ký tự

Chạy như một kịch bản. Một con chuột nhấp vào một hình vuông bật hoặc tắt nó và bất kỳ phím nào bắt đầu hoặc dừng tạo.

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

Tôi nghĩ tôi sẽ thử J. Nó chưa được chơi golf tốt lắm, nhưng tôi sẽ thử lại sớm.

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

Thí dụ:

   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

Gia công 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);}

Tôi tin rằng điều này đáp ứng tất cả các yêu cầu.

Ung dung:

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

Tôi chưa cài đặt Matlab ngay bây giờ để kiểm tra nó, tôi chỉ đánh golf mã mà tôi đã viết vài năm trước.
Ung dung:

%% 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
  • Boardsize là mã hóa cứng nhưng có thể là bất cứ điều gì
  • bao bọc xung quanh
  • đối với đầu vào của người dùng, người ta có thể thay đổi bảng inital bằng cách mã hóa ma trận khác hoặc sử dụng trình chỉnh sửa biến. Không đẹp, nhưng nó hoạt động
  • 20 ký tự có thể được lưu nếu đầu ra đồ họa bị bỏ qua, bảng vẫn sẽ được in dưới dạng văn bản ở mỗi lần lặp. Các ô một pixel thay đổi mỗi mili giây dù sao cũng không hữu ích lắm

hoạt động trong R2014a, vừa được thử nghiệm
masterX244

3

Perl, 218 216 211 202 byte

$,=$/;$~=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}

(Không có dòng mới ở cuối mã này.)

Đọc mẫu bắt đầu từ đầu vào tiêu chuẩn, dưới dạng tệp văn bản nơi các ô sống được biểu diễn dưới dạng 1, các ô chết được biểu thị dưới dạng khoảng trắng, các dòng được phân tách bằng một dòng mới. Đầu vào không được có các ký tự khác. Các dòng có thể có chiều dài thay đổi và sẽ được đệm hoặc cắt ngắn để chính xác rộng 79. Ví dụ đầu vào là súng lượn:

                                  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

Khi chương trình chạy Game of Life, mọi trạng thái được chuyển sang đầu ra tiêu chuẩn ở định dạng tương tự như đầu vào, sau đó trì hoãn 0,1 giây. Có thể tùy chỉnh độ trễ bằng cách thay đổi đối số thứ tư của cuộc gọi chọn.

Bảng trò chơi được mã hóa cứng với kích thước 79x23. Nó được bọc trong một hình xuyến: nếu bạn để bảng ở phía dưới, bạn kết thúc ở trên cùng; nếu bạn rời khỏi bên phải, bạn kết thúc ở bên trái nhưng chuyển một hàng xuống.

Đây là phiên bản thay thế không đọc bất kỳ đầu vào nào và bắt đầu từ một bảng ngẫu nhiên:

$,=$/;$/=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}

Mã này có nguồn gốc từ một trò chơi perluscated của chương trình cuộc sống perl tôi đã viết cách đây nhiều năm . Tôi đã thay đổi nó rất nhiều để làm cho bảng hình xuyến và chơi mã.

Đây có lẽ không phải là phương pháp ngắn nhất để thực hiện Game of Life theo perl, nhưng nó là một trong những phương pháp ít dễ hiểu hơn.

Bảng được lưu trữ $bdưới dạng một chuỗi '1'' ', một cho mỗi ô, chỉ toàn bộ được lặp lại ít nhất ba lần. Cuộc gọi giải nén thứ ba trích xuất 17 giá trị cho mỗi ô: có một cho chính ô đó và hai cho mỗi ô trong số tám ô lân cận, theo thứ tự tùy ý và mỗi giá trị là '1'hoặc một chuỗi trống. Ô nên được sống trong lần lặp tiếp theo nếu số lượng '1'giá trị trong số 17 giá trị này là 5, 6 hoặc 7. Lệnh gọi gói thứ ba nối 17 giá trị này với trường rộng 18 ký tự được căn trái và được đệm bằng các byte nul ở bên phải . Cuộc gọi giải nén thứ hai có trường rộng 18 như vậy, gửi nhân vật ở vị trí 7, giải nén khoảng trống từ vị trí 17 nếu đó là một'1'hoặc giải nén nhân vật khỏi vị trí 4 nếu không. Kết quả này chính xác là giá trị mà tế bào nên có trong thế hệ tiếp theo.


2

Python, 589 byte

Các nút chuột: trái - đặt một ô, phải - xóa một ô, giữa - bắt đầu / dừng.

từ nhập Tkinter *
nhập bản sao
z = phạm vi
F = 50
T = Tk ()
S = 9
f = [F * [0] cho tôi trong'7 '* F]
c = Canvas (T, width = S * F, height = S * F)
c.pack ()
def p (x, y, a): f [y] [x] = f [y] [x] hoặc c.create_oval (x * S, y * S, x * S + S, y * S + S) nếu một c.delete khác (f [y] [x])
r = 1
def R (e): toàn cầu r; r = 1-r
exec ("c.bind ('<Nút-% i>', lambda e: p (ex / S, ey / S,% i));" * 2% (1,1,3,0))
c.bind ('<Nút-2>', R)
def L ():
 Sau đó (99, L)
 nếu r: trở lại
 g = copy.deepcopy (f)
 cho y trong z (F):
	cho x trong z (F):
	 n = 8
	 cho j trong z (-1,2):
		cho i trong z (-1,2):
		 nếu tôi hoặc j: n- = không g [(y + j)% F] [(x + i)% F]
	 nếu 1 <n <4:
		nếu n == 3 và không phải g [y] [x]: p (x, y, 1)
	 khác: p (x, y, 0)
L ()
T.mainloop ()

Và đây là phiên bản mà bạn có thể kéo chuột để vẽ. Đồ họa dễ chịu hơn một chút.

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()

Điều này không tuân theo chính xác các quy tắc cuộc sống.
Steven Rumbalski

1
@StevenRumbalski: Ồ vậy sao?
Oleh Prypin

2
có thật không. Bạn có một lỗi thụt trong phiên bản thứ hai của bạn. Phần bắt đầu bằng if 1<n<4:nên được thụt lề ở cùng cấp độ vớifor j in z(-1,2):
Steven Rumbalski

2

Python 2, 456 byte

Mặc dù tôi biết đây là một bài viết cũ, tôi không thể tự giúp mình chụp nó. Bảng ban đầu có thể là bất kỳ kích thước nào miễn là bạn vẽ một đường viền xung quanh nó và có thêm một khoảng trống trên dòng cuối cùng.

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 (lưu ý khoảng trống thừa trên dòng cuối cùng)

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

Cách chạy

python Golf.py < input.txt

time.sleep(0.1)==None=> not time.sleep(.1), (f=='@'and(x==3 or x==2)) hoặc (f == '' và x == 3) =>x==3or f=='@'and x==2
Máy

^, Bạn đã quên một, 1 if=> 1if.
Zacharý

2

Chế biến 270.261 249 byte

Lưới là màn hình 100 * 100 pixel, đầu vào xuất hiện dưới dạng hình ảnh 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();}

Ung dung

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

ảnh chụp màn hình


2

Lua + LÖVE / Love2D , 653 byte

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

hoặc cách nhau:

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

Bấm vào trường để thêm các tế bào sống. Nhấp vào bên ngoài trường để chạy nó.

Hãy thử trực tuyến!

nhập mô tả hình ảnh ở đây


1

Bản thảo 529 515

Bắt đầu với ví dụ từ Rosetta Code . Gọi với một đối số tên tệp ( gs -- gol.ps pulsar), tệp chứa 20 * 20 số nhị phân (cách nhau bởi khoảng trắng). Vòng lặp vô hạn: vẽ bảng, chờ nhập, tính toán thế hệ tiếp theo.

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

Khoảng cách, với một vài bình luận ngăn xếp (chỉ những bình luận tôi cần).

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

tập tin dữ liệu xung:

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

Xin lỗi Griffin, tôi không thể nhìn vào mã của bạn và không viết lại nó một chút ... phải cạo sạch hai ký tự nhưng nó thật đáng giá!

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}

Nhưng như họ nói, việc xin tha thứ sẽ dễ hơn là cho phép ...;)


1

Octave (153)

giống như Matlab của DenDenDo tại Trò chơi cuộc sống ngắn nhất , nhưng phải thay đổi hình ảnh thành hình ảnh:

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 byte

Chỉ trễ 6 năm.

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"

Bạn có thể chạy nó như sau:

python gol.py
0000000
0001000
0000100
0011100
0000000
0000000
0000000

Trong đó 0 và 1 đại diện cho các ô chết và sống, một dòng mới bổ sung ở cuối sẽ bắt đầu thực thi.

Lưới phải vuông.

Nó dễ chạy hơn con trăn ngắn nhất, hỗ trợ mọi lưới có kích thước và trông rất đẹp khi chạy.

Nó cũng hơn 100 byte, vì vậy có.


0

PHP, 201 byte (không được kiểm tra)

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;

Chạy với -nr.

phá vỡ

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.