Thực hiện trò chơi cuộc sống dưới dạng 3D


17

Thách thức là tìm ra cách thực hiện ngắn nhất của trò chơi cuộc sống trong 3D ( ví dụ ). Đây là các quy tắc:

Các tế bào (trong trường hợp này là các hình khối) chỉ có 1 hoặc ít hơn hàng xóm chết, như thể cô đơn.
Nếu chính xác 5 ô bao quanh một ô trống, chúng sinh sản và lấp đầy nó.
Nếu một tế bào có 8 hàng xóm trở lên, nó sẽ chết vì quá đông.

Làm cho nó ít nhất là 10 x10x10, trong đó các lớp được xuất ra riêng lẻ như thế này:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 X 0 0 X 0 0 0 0 0
0 0 X X X 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Tất nhiên, một mô phỏng 3D đồ họa cũng được chấp nhận
Vị trí bắt đầu có thể được mã hóa cứng nhưng nó phải hoạt động nếu nó được thay đổi thành bất kỳ vị trí bắt đầu nào. Nó phải có khả năng tính toán bất kỳ số lượng thế hệ nào và người dùng phải có thể yêu cầu thủ công cho thế hệ tiếp theo.

Mã ngắn nhất trong các nhân vật chiến thắng!

Tôi đã tự thực hiện việc này cho bất kỳ kích thước (khối) nào: http://jensrenders.site88.net/life3D.htm Bạn có thể sử dụng điều này để kiểm tra và bạn có thể dựa vào mã của mình, mặc dù tôi không nhận xét về nó .


1
Áp dụng thẻ golf mã từ tuyên bố của bạn tìm cách thực hiện ngắn nhất . Vui lòng kiểm tra nếu đó là những gì bạn muốn. Bạn cũng nên cung cấp một số chi tiết về cách nhập, bao nhiêu chu kỳ, hoạt hình có / không, ... bởi vì điều cần thiết đối với môn đánh gôn là có một đặc điểm kỹ thuật mạnh mẽ.
Howard

@Howard Tôi đã thêm một số thông số kỹ thuật, và vâng, quên thẻ code-golf;) cảm ơn vì điều đó.
Jens Riders

@PeterTaylor Có chính xác 5, tôi sẽ chỉnh sửa nó.
Jens Riders

Tôi sẽ thêm các chi tiết cụ thể về định dạng đầu ra (ví dụ: mỗi ô phải được phân tách bằng khoảng trắng như trong ví dụ của bạn, một dòng mới giữa mỗi lớp lưới của đầu ra, các ô sống và các ô chết phải được biểu thị bằng các ký tự khác nhau và các ô đó phải là các ký tự hiển thị .) Ngoài ra, hãy nhớ rằng nếu đóng khung như mã golf, bạn không có khả năng có được mô phỏng đồ họa.
Jonathan Van Matre

Bạn có thực sự muốn cấm tất cả các sơ hở được thảo luận trong chuỗi meta đó hay chỉ những người đáp ứng tiêu chí phê duyệt (dis) (điểm +5, ít nhất gấp đôi số lần upvote so với downvote)? Bởi vì tôi chắc chắn rằng tôi hoàn toàn có thể nghĩ ra một số "lỗ hổng" khá thú vị để thảo luận ... ;-)
Ilmari Karonen

Câu trả lời:


14

Toán học - 120 byte

