Simulasikan Aturan 110

27

Aturan 110 adalah otomat seluler dengan beberapa sifat menarik. Tujuan Anda adalah untuk mensimulasikan aturan 110 dalam karakter sesedikit mungkin.

Bagi mereka yang tidak tahu, aturan 110 disimulasikan baris demi baris dalam kotak. Setiap kotak dalam garis grid melihat kotak di atas, di atas-kiri dan di atas-kanan untuk menentukan sel apa yang seharusnya.

current pattern  111 110 101 100 011 010 001 000
new cell          0   1   1   0   1   1   1   0

Input: angka dari 0 hingga 39 yang merepresentasikan baris input ke-atas, dalam format beralasan apa pun (string yang dipisahkan koma, daftar, argumen fungsi). Untuk mengakomodasi bahasa yang diindeks 1, angka juga dapat diindeks 1 dan berkisar dari 1 hingga 40.

Input contoh:

38,39

Output: Kisi 40 x 40 yang mewakili automata berjalan termasuk baris pertama. Anda harus membiarkan 0 sebagai kosong dan 1 sebagai karakter pencetakan yang terlihat. Ruang tambahan diperbolehkan, selama kisi yang sebenarnya dapat dibedakan secara wajar. Bagian bawah kisi mungkin memiliki baris baru tetapi tidak boleh ada garis kosong di antara garis kisi.

Contoh output:

                                  XX
                                 XXX
                                XX X
                               XXXXX
                              XX   X
                             XXX  XX
                            XX X XXX
                           XXXXXXX X
                          XX     XXX
                         XXX    XX X
                        XX X   XXXXX
                       XXXXX  XX   X
                      XX   X XXX  XX
                     XXX  XXXX X XXX

dll.

Catatan: Pertanyaan serupa tentang automata seluler 1D telah diajukan, tetapi saya berharap, dengan hanya menggunakan satu aturan, jawaban yang lebih pendek dapat ditulis.

qwr
sumber
4
Apakah pola membungkus (yaitu apakah sel paling kiri memeriksa sel paling kanan di baris di atasnya)?
Ventero
4
Jika itu tunggal, maka itu sebuah sel robot .
ClickRick
1
Jawabannya mungkin fraksional lebih pendek daripada Mensimulasikan automaton seluler 1D karena aturannya adalah kode keras daripada harus diuraikan dari input, tetapi selain itu jawabannya akan sama. Jika itu aturan yang berbeda maka akan ada potensi untuk penghematan, tetapi bagaimana di bumi casing khusus aturan Turing-kuat menghemat sesuatu dari implementasi umum?
Peter Taylor
1
@Ventero Mereka tidak dalam versi ini.
qwr
1
@BMO ini adalah pertanyaan lama, tetapi karena saat ini konsensus adalah untuk mengizinkan format input yang fleksibel, saya akan memodifikasi pertanyaan untuk mengizinkannya
qwr

Jawaban:

8

CJam - 47

