Simulasikan Model Game-of-Life-ish 1D

12

Pertanyaan ini baru saja tren pada ulasan kode dan saya pikir Anda mungkin suka itu diadaptasi sebagai tantangan codegolf:

Anda diberi daftar x rumah kosong yang direpresentasikan sebagai boolean. Setiap hari, rumah-rumah bersaing dengan yang berdekatan. 1 mewakili rumah "aktif" dan 0 mewakili rumah "tidak aktif". Jika tetangga di kedua sisi rumah yang diberikan keduanya aktif atau keduanya tidak aktif, maka rumah itu menjadi tidak aktif pada hari berikutnya. Kalau tidak, ia menjadi aktif.

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

Misalnya, jika kita memiliki sekelompok tetangga [0, 1, 0] maka rumah di [1] akan menjadi 0 karena kedua rumah di kiri dan kanan keduanya tidak aktif. Sel-sel di kedua ujungnya memeriksa sisi yang berlawanan juga, sehingga tetangga pada indeks 0 berada pada indeks length-1dan indexn1 dan sebaliknya. Bahkan setelah memperbarui sel, Anda harus mempertimbangkan status sebelumnya ketika memperbarui yang lain sehingga informasi status setiap sel diperbarui secara bersamaan.

Fungsi ini mengambil array status dan sejumlah langkah dan harus menampilkan status rumah setelah jumlah langkah yang diberikan.

    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]

Ambil daftar dan langkah sesuka Anda dan hasilkan daftar yang dihasilkan melalui I / O default . Celah standar dilarang. Ini codegolf, jawaban terpendek dalam byte menang!

jaaq
sumber
8
+1 untuk Cellular Automata. Bukankah Aturan 90 ini?
HighlyRadioactive
2
Bukankah seharusnya hasil uji kasus pertama [0, 1, 0, 0, 1, 0, 1, 1]?
TFeld
4
@jaaq Saya mengacu pada Aturan Dasar Seluler Automata (transformasi antara setiap langkah, atau generasi) # 90. Ketik "Aturan 90" dalam Wolfram | Alpha.
HighlyRadioactive
12
mengeluarkan daftar yang dihasilkan melalui STDOUT : sangat disarankan untuk hanya mengandalkan metode I / O standar kami .
Arnauld
5
@jaaq Tidak terlalu kebetulan karena ada Aturan # untuk setiap 1D Cellular Automata standar. Ini karena 3 bit memiliki 8 status yang mungkin (tetangga kiri, diri sendiri, tetangga kanan) dan jika Anda mengatakan untuk masing-masing status tersebut sebuah rumah akan dihidupkan atau dimatikan itu 8 nilai benar / salah yang terjadi untuk memetakan dengan sempurna ke byte. Jadi Aturan # 0-255 dapat digunakan sebagai singkatan untuk menggambarkan salah satu dari aturan ini dengan mengambil ekspresi biner sebagai keadaan on / off rumah yang dihasilkan di masing-masing dari 8 situasi berdasarkan posisi dalam byte. Beberapa aturan dianggap penting seperti 90, sehingga pengakuan :)
Lunin

Jawaban:

8

05AB1E , 14 13 10 9 6 byte

Berdasarkan solusi Jag Shaggy

F©Á®À^

Cobalah online!

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

Solusi 9 byte yang tidak perlu pintar:

F¥DO.øü+É

Cobalah online!

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])
Grimmy
sumber
5

Python 2 , 72 byte

f=lambda s,n:n and f([a^b for a,b in zip(s[-1:]+s,s[1:]+s[:1])],n-1)or s

Cobalah online!

TFeld
sumber
2

JavaScript (ES6), 57 byte

Mengambil input sebagai (steps)(array).

s=>g=a=>s--?g(a.map(_=>a[~-i++%l]^a[i%l],i=l=a.length)):a

Cobalah online!

Arnauld
sumber
2

Japt -mh , 11 10 9 byte

I / O negara sebagai array 2D tunggal.

VÇí^Zé2)é

Cobalah

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
Shaggy
sumber
2

Retina , 51 byte

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

Cobalah online! Mengambil jumlah langkah pada baris pertama dan string 0s dan 1s pada baris kedua. Penjelasan:

1A`

Hapus jumlah langkah dari input.

"$+"{

Ulangi angka itu beberapa kali.

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

Salin digit ujung ke ujung lainnya untuk mensimulasikan pembungkus.

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

Lakukan operasi XOR.

Neil
sumber
2

APL (Dyalog Extended) , 12 byte SBCS

Program lengkap. Meminta stdin untuk array status dan kemudian untuk sejumlah langkah. Mencetak ke stdout.

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

Cobalah online!

mendapatkan input yang dievaluasi dari konsol (array of States)

 untuk itu, terapkan ...

1(... )⍣⎕ fungsi diam-diam berikut, masukkan jumlah kali, setiap kali dengan 1argumen kiri:

⌽⍢⌽ putar argumen kanan 1 langkah ke kiri saat dibalik (mis. putar satu langkah ke kanan)

⌽≠ XOR dengan argumen diputar 1 langkah ke kiri

Adm
sumber
2

Python 2 , 71 byte

f=lambda a,n:n and f([a[i-1]^(a+a)[i+1]for i in range(len(a))],n-1)or a

Cobalah online!

Chas Brown
sumber
2

Jelly , 7 byte

ṙØ+^/$¡

Cobalah online!

Program lengkap. Output tunggal diwakili sebagai xbukan [x].

Erik the Outgolfer
sumber
1

Pyth , 24 byte

AQVH=Gmxhded.:+eG+GhG3;G

Cobalah online!

AQ                        # G, H = Q[0], Q[1] # Q = input in the form [[states],steps]
  VH                      # for i in range(H):
    =G                    # G = 
      m                   #     map(lambda d:                              )
       xhded              #                   d[0] ^ d[-1],
            .:       3    #         substrings(                 , length=3)
              +eG+GhG     #                     G[-1] + G + G[0]
                      ;   # (end for loop)
                       G  # print G
ar4093
sumber
0

Ruby , 59 byte

->r,n{n.times{r=r.rotate.zip(r.rotate -1).map{|a,b|a^b}};r}

Cobalah online!

Pasang kembali Monica - notmaynard
sumber