ใช้เกมแห่งชีวิตในแบบ 3 มิติ


17

ความท้าทายคือการค้นหาการใช้งานที่สั้นที่สุดของเกมแห่งชีวิตในรูปแบบ 3 มิติ ( ตัวอย่าง ) นี่คือกฎ:

เซลล์ (ในกรณีนี้คือลูกบาศก์) ที่มีเพื่อนบ้านเพียง 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

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

รหัสที่สั้นที่สุดในตัวละครชนะ!

ฉันใช้สิ่งนี้เองสำหรับขนาด (คิวบ์): http://jensrenders.site88.net/life3D.htm คุณสามารถใช้สิ่งนี้เพื่อทดสอบและคุณสามารถใช้รหัสของคุณกับฉันได้แม้ว่าฉันจะไม่ได้แสดงความคิดเห็นก็ตาม .


1
โดยนัยแท็กรหัสกอล์ฟจากงบของคุณพบว่าการดำเนินงานที่สั้นที่สุด กรุณาตรวจสอบว่ามันเป็นสิ่งที่คุณต้องการ คุณควรให้รายละเอียดบางอย่างเกี่ยวกับวิธีการป้อนข้อมูลจำนวนรอบภาพเคลื่อนไหวใช่ / ไม่ใช่ ... เนื่องจากเป็นสิ่งจำเป็นสำหรับโค้ดกอล์ฟที่จะมีสเปคที่แข็งแกร่ง
Howard

@Howard ฉันเพิ่มข้อกำหนดเพิ่มเติมและใช่ลืมแท็ก code-golf;) ขอบคุณสำหรับสิ่งนั้น
Jens Renders

@PeterTaylor ใช่ 5 อย่างแน่นอนฉันจะแก้ไขมัน
Jens Renders

ฉันจะเพิ่มเฉพาะเกี่ยวกับรูปแบบผลลัพธ์ (เช่นแต่ละเซลล์จะต้องคั่นด้วยช่องว่างในตัวอย่างของคุณหนึ่งบรรทัดใหม่ระหว่างแต่ละชั้นของตารางผลลัพธ์เซลล์ที่มีชีวิตและตายจะต้องแสดงด้วยอักขระที่แตกต่างกันและสิ่งเหล่านั้นต้องเป็นอักขระที่มองเห็นได้ .) โปรดจำไว้ว่าหากกรอบเป็น code-golf คุณไม่น่าจะได้รับแบบจำลองกราฟิก
Jonathan Van Matre

คุณหมายถึงการห้ามช่องโหว่ทั้งหมดที่กล่าวถึงในเมตาดาต้านั้นจริงหรือเฉพาะที่ตรงตามเกณฑ์การอนุมัติ (dis) (+5 คะแนนอย่างน้อยสองเท่าของ upvotes มากเช่น downvotes) เพราะผมมั่นใจว่าผมสามารถทั้งหมดคิดว่าของบางอย่างที่น่าสนใจสวย "ช่องโหว่" เพื่อหารือเกี่ยวกับ ... ;-)
Ilmari Karonen

คำตอบ:


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 ไม่นานมานี้ แต่ฉันค่อนข้างมั่นใจว่าพวกเขาถึงจุดสมดุล
Martin Ender

1
ขอบคุณมาก แต่ละชิ้นส่วนของสมดุลดูแผนที่ห้อง -y สำหรับการพูดเกม rougelike
Kroltan

12

APL, 46

ฉันใช้เวลาพอสมควร แต่ฉันลงไปถึง 46 ตัวอักษร:

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

นี่คือฟังก์ชั่นที่ใช้เมทริกซ์บูลีน 3 มิติในทุกขนาดและคำนวณรุ่นต่อไปตามกฎที่กำหนด ไม่ได้ระบุเงื่อนไขขอบเขตดังนั้นฉันเลือกที่จะล้อมรอบอีกด้านหนึ่งเหมือนกับในพื้นที่วงแหวน

คำอธิบาย

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

ตัวอย่าง

กำหนดเมทริกซ์แบบสุ่ม 4 × 4 × 4 ที่มีเซลล์ประมาณ 1/3 เซลล์ = 1 และคำนวณรุ่นที่ 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 ตัวอักษร

เราคาดว่าบอร์ด toroidal (ล้อมรอบ) ในทั้งสามมิติ การแสดงผลอัตโนมัติของ J จะปรากฏขึ้นตามสเป็คเอาท์พุทโดยใช้1สำหรับเซลล์ที่มีชีวิตและ0ตาย รหัสนี้ใช้ได้กับบอร์ดที่มีความกว้างความยาวและความสูง (สามารถเป็น 10x10x10, 4x5x6 และอื่น ๆ )

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

คำอธิบายดังนี้:

  • ,{3#<i:1 - คำสั่งย่อยของรายการออฟเซ็ตสำหรับเซลล์และเพื่อนบ้านทั้งหมด
    • <i:1 - รายการจำนวนเต็มตั้งแต่ 1 ถึง -1
    • ,{3#- ทำรายการสามชุด ( 3#) และนำผลิตภัณฑ์คาร์ทีเซียน ( ,{)
  • (,{3#<i:1)|.&><- สำหรับออฟเซ็ต 3D แต่ละชุดให้เลื่อนอาร์เรย์ ค่าใช้จ่ายของ 3 ตัวอักษรที่คุณสามารถเปลี่ยน|.&>เพื่อ|.!.0&>ที่จะได้ไม่ต้องตัดรอบ
  • [:+/ - รวมบอร์ดที่เลื่อนทั้งหมดเข้าด้วยกัน
  • ((1&<*<&8)@-*]+.5=-)~- กริยาด้านนอกที่ยาวเป็นตะขอดังนั้นมันจึงได้รับแผ่นไม้ด้านซ้ายและด้านขวาและด้านข้างทางด้านขวาที่เราขยับและรวมเข้าด้วยกัน การ~แลกเปลี่ยนนี้สำหรับคำกริยาภายในนี้
    • 5=- - 1 ในแต่ละเซลล์ที่ผลรวมของการเปลี่ยนแปลงบอร์ดลบบอร์ดต้นฉบับ (เช่นจำนวนเพื่อนบ้าน) เท่ากับ 5 และ 0 ในอื่น ๆ ทั้งหมด
    • ]+. - เหตุผลหรือข้างต้นกับคณะกรรมการเดิม
    • (1&<*<&8) - 1 ถ้าจำนวนถูกเปรียบเทียบระหว่าง 1 ถึง 8 พิเศษ, 0 เป็นอย่างอื่น
    • (1&<*<&8)@-* - เปรียบเทียบ (ดังกล่าวข้างต้น) จำนวนเพื่อนบ้านและคูณ (เช่นตรรกะและเมื่อโดเมนมีเพียง 1 หรือ 0) ตรรกะหรือผลลัพธ์จากสิ่งนี้

การใช้งานเหมือนกับ 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 และ|.คำกริยาที่น่ารังเกียจของมัน!! ทำได้ดีมาก
Tobia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.