人生のゲームを3Dで実装する


17

課題は、人生のゲームの3Dでの最短の実装を見つけることです()。これらは規則です:

隣接するセルが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タグが最も短い実装を見つけることを暗示します。それがあなたが望むものであるかどうかを確認してください。また、コードゴルフには堅牢な仕様が不可欠であるため、入力方法、サイクル数、yes / noのアニメーション化に関する詳細も提供する必要があります。
ハワード14

@Howardいくつかの仕様を追加しました。はい、code-golfタグを忘れました;)それに感謝します。
イェンスレンダリング14

@PeterTaylorはい、正確に5、編集します。
イェンスレンダリング14

出力形式に関する詳細を追加します(たとえば、各セルは例のようにスペースで区切る必要があり、出力の各グリッドレイヤー間の1つの改行、生細胞と死細胞は異なる文字で表す必要があり、それらは目に見える文字でなければなりません。)また、コードゴルフとしてフレーム化されている場合、グラフィックシミュレーションを取得する可能性は低いことに注意してください。
ジョナサンヴァンマトレ14

そのメタスレッドで説明されているすべての抜け穴、または(不)承認基準(+5スコア、少なくとも投票数の少なくとも2倍の投票数)を満たすものだけを禁止するつもりでしたか?議論するためのかなり興味深い「抜け穴」を完全に考えることができると確信しているからです
; ;

回答:


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

そして、初期条件の束を試した後、次のようなものを得ました。

ここに画像の説明を入力してください

そして、これはのグリッドサイズを持つものです20x20x20。これには、シミュレーションとレンダリングに数秒かかりました。

ここに画像の説明を入力してください

ところで、これは周期的な境界条件を想定しています。


それらは本当に平衡状態に入っていますか、それともアニメーションが停止しているだけですか?かつての場合、あなたは私にいくつかのきちんとしたアイデアを...与えた
Kroltan

1
@Kroltanしばらく経ちましたが、彼らは平衡に達していると確信しています。
マーティンエンダー14年

1
よかった、ありがとう。均衡の個々のスライスは、たとえばルージュのようなゲームのように非常に部屋マップyに見えます。
Kroltan 14年

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は、元のマトリックスと同じ形状のマトリックスであり、各エレメントについて、自身を含む3×3×3近傍で生存しているセルの数をカウントします。次に:

           |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のランダム4×4×4行列を定義し、その第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とてもいい答えです!実際、境界は指定されていないため、ラップアラウンドが許可されています。
ジェンズレンダーズ14

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=- -シフトされたボードの合計から元のボード(つまり、隣接カウント)を引いた値が5に等しい各セルに1、その他すべてに0。
    • ]+. -元のボードと論理ORまたは上記。
    • (1&<*<&8) -1と8の間で比較される数値が排他的な場合は1、それ以外の場合は0。
    • (1&<*<&8)@-* -(上記のように)隣接カウントを比較し、これにより論理ORの結果を乗算します(つまり、ドメインが1または0のみの場合は論理AND)。

使用方法は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です。


Curse Jとその反則|.動詞!! よくやった。
トビア14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.