จำลองรูปแบบเกม 1D-Life-ish


12

คำถามนี้มีแนวโน้มที่จะทบทวนรหัสและฉันคิดว่าคุณอาจชอบมันดัดแปลงเป็นความท้าทาย codegolf:

คุณได้รับรายชื่อบ้าน x ที่ไม่ว่างเปล่าซึ่งแสดงเป็นบูลีน ในแต่ละวันบ้านจะแข่งขันกับบ้านที่อยู่ติดกัน 1 หมายถึงบ้าน "ใช้งานอยู่" และ 0 หมายถึงบ้าน "ไม่ทำงาน" หากเพื่อนบ้านทั้งสองด้านของบ้านที่ระบุนั้นเป็นทั้งที่ทำงานอยู่หรือไม่ได้ใช้งานทั้งคู่บ้านนั้นจะไม่ทำงานในวันถัดไป มิฉะนั้นมันจะเปิดใช้งาน

def get_state_as_pos(thelist, pos):
    if thelist[pos-1] == thelist[pos+1]:
        return 0
    else:
        return 1

ตัวอย่างเช่นหากเรามีกลุ่มเพื่อนบ้าน [0, 1, 0] ดังนั้นบ้านที่ [1] จะกลายเป็น 0 เนื่องจากทั้งบ้านไปทางซ้ายและขวาไม่ได้ใช้งานทั้งคู่ เซลล์ที่ปลายทั้งสองตรวจสอบด้านตรงข้ามเช่นกันดังนั้นเพื่อนบ้านที่ดัชนี 0 จะอยู่ที่ดัชนีlength-1และ indexn1 และในทางกลับกัน แม้หลังจากอัพเดตเซลล์คุณต้องพิจารณาสถานะก่อนหน้าเมื่อทำการอัพเดตเซลล์อื่นเพื่อให้ข้อมูลสถานะของแต่ละเซลล์ถูกอัพเดตพร้อมกัน

ฟังก์ชั่นใช้อาร์เรย์ของรัฐและจำนวนของขั้นตอนและควรส่งออกสถานะของบ้านหลังจากจำนวนขั้นตอนที่กำหนด

    input: states = [1, 0, 0, 0, 0, 1, 0, 0], steps = 1
   output should be [0, 1, 0, 0, 1, 0, 1, 1]

    input: states = [1, 1, 1, 0, 1, 1, 1, 1], steps = 2
intermediate state= [0, 0, 1, 0, 1, 0, 0, 0]
   output should be [0, 1, 0, 0, 0, 1, 0, 0]


    input: states = [1], steps=1
    output: states= [0]

ใช้รายการและขั้นตอนที่ แต่คุณชอบและเอาท์พุทรายการผลลัพธ์ผ่านเริ่มต้นของ I / O ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม นี่คือ codegolf คำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


8
+1 สำหรับ Cellular Automata นี่ไม่ใช่กฎข้อ 90 ใช่มั้ย
HighlyRadioactive

2
ผลการทดสอบครั้งแรกไม่ควร[0, 1, 0, 0, 1, 0, 1, 1]ใช่หรือไม่
TFeld

4
@jaaq ฉันหมายถึงกฎพื้นฐานของเซลลูล่าร์เซลลูล่าร์ (ของการแปลงระหว่างแต่ละขั้นตอนหรือรุ่น) # 90 พิมพ์ "กฎ 90" ใน Wolfram | Alpha
HighlyRadioactive

12
การส่งออกผ่านทางรายการผลลัพธ์ STDOUT : จะขอแนะนำให้เพียงแค่พึ่งพาของเราวิธีการเริ่มต้นของ I / O
Arnauld

5
@ Jaaq ไม่ใช่เรื่องบังเอิญเพราะมีกฎ # สำหรับทุกมาตรฐาน 1D Cellular Automata นี่เป็นเพราะ 3 บิตมี 8 สถานะที่เป็นไปได้ (เพื่อนบ้านด้านซ้ายตัวเองเพื่อนบ้านขวา) และถ้าคุณบอกว่าสำหรับแต่ละรัฐบ้านที่กำหนดจะเปิดหรือปิดนั่นคือ 8 ค่าจริง / เท็จซึ่งเกิดขึ้นกับแผนที่อย่างสมบูรณ์แบบเป็นไบต์ ดังนั้นกฎ # 0-255 สามารถใช้เป็นชวเลขและอธิบายชุดของกฎเหล่านี้ได้โดยใช้นิพจน์ไบนารีเป็นสถานะเปิด / ปิดของบ้านในแต่ละสถานการณ์ 8 สถานการณ์ตามตำแหน่งในไบต์ กฎบางข้อได้รับการพิจารณาว่ามีความโดดเด่นเช่น 90 ดังนั้นการรับรู้ :)
Lunin

คำตอบ:


8

05AB1E , 14 13 10 9 6 ไบต์

ขึ้นอยู่กับโซลูชัน Japt ของ Shaggy

F©Á®À^

ลองออนไลน์!

F                  # repeat n times:
 ©Á                #  the list, rotated right
   ®À              #  the list, rotated left
     ^             #  xor (vectorizes)

โซลูชัน 9 ไบต์ที่ชาญฉลาดโดยไม่จำเป็น:

F¥DO.øü+É

ลองออนไลน์!

F                  # repeat n times:
                   #  (examples given for the initial state [0, 1, 1, 0, 1])
 ¥                 #  deltas of the list ([1, 0, -1, 1])
  D                #  duplicate
   O               #  sum (1)
    .ø             #  surround ([1, 1, 0, -1, 1, 1])
      ü+           #  pairwise addition ([2, 1, -1, 0, 2])
        É          #  modulo 2 ([0, 1, 1, 0, 0])




2

Japt -mh , 11 10 9 ไบต์

I / O ของอเมริกาเป็นอาร์เรย์ 2D เดี่ยว

VÇí^Zé2)é

ลองมัน

VÇí^Zé2)é     :Implicit input of integer U=steps & array V=[states]
VÇ            :Modify the last element Z in V
  í           :Interleave with
    Zé2       :  Z rotated right twice and
   ^          :  Reduce each pair by XOR
       )      :End interleave
        é     :Rotate right once
              :Repeat U times and implicitly output V

2

เรติน่า 51 ไบต์

1A`
"$+"{`(.).*(.)
$2$&$1
(.)(?=.(\1|(.)))?
$#2*$#3

ลองออนไลน์! รับจำนวนขั้นตอนในบรรทัดแรกและสตริงของ0s และ1s ในบรรทัดที่สอง คำอธิบาย:

1A`

ลบจำนวนขั้นตอนจากอินพุต

"$+"{

ทำซ้ำจำนวนนั้น

`(.).*(.)
$2$&$1

คัดลอกตัวเลขจุดสิ้นสุดไปยังปลายอีกด้านเพื่อจำลองการตัดคำ

(.)(?=.(\1|(.)))?
$#2*$#3

ดำเนินการกับ XOR


2

APL (Dyalog Extended) , 12 ไบต์SBCS

โปรแกรมเต็มรูปแบบ พร้อมต์ stdin สำหรับอาร์เรย์ของอเมริกาจากนั้นตามจำนวนขั้นตอน พิมพ์ไปยัง stdout

1(⌽≠⌽⍢⌽)⍣⎕⊢⎕

ลองออนไลน์!

รับอินพุตที่ประเมินจากคอนโซล (อาร์เรย์ของสถานะ)

 เมื่อนั้นให้ใช้ ...

1()⍣⎕ ฟังก์ชัน tacit ต่อไปนี้ป้อนจำนวนครั้งแต่ละครั้งด้วย1อาร์กิวเมนต์ซ้าย:

⌽⍢⌽ หมุนอาร์กิวเมนต์ที่ถูกต้อง 1 ก้าวไปทางซ้ายขณะที่กลับด้าน (เช่นหมุนหนึ่งก้าวขวา)

⌽≠ XOR ที่มีอาร์กิวเมนต์หมุนไปทางซ้าย 1 ขั้น





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