3D로 삶의 게임을 구현


17

도전은 3D로 인생 게임의 가장 짧은 구현을 찾는 것입니다 ( ). 규칙은 다음과 같습니다.

lonliness처럼 마치 이웃이 1 개 이하인 셀 (이 경우 큐브)은 죽습니다.
정확히 5 개의 세포가 빈 세포를 둘러싸면 번식하여 채 웁니다.
셀에 8 개 이상의 이웃이 있으면 과밀로 사망합니다.

레이어를 다음과 같이 개별적으로 출력하는 10x10x10 이상으로 만드십시오.

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

물론 그래픽 3D 시뮬레이션도 가능합니다
. 시작 위치는 하드 코딩 될 수 있지만 시작 위치로 변경되면 작동해야합니다. 모든 세대를 계산할 수 있어야하며 사용자는 다음 세대를 수동으로 요청할 수 있어야합니다.

문자가 가장 짧은 코드가 승리합니다!

나는 어떤 (큐브) 크기의이 내 자신의 구현을했다 : http://jensrenders.site88.net/life3D.htm 당신은 시험이 사용할 수 있으며, 나는 그것을 언급하지 않았지만 당신은 내에서 코드를 기반으로 할 수 있습니다 .


1
명령문에서 code-golf 태그를 암시하여 가장 짧은 구현을 찾으십시오 . 원하는지 확인하십시오. 또한 입력 방법, 사이클 수, 애니메이션 예 / 아니요 등에 대한 세부 정보도 제공해야합니다. 코드 골프는 강력한 사양을 갖추어야하기 때문입니다.
Howard

@Howard 나는 더 많은 사양을 추가했으며, 그래, 고맙습니다.
Jens Renders

@PeterTaylor 네, 정확히 5입니다. 편집하겠습니다.
Jens Renders

출력 형식에 대한 세부 사항을 추가합니다 (예 : 각 셀은 예제와 같이 공백으로 구분해야합니다. 출력의 각 그리드 레이어 사이에 줄 바꿈이 하나 있어야 함) .) 또한 코드 골프로 프레임을 구성하면 그래픽 시뮬레이션을 얻을 수 없을 것입니다.
Jonathan Van Matre

그 메타 스레드에서 논의 된 모든 허점 또는 (비) 승인 기준 (+5 점수, 적어도 공감 비는 공감 율의 두 배) 만 충족하는 것을 금지한다는 의미 입니까? 내가 논의 할 꽤 흥미로운 "
루프

답변:


14

Mathematica-120 바이트

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}},##]&

확실히 승리에 대한 경쟁자는 아니지만 그건 내 의도가 아니 었습니다. 또한 규칙 번호를 알아 내면 상당히 크게 줄어들 수 있습니다. 나는 실제로 시각화를 작성하고 싶었습니다 (실제로 톤이 이미 있다고 확신하지만). 그래서 우리는 간다)

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

그리고 초기 조건을 실험 한 결과 다음과 같은 것들이 생겼습니다.

여기에 이미지 설명을 입력하십시오

그리드 크기가 1입니다 20x20x20. 시뮬레이션하고 렌더링하는 데 몇 초가 걸렸습니다.

여기에 이미지 설명을 입력하십시오

그런데 이것은 주기적 경계 조건을 가정합니다.


사람들이 실제로 평형 상태에 진입합니까, 아니면 애니메이션이 멈추었습니까? 전자의 경우, 당신은 나에게 깔끔한 아이디어를 줬다면 ...
Kroltan

1
@Kroltan 그것은 오랜만이지만, 그들이 평형에 도달하고 있다고 확신합니다.
Martin Ender

1
감사합니다 평형의 개별 조각은 루즈와 같은 게임에 대해 매우 공간적으로 보입니다.
Kroltan

12

APL, 46

시간이 좀 걸렸지 만 46 자로 줄었습니다.

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

주어진 규칙에 따라 모든 크기의 부울 3D 행렬을 가져와 차세대를 계산하는 함수입니다. 경계 조건이 지정되지 않았으므로 토 로이드 공간에서와 같이 다른 쪽을 감싸기로 선택했습니다.

설명

{                           ⊂⍵}   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

중간 결과 m는 원래 행렬과 동일한 모양의 행렬로, 각 요소에 대해 3x3x3 이웃에 얼마나 많은 셀이 존재 하는지를 계산합니다 (자체 포함). 그때:

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

약 1/3의 셀 = 1 인 랜덤 4x4x4 매트릭스를 정의하고 1 세대 및 2 세대를 계산하십시오. ⊂[2 3]정면에 수직으로 대신에 수평 평면을 인쇄 단지 트릭 :

      ⊂[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 아주 좋은 답변입니다! 실제로 경계가 지정되지 않았으므로 랩 어라운드가 허용됩니다.
Jens Renders

9

J-42 자

우리는 3 차원 모두에서 토로 이달 보드를 둘러싼다고 가정합니다. J의 자동 결과 표시 1는 라이브 셀과 0데드를 사용하여 출력 사양을 따르는 것으로 보입니다 . 이 코드는 모든 폭, 길이 및 높이의 보드에서 작동합니다 (10x10x10, 4x5x6 등일 수 있음).

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

설명은 다음과 같습니다.

  • ,{3#<i:1 -셀과 모든 이웃에 대한 오프셋 목록의 하위 표현.
    • <i:1 -1과 -1 사이의 정수 목록.
    • ,{3#-목록 ( 3#)을 3 부 만들고 카티 전 곱 ( ,{)을 가져갑니다 .
  • (,{3#<i:1)|.&><-각 3D 오프셋 세트에 대해 배열을 이동합니다. 3 개 문자의 비용에서, 당신은 변경할 수 있습니다 |.&>|.!.0&>랩 어라운드하지에.
  • [:+/ -이동 된 모든 보드를 합산하십시오.
  • ((1&<*<&8)@-*]+.5=-)~-긴 바깥 동사는 갈고리로 왼쪽과 오른쪽에 보드를, 오른쪽에 우리는 이동하고 합산했습니다. 이 ~동사는이 동사를 교체합니다.
    • 5=- -쉬프트 보드 합에서 원래 보드를 뺀 (즉, 인접 수) 각 셀에서 1은 5이고 나머지는 0입니다.
    • ]+. -원래 보드와 논리 또는 위.
    • (1&<*<&8) -1과 8 사이의 숫자를 비교하는 경우 1, 그렇지 않으면 0
    • (1&<*<&8)@-* -이웃 카운트를 비교하고 (위와 같이) 도메인이 1 또는 0 일 때 논리 AND에 논리 OR 결과를 곱하십시오.

사용법은 APL과 마찬가지로 각 단계의 초기 보드에 기능을 적용하면됩니다. J는 ^:이것을 쉽게 할 수 있는 기능 파워 오퍼레이터 를 가지고있다.

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

?.프리미티브는 매번 고정 된 시드를 사용하여 재현 가능한 임의의 결과를 제공 하기 때문에 "랜덤"이라고 말합니다 . ?진정한 RNG입니다.


저주 J와 그 파동 |.동사 !! 잘 했어.
Tobia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.