g=CellularAutomaton[{(l=Flatten@#;c=l[[14]];n=Total@Drop[l,{14}];Which[n<2||n>7,0,n==5||c==1,1,0<1,0])&,{},{1,1,1}},##]&

Chắc chắn không phải là một ứng cử viên cho chiến thắng, nhưng đó không phải là ý định của tôi. Ngoài ra, điều này có thể có thể được đánh xuống đáng kể bằng cách chỉ ra số quy tắc. Tôi thực sự muốn viết một hình ảnh trực quan (mặc dù tôi thực sự chắc chắn rằng đã có hàng tấn ngoài đó). Vì vậy, ở đây chúng tôi đi):

animateGol3d[size_, i_, n_] := 
  ListAnimate[
    Graphics3D[
      Cuboid /@ Position[#, 1], 
      PlotRange -> {{0, size}, {0, size}, {0, size}} + 1
    ] & /@ g[i, n]
  ];

Và sau khi thử nghiệm với một loạt các điều kiện ban đầu, tôi đã nhận được những thứ như sau:

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

Và đây là một với kích thước lưới 20x20x20. Điều này mất vài giây để mô phỏng và kết xuất:

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

Nhân tiện, điều này giả định điều kiện biên định kỳ.


Là những người thực sự bước vào trạng thái cân bằng, hay đó chỉ là hoạt hình dừng lại? Nếu trước đây, bạn đã cho tôi một số ý tưởng gọn gàng ...
Kroltan

1
@Kroltan Đã được một thời gian, nhưng tôi khá chắc chắn rằng họ đã đạt đến trạng thái cân bằng.
Martin Ender

1
Tốt đẹp, cảm ơn. Các lát cắt của trạng thái cân bằng trông rất giống bản đồ phòng, có thể nói, một trò chơi khó khăn.
Kroltan

12

APL, 46

Phải mất một thời gian, nhưng tôi đã giảm xuống còn 46 ký tự:

{(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵}

Đây là một hàm lấy ma trận 3D boolean có kích thước bất kỳ và tính toán thế hệ tiếp theo, theo các quy tắc đã cho. Điều kiện biên không được chỉ định, vì vậy tôi chọn cách quấn quanh phía bên kia, như trong không gian hình xuyến.

Giải trình

{                           ⊂⍵}   Take the argument matrix and enclose it in a scalar
               (i←2-⍳3)           Prepare an array with values -1 0 1 and call it i
                       ⌽[2]¨      Shift the matrix along the 2nd dim. by each of -1 0 1
           i∘.⊖                   Then for each result do the same along the 1st dimension
       i∘.⌽                       And for each result again along the 3rd dimension
 m←⊃+/,                           Sum element-wise all 27 shifted matrices and call it m

Kết quả trung gian mlà một ma trận có hình dạng giống như ma trận gốc, tính cho mỗi phần tử có bao nhiêu ô còn sống trong vùng lân cận 3 × 3 × 3 của nó, bao gồm cả chính nó. Sau đó:

           |5.5-m   For each element (x) in m, take its distance from 5.5
       ⍵∧3>         If that distance is <3 (which means 3≤x≤8) and the original cell was 1,
 (5=m)∨             or if the element of m is 5, then the next generation cell will be 1.

Thí dụ

Xác định ma trận 4 × 4 × 4 ngẫu nhiên với khoảng 1/3 ô = 1 và tính toán thế hệ 1 và 2 của nó. Ở ⊂[2 3]phía trước chỉ là một mẹo để in các mặt phẳng theo chiều ngang thay vì theo chiều dọc:

      ⊂[2 3] m←1=?4 4 4⍴3
 1 0 0 0  1 0 1 0  1 0 1 0  0 0 0 1 
 1 1 0 0  0 0 0 0  0 0 0 1  1 0 1 0 
 0 0 0 0  0 1 0 0  0 0 0 0  0 0 1 0 
 1 1 0 0  0 0 0 1  1 0 0 1  0 0 1 0 
      ⊂[2 3] {(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵} m
 0 0 0 0  0 0 1 0  1 0 1 0  0 0 0 0 
 1 0 0 0  0 0 1 0  0 0 0 0  1 0 1 0 
 0 0 0 0  0 1 0 0  0 0 0 0  0 0 1 0 
 1 1 0 0  0 0 0 0  1 0 0 0  0 0 1 0 
      ⊂[2 3] {(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵}⍣2⊢ m
 0 0 1 0  1 0 1 0  1 0 1 0  0 0 0 0 
 1 0 1 0  0 0 1 1  0 0 0 0  1 0 1 0 
 1 0 0 0  1 1 0 0  0 0 1 0  1 0 1 0 
 1 1 1 0  1 0 0 1  1 0 1 0  0 0 1 0 

+1 câu trả lời rất hay! và thực tế, ranh giới đã không được chỉ định vì vậy bao bọc xung quanh được cho phép.
Jens Riders

9

J - 42 char

Chúng tôi đang giả định một bảng hình xuyến (bao quanh) trong cả ba chiều. Hiển thị kết quả tự động của J dường như tuân theo thông số kỹ thuật đầu ra, sử dụng 1cho các ô sống và 0chết. Mã này hoạt động trên các bảng có chiều rộng, chiều dài và chiều cao bất kỳ (có thể là 10x10x10, 4x5x6, v.v.).

(((1&<*<&8)@-*]+.5=-)~[:+/(,{3#<i:1)|.&><)

Một lời giải thích sau:

  • ,{3#<i:1 - Subexpression của danh sách các offset cho các tế bào và tất cả các hàng xóm của nó.
    • <i:1 - Danh sách các số nguyên nằm trong khoảng từ 1 đến -1.
    • ,{3#- Tạo ba bản sao của danh sách ( 3#) và lấy sản phẩm của Cartesian ( ,{).
  • (,{3#<i:1)|.&><- Đối với mỗi bộ bù 3D, hãy dịch chuyển mảng. Với chi phí 3 ký tự, bạn có thể thay đổi |.&>để |.!.0&>không có bọc xung quanh.
  • [:+/ - Tổng hợp tất cả các bảng dịch chuyển với nhau.
  • ((1&<*<&8)@-*]+.5=-)~- Động từ dài bên ngoài là một cái móc để nó nhận bảng ở bên trái và bên phải, và bên phải chúng tôi đã thay đổi và tóm tắt. Các ~hoán đổi này xung quanh cho động từ bên trong này.
    • 5=- - 1 trong mỗi ô mà các bảng tổng thay đổi trừ đi bảng gốc (tức là số hàng xóm) bằng 5 và 0 trong tất cả các ô khác.
    • ]+. - Hợp lý HOẶC ở trên với bảng gốc.
    • (1&<*<&8) - 1 nếu số được so sánh giữa 1 và 8 độc quyền, 0 khác.
    • (1&<*<&8)@-* - So sánh (như trên) số hàng xóm và nhân (tức là logic VÀ khi miền chỉ có 1 hoặc 0) kết quả HOẶC logic bằng cách này.

Cách sử dụng cũng như với APL, chỉ cần áp dụng chức năng cho bảng ban đầu cho mỗi bước. J có một toán tử năng lượng chức năng ^:để làm điều này dễ dàng.

   life =: (((1&<*<&8)@-*]+.5=-)~[:+/(,{3#<i:1)|.&><)  NB. for convenience
   board =: 1 = ?. 4 4 4 $ 4  NB. "random" 4x4x4 board with approx 1/4 ones
   <"2 board  NB. we box each 2D plane for easier viewing
+-------+-------+-------+-------+
|0 0 0 0|1 1 0 0|0 1 0 0|0 0 1 0|
|0 1 0 0|0 0 0 0|0 0 0 1|1 0 0 0|
|0 0 0 0|0 0 1 0|0 1 0 0|0 0 0 1|
|1 1 0 0|1 0 0 0|0 0 0 1|0 1 1 0|
+-------+-------+-------+-------+
   <"2 life board
+-------+-------+-------+-------+
|0 0 0 0|0 1 0 1|0 1 0 0|0 0 1 0|
|1 1 1 1|0 0 0 0|0 0 0 1|1 1 0 0|
|0 0 0 0|0 0 1 1|0 1 0 0|0 0 0 1|
|1 0 0 0|1 0 0 1|0 0 0 1|0 1 1 1|
+-------+-------+-------+-------+
   <"2 life^:2 board  NB. two steps
+-------+-------+-------+-------+
|0 0 0 0|0 1 0 0|0 1 0 0|0 0 0 0|
|0 1 0 0|0 0 0 0|0 0 0 1|0 1 0 0|
|0 0 0 0|0 0 0 0|0 1 0 0|0 0 0 0|
|0 0 0 0|0 0 0 1|0 0 0 0|0 1 1 1|
+-------+-------+-------+-------+
   <"2 life^:3 board  NB. etc
+-------+-------+-------+-------+
|0 1 0 0|1 1 1 0|0 1 0 0|0 1 0 0|
|0 1 0 0|1 0 1 0|1 0 1 0|1 1 1 0|
|1 0 0 0|0 0 0 0|0 1 0 0|0 1 0 0|
|0 0 1 0|0 0 0 0|0 1 0 0|0 1 1 0|
+-------+-------+-------+-------+

Tôi nói "ngẫu nhiên" bởi vì người ?.nguyên thủy cho kết quả ngẫu nhiên có thể lặp lại bằng cách sử dụng hạt giống cố định mỗi lần. ?là RNG thực sự.


Lời nguyền J và |.động từ hôi của nó !! Làm tốt lắm.
Tobia
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.