S40*l',/{i'!t}/{N40,S3$S++f{>3<2b137Yb='!^}}39*

Ini digunakan !untuk sel "1".

Cobalah di http://cjam.aditsu.net/

Penjelasan:

S40*membuat string (array) dari 40 spasi
l',/membaca garis dan membelah dengan koma
{…}/mengeksekusi blok untuk setiap item (angka dalam bentuk string)
- i'!tmengonversi angka menjadi bilangan bulat dan menetapkan item pada posisi itu di string sebelumnya (awalnya 40 spasi ) ke '!'
Pada titik ini kami telah memperoleh baris pertama.
{…}39*mengeksekusi blok 39 kali
- Nmenambahkan baris baru
- 40,membuat array [0 1… 39]
- S3$S++menyalin baris sebelumnya (posisi 3 pada stack) dan menambahkannya dengan spasi di setiap sisi
- f{…}mengeksekusi blok untuk {setiap angka dari 0 ke 39} dan {the padded line}
- >3<mengambil sepotong 3 item dari garis empuk mulai dari angka saat ini
- 2bmengkonversi dari basis 2; item yang kami iris bukan basis-2 digit, tetapi karakter dapat dikonversi ke nilai ASCII mereka dan '' mod 8 adalah 0 dan '!' mod 8 adalah 1
- 137Ybmengonversi 137 ke basis 2 ( Y= 2), memperoleh [1 0 0 0 1 0 0 1], yang 110 terbalik dan dinegasikan (pada 8 bit)
- ='!^mendapatkan basis-2 digit yang sesuai ( array membungkus sehingga indeks diambil mod 8) dan xor's with the '!' karakter, menghasilkan '!' untuk 0 dan '' untuk 1

aditsu
sumber
17

Ruby, 113 karakter

c=[0]*41
eval"[#{gets}].map{|i|c[i]=1}"+'
c=(0..39).map{|x|putc" X"[u=c[x]]
110[4*c[x-1]+2*u+c[x+1]]}<<0;puts'*40

Mengambil input pada stdin. Untuk menggunakan aturan lain, cukup ganti 110di baris terakhir dengan aturan apa pun yang ingin Anda coba.

Contoh:

$ ruby 110.rb <<< 38,39
                                      XX
                                     XXX
                                    XX X
                                   XXXXX
                                  XX   X
                                 XXX  XX
                                XX X XXX
                               XXXXXXX X
                              XX     XXX
                             XXX    XX X
                            XX X   XXXXX
                           XXXXX  XX   X
                          XX   X XXX  XX
                         XXX  XXXX X XXX
                        XX X XX  XXXXX X
                       XXXXXXXX XX   XXX
                      XX      XXXX  XX X
                     XXX     XX  X XXXXX
                    XX X    XXX XXXX   X
                   XXXXX   XX XXX  X  XX
                  XX   X  XXXXX X XX XXX
                 XXX  XX XX   XXXXXXXX X
                XX X XXXXXX  XX      XXX
               XXXXXXX    X XXX     XX X
              XX     X   XXXX X    XXXXX
             XXX    XX  XX  XXX   XX   X
            XX X   XXX XXX XX X  XXX  XX
           XXXXX  XX XXX XXXXXX XX X XXX
          XX   X XXXXX XXX    XXXXXXXX X
         XXX  XXXX   XXX X   XX      XXX
        XX X XX  X  XX XXX  XXX     XX X
       XXXXXXXX XX XXXXX X XX X    XXXXX
      XX      XXXXXX   XXXXXXXX   XX   X
     XXX     XX    X  XX      X  XXX  XX
    XX X    XXX   XX XXX     XX XX X XXX
   XXXXX   XX X  XXXXX X    XXXXXXXXXX X
  XX   X  XXXXX XX   XXX   XX        XXX
 XXX  XX XX   XXXX  XX X  XXX       XX X
XX X XXXXXX  XX  X XXXXX XX X      XXXXX
XXXXXX    X XXX XXXX   XXXXXX     XX   X
Ventero
sumber
8

Mathematica, 122 byte

f[a_]:=Riffle[CellularAutomaton[110,Array[If[MemberQ[ToExpression["{"<>a<>"}"],#-1],1,0]&,40],39]/.0->" "/.1->"X","
"]<>""

Ya, Anda mungkin melihat ini sebagai penyalahgunaan celah ini , tetapi a) celah itu cukup diperdebatkan, b) pertanyaan Cellular Automaton membutuhkan jawaban Mathematica (terutama yang tentang Peraturan 110) dan c) Jawaban Ruby Ventero lebih pendek, jadi saya tidak berpikir ada salahnya dilakukan.

Sebagian besar karakter digunakan untuk parsing input dan format output. Otomat yang sebenarnya disimulasikan menggunakan

CellularAutomaton[110,initialGrid,39]

Ini menggunakan kondisi batas periodik (jadi kisi-kisi membungkus).

Martin Ender
sumber
8

Python - 141

i=input()
o=range(40)
l=''.join(' X'[c in i]for c in o)
for r in o:print l;l=''.join('X '[l[c-1:c+2]in('XXX','   ','X  ','','  ')]for c in o)

Jalankan sebagai mis python 110.py <<< 38,39

Alex L
sumber
3
['X',' ']dapat diubah menjadi 'X 'untuk menyimpan 5 karakter.
Hobi Calvin
16
Buah favorit saya sekarang adalaho=range()
kitcar2000
7

q, 67 62 58 byte

Diasumsikan tidak ada bungkus:

{40{not(2 sv'flip 1 0 -1 xprev\:x)in 0 4 7}\@[40#0b;x;~:]}

Versi lama

{40{not(flip(prev;::;next)@\:x)in 3 cut 111100000b}\@[40#0b;x;not]}
{40{not(flip 1 0 -1 xprev\:x)in 3 3#111100000b}\@[40#0b;x;~:]}
skeevey
sumber
5

Python, 186

def r(s,m=range(40)):
 s=[int(i in s)for i in m]
 for g in m:print''.join([' X'[i]for i in s]);s=[int(not''.join(map(str,s[i-1:i+2]if i else s[:2]))in'111 100 000 00'.split())for i in m]

Layak tetapi mungkin tidak optimal.

Anda tidak menentukan bagaimana input didapat, jadi saya baru saja membuat fungsi.

Gunakan contoh:

r ([38,39])

Keluaran:

                                      XX
                                     XXX
                                    XX X
                                   XXXXX
                                  XX   X
                                 XXX  XX
                                XX X XXX
                               XXXXXXX X
                              XX     XXX
                             XXX    XX X
                            XX X   XXXXX
                           XXXXX  XX   X
                          XX   X XXX  XX
                         XXX  XXXX X XXX
                        XX X XX  XXXXX X
                       XXXXXXXX XX   XXX
                      XX      XXXX  XX X
                     XXX     XX  X XXXXX
                    XX X    XXX XXXX   X
                   XXXXX   XX XXX  X  XX
                  XX   X  XXXXX X XX XXX
                 XXX  XX XX   XXXXXXXX X
                XX X XXXXXX  XX      XXX
               XXXXXXX    X XXX     XX X
              XX     X   XXXX X    XXXXX
             XXX    XX  XX  XXX   XX   X
            XX X   XXX XXX XX X  XXX  XX
           XXXXX  XX XXX XXXXXX XX X XXX
          XX   X XXXXX XXX    XXXXXXXX X
         XXX  XXXX   XXX X   XX      XXX
        XX X XX  X  XX XXX  XXX     XX X
       XXXXXXXX XX XXXXX X XX X    XXXXX
      XX      XXXXXX   XXXXXXXX   XX   X
     XXX     XX    X  XX      X  XXX  XX
    XX X    XXX   XX XXX     XX XX X XXX
   XXXXX   XX X  XXXXX X    XXXXXXXXXX X
  XX   X  XXXXX XX   XXX   XX        XXX
 XXX  XX XX   XXXX  XX X  XXX       XX X
XX X XXXXXX  XX  X XXXXX XX X      XXXXX
XXXXXX    X XXX XXXX   XXXXXX     XX   X
Hobi Calvin
sumber
Saya memang menentukan input: dalam kasus Anda, Anda harus menggunakan input () dan memformat input seperti yang ditentukan dalam posting asli.
qwr
5

Mathematica, 113 karakter

Jawaban lain menggunakan Mathematica CellularAutomaton.

Print@@" "["X"][[#]]&/@CellularAutomaton[110,SparseArray[#+1->1&/@ImportString[InputString[],"CSV"][[1]],40],39];
alephalpha
sumber
Menarik, bagaimana cara " "["X"][[#]]&kerjanya?
Martin Ender
@ m.buettner " "["X"][[1]]adalah "X". " "["X"][[0]]mengembalikan kepala " "["X"], yaitu " ".
alephalpha
Oh begitu. Jadi itu umumnya menyimpan karakter untuk daftar. Itu sangat pintar. Saya kira Anda bisa menambahkannya ke codegolf.stackexchange.com/questions/12900/...
Martin Ender
4

C - 178

Kode ini tergantung pada kenyataan bahwa setiap baris dalam matriks disimpan dalam memori yang berdekatan. Juga, ia tidak mencetak baris pertama, tetapi mencetak 40 baris berikutnya, karena aturan hanya menentukan kisi 40x40.

Diindentasi hanya untuk keterbacaan, jumlah byte hanya mencakup kode yang diperlukan.

a[41][42],i,j,*t;
main(){
    while(scanf("%d,",&j)>0)
        a[i][j]=1;
    for(;i<40;i++,puts(""))
        for(j=0;++j<40;)
            t=&a[i][j],
            putchar((*(t+42)=1&(110>>(*(t+1)?1:0)+(*t?2:0)+(*(t-1)?4:0)))?88:32);
}
Allbeert
sumber
3

Lua - 351

Bukan bahasa yang ideal untuk bermain golf.

s,n,t,u=arg[1],{},table.remove,table.insert
for i=1,40 do u(n,i,'.') end
for i in s:gmatch("%d+")do u(n,i,'x');t(n)end
function a(b) c="";for i=1,40 do c=c..b[i] end;print(c);return c end
for i=1,40 do z= n[40]..a(n)..n[1];for k=2,41 do y=string.sub(z,k-1,k+1);if y=="xxx"or y=="x.." or y=="..." then u(n,k-1,'.')else u(n,k-1,'x')end;t(n)end end
AndoDaan
sumber
1
do u(n,i,'x')itu disengaja, bukan?
Stan Strum
3

Haskell , 175 170 169 136 127 127 byte

−9 byte berkat @bmo

t(a:b:r:_)=mod(b+r+b*r+a*b*r)2
w%a=take 40.map w.iterate a
d l=t%tail$0:l++[0]
f l=map(" #"!!)%d$(fromEnum.(`elem`l))%succ$0

Cobalah online!

FrownyFrog
sumber
3

Haskell , 135 131 130 byte

-1 byte berkat Ørjan Johansen (mengatur ulang take 40)

Pendekatan yang sama sekali berbeda untuk jawaban FrownyFrog tetapi hampir sama panjangnya:

(a?b)r=mod(b+r+b*r+a*b*r)2
r x=0:(zipWith3(?)x=<<tail$tail x++[0])
f y=take 40$map(" o"!!)<$>iterate r[sum[1|elem i y]|i<-[0..40]]

1

Penjelasan

4101

f y=                               [sum[1|elem i y]|i<-[0..40]]

40

    take 40$              iterate r

01

            map(" o"!!)<$>

r110zipWith3(?)

r x=0:(zipWith3(?)x=<<tail$tail x++[0])

The (?)operator adalah bagian yang paling menarik dari solusi: Sebelumnya saya menggunakan aturan Boolean dihasilkan dengan peta Karnaugh, tapi ternyata di luar ada cara yang lebih ringkas:

(a?b)r=mod(b+r+b*r+a*b*r)2
ბიმო
sumber
1
Simpan satu byte dengan meletakkan take 40$sebelumnya map(" o"!!)<$>.
Ørjan Johansen
3

Sekam , 31 28 byte

Hah, Husk mengalahkan Jelly!

†!¨↑¨↑40¡ȯẊȯ!ḋ118ḋėΘ`:0M#ŀ40

Cobalah online!

Penjelasan & Tidak Disatukan

Sebelum menambahkan penjelasan, biarkan saya sedikit ungolf ini .. Pertama mari kita hapus berbagai komposisi, tambahkan tanda kurung eksplisit dan buka kompresi ¨↑¨string. Juga mari kita ganti 40dengan 4untuk penjelasan yang lebih mudah dibaca:

†!"t "↑4¡(Ẋ(!ḋ118ḋė)Θ`:0)M#ŀ4  -- example input: [3]
                           ŀ4  -- lower range of 4: [0,1,2,3]
                         M     -- map over left argument
                          #    -- | count in list
                               -- : [0,0,0,1]
        ¡(              )      -- iterate the following indefinitely (example with [0,1,1,1])
                     `:0       -- | append 0: [0,1,1,1,0]
                    Θ          -- | prepend 0: [0,0,1,1,1,0]
          Ẋ(       )           -- | map over adjacent triples (example with  1 1 0
                  ė            -- | | create list: [1,1,0]
                 ḋ             -- | | convert from base-2: 6
                               -- | | convert 118 to base-2: [1,1,1,0,1,1,0]
                               -- | | 1-based index: 1
                               -- | : [1,1,0,1]
                               -- : [[0,0,0,1],[0,0,1,1],[0,1,1,1],[1,1,0,1],[1,1,1,1],[1,0,0,1],...]
      ↑4                       -- take 4: [[0,0,0,1],[0,0,1,1],[0,1,1,1],[1,1,0,1]]
†                              -- deep map the following (example with [1,1,0,1])
 !"t "                         -- | use each element to index into "t ": "tt t"
                               -- : ["   t","  tt"," ttt","tt t"]
ბიმო
sumber
2

Java, 321 karakter

Input dilewatkan sebagai argumen dari baris perintah, misalnya java R 38,39

Saya tidak pernah menulis kode java yang lebih dikaburkan :-)

class R{public static void main(String[]a) {
Integer s=40;boolean[]n,o=new boolean[s];
for(String x:a[0].split(","))o[s.valueOf(x)]=s>0;
for(Object b:o){n=o.clone();
for(int j=0;j<s;j++){
boolean l=j>1&&o[j-1],r=o[j],c=j+1<s&&o[j+1];
n[j]=!(l&c&r|l&!c&!r|!(l|c|r));
System.out.print((r?"X":" ")+(j>s-2?"\n":""));
}o=n;}}}
Tomáš Dvořák
sumber
2

Pembaruan: Contoh output yang benar di sini (dengan 40 baris tidak 50): Output baru di bawah ini (dihapus sebelumnya untuk singkatnya):

                                      xx
                                     xxx
                                    xx x
                                   xxxxx
                                  xx   x
                                 xxx  xx
                                xx x xxx
                               xxxxxxx x
                              xx     xxx
                             xxx    xx x
                            xx x   xxxxx
                           xxxxx  xx   x
                          xx   x xxx  xx
                         xxx  xxxx x xxx
                        xx x xx  xxxxx x
                       xxxxxxxx xx   xxx
                      xx      xxxx  xx x
                     xxx     xx  x xxxxx
                    xx x    xxx xxxx   x
                   xxxxx   xx xxx  x  xx
                  xx   x  xxxxx x xx xxx
                 xxx  xx xx   xxxxxxxx x
                xx x xxxxxx  xx      xxx
               xxxxxxx    x xxx     xx x
              xx     x   xxxx x    xxxxx
             xxx    xx  xx  xxx   xx   x
            xx x   xxx xxx xx x  xxx  xx
           xxxxx  xx xxx xxxxxx xx x xxx
          xx   x xxxxx xxx    xxxxxxxx x
         xxx  xxxx   xxx x   xx      xxx
        xx x xx  x  xx xxx  xxx     xx x
       xxxxxxxx xx xxxxx x xx x    xxxxx
      xx      xxxxxx   xxxxxxxx   xx   x
     xxx     xx    x  xx      x  xxx  xx
    xx x    xxx   xx xxx     xx xx x xxx
   xxxxx   xx x  xxxxx x    xxxxxxxxxx x
  xx   x  xxxxx xx   xxx   xx        xxx
 xxx  xx xx   xxxx  xx x  xxx       xx x
xx x xxxxxx  xx  x xxxxx xx x      xxxxx
xxxxxx    x xxx xxxx   xxxxxx     xx   x

Melakukan teka-teki lain saya belajar sesuatu yang menarik tentang pernyataan bersarang untuk loop di php, dan tiba-tiba mereka jauh lebih kompleks daripada yang saya pikir sebelumnya. Ketika saya mendapatkan waktu saya rasa saya bisa mengalahkan skor ini. Untuk saat ini meskipun tetap tidak berubah pada 408 yang tidak kompetitif.


Karakter php versi 408 saya:

Ini adalah teka-teki yang bagus. Saya juga menghabiskan waktu lama bermain dengan input karena ini adalah hal-hal menarik yang harus dikatakan. Bagaimanapun, ini adalah versi PHP saya (yang mana dekat dengan beberapa jawaban yang diposting tetapi lengkap. Di posisi ke-0 hanya ambil di atas dan di kanan atas, di posisi ke-39 hanya ambil di atas dan di atas kiri, yaitu tidak ada pembungkus. Jadi di sini adalah versi saya:

<?php $a='38,39';$b='';$d=explode(',',$a);for($i=0;$i<40;++$i){$c=' ';
foreach($d as $k=>$v){if($v == $i){$c='x';}}$b.=$c;}echo $b."\n";
for($x=1;$x<41;++$x){$o='';for($i=1;$i<41;++$i){if(($i>1)AND(substr($b,$i-2,1)=='x')){
$l=1;}else{$l=0;}if((substr($b,$i-1,1))=='x'){$v=1;}else{$v=0;}if((substr($b,$i,1))=='x'){
$r=1;}else{$r=0;}if((($l+$v+$r)==2)OR(($v+$r)==1)){$o.='x';}else{$o.=' ';}}
echo $o."\n";$b=$o;}?>

Anda dapat melihatnya dan menjalankannya di sini: http://codepad.org/3905T8i8

Input adalah string input pada awalnya sebagai $ a = '38, 39 ';

Output adalah sebagai berikut:

xx removed as was too long originally - had 50 lines, not 40 xx

Harap Anda menyukainya!!!

PS Saya harus menambahkan beberapa jeda baris ke kode sehingga Anda bisa melihat semua itu dan tidak merentangkan halaman dengan bilah gulir.

Paul Drewett
sumber
Output Anda memiliki 50 baris
aditsu
Ah, itu karena aku bermain dengannya setelah aku selesai dan melihat apa yang terjadi. Mengubah aturan sedikit memiliki dampak yang menarik. Pokoknya telah mengubahnya menjadi 40 sekarang dan maaf telah melewatkannya.
Paul Drewett
Anda mungkin ingin mengubah output juga: p
aditsu
Mengoreksi output dan menambahkan tautan codepad baru dengan nilai yang benar. Terima kasih lagi.
Paul Drewett
2

Stax , 24 byte CP437

╦♥µ╤u{£┬íQ<;▀ΦΣ╢╕╚äZ↕áû↑

Jalankan dan debug online!

Menggunakan titik kode 1 dalam CP437 untuk sel "1".

Kasus luar biasa untuk menunjukkan kekuatan bahasa ini.

Penjelasan

Menggunakan versi yang belum dibongkar (29 byte) untuk menjelaskan.

0]40X*,1&xDQ0]|S3B{:b^374:B@m
0]40X*                           Prepare a tape with 40 cells
      ,1&                        Assign 1 to the cells specified by the input
         xD                      Repeat the rest of the program 40 times
           Q                     Output current tape
            0]|S                 Prepend and append a 0 cell to it
                3B               All runs of length 3
                  {         m    Map each run with block
                   :b            Convert from binary
                     ^           Increment (call this value `n`)
                      374:B      The binary representation of 374
                                 [1,0,1,1,1,0,1,1,0]
                                 which is `01101110` reversed and prepended a 1
                           @     Element at 0-based index `n`
Weijun Zhou
sumber
1

K (ngn / k) , 44 35 byte

{"X "39{(2\145)@2/'3'1,x,1}\^x?!40}

Cobalah online!

{ } berfungsi dengan argumen x

!40 daftar int mulai dari 0 hingga 39

x?cari indeksnya x, gunakan 0N("bilangan bulat nol") karena tidak ditemukan

^siapa di antara mereka yang nol? ini memberi kita input, dinegasikan

39{ }\ berlaku 39 kali, kumpulkan hasil antara dalam daftar

1,x,1 kelilingi daftar dengan 1s (negasi 0s)

3' tiga kali lipat item berturut-turut

2/' decode biner masing-masing

@ gunakan sebagai indeks di ...

2\145 penyandian biner 145 (bit dinegasikan 110)

"X "akhirnya, gunakan matriks 40x40 sebagai indeks dalam string "X "(di @sini adalah implisit)

ngn
sumber