Mô phỏng quy tắc 110


27

Quy tắc 110 là một thiết bị tự động di động với một số tính chất thú vị. Mục tiêu của bạn là mô phỏng quy tắc 110 bằng càng ít ký tự càng tốt.

Đối với những người không biết, quy tắc 110 được mô phỏng từng dòng trong một lưới. Mỗi ô vuông trong một đường của lưới nhìn vào các ô vuông bên trên, bên trái và bên phải để xác định ô nào sẽ là ô.

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

Đầu vào: các số từ 0 đến 39 đại diện cho ô vuông đầu vào thứ n hàng đầu, ở bất kỳ định dạng hợp lý nào (chuỗi được phân tách bằng dấu phẩy, danh sách, đối số hàm). Để chứa các ngôn ngữ được lập chỉ mục 1, các số cũng có thể được lập chỉ mục 1 và do đó nằm trong khoảng từ 1 đến 40.

Ví dụ đầu vào:

38,39

Đầu ra: Một lưới 40 x 40 đại diện cho automata đang chạy bao gồm hàng đầu tiên. Bạn nên để trống 0 và 1 như bất kỳ ký tự in có thể nhìn thấy nào. Không gian lưu trữ được cho phép, miễn là lưới thực tế có thể được phân biệt hợp lý. Phần dưới cùng của lưới có thể có một dòng mới nhưng không nên có các dòng trống giữa các dòng lưới.

Ví dụ đầu ra:

                                  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

v.v.

Lưu ý: Một câu hỏi tương tự về automata di động 1D đã được hỏi, nhưng tôi hy vọng rằng, bằng cách chỉ sử dụng một quy tắc, câu trả lời ngắn hơn có thể được viết.


4
Các mẫu có bao quanh không (tức là ô ngoài cùng bên trái kiểm tra ô ngoài cùng bên phải trong dòng phía trên nó)?
Ventero

4
Nếu nó là số ít, thì đó là một máy tự động di động .
ClickRick

1
Các câu trả lời có thể ngắn hơn một chút so với Mô phỏng bất kỳ thiết bị tự động di động 1D nào vì quy tắc này được mã hóa cứng thay vì phải được phân tích cú pháp từ đầu vào, nhưng khác với các câu trả lời sẽ giống nhau. Nếu đó là một quy tắc khác thì sẽ có tiềm năng tiết kiệm, nhưng làm thế nào trên Trái đất sẽ áp dụng một quy tắc mạnh mẽ Turing để tiết kiệm bất cứ điều gì trong quá trình thực hiện chung?
Peter Taylor

1
@Ventero Họ không có trong phiên bản này.
qwr

1
@BMO đây là một câu hỏi cũ, nhưng vì hiện nay sự đồng thuận là cho phép các định dạng đầu vào linh hoạt, tôi sẽ sửa đổi câu hỏi để cho phép nó
qwr

Câu trả lời:


8

CJam - 47

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

Nó sử dụng !cho các ô "1".

Dùng thử tại http://cjam.aditsu.net/

Giải trình:

S40*làm cho một chuỗi (mảng) gồm 40 khoảng trắng
l',/đọc một dòng và phân tách bằng dấu phẩy
{…}/thực hiện khối cho từng mục (các số ở dạng chuỗi)
- i'!tchuyển đổi số thành số nguyên và đặt mục ở vị trí đó trong chuỗi trước đó (ban đầu là 40 khoảng trắng ) đến '!'
Tại thời điểm này, chúng tôi đã thu được dòng đầu tiên.
{…}39*thực thi khối 39 lần
- Nthêm một dòng mới
- 40,tạo ra mảng [0 1, 39]
- S3$S++sao chép dòng trước đó (vị trí 3 trên ngăn xếp) và đệm nó với một khoảng trắng ở mỗi bên
- f{…}thực hiện khối cho {mỗi số từ 0 đến 39} và {dòng đệm}
- >3<lấy một lát gồm 3 mục từ dòng đệm bắt đầu từ số hiện tại
- 2bchuyển đổi từ cơ sở 2; các mục chúng tôi cắt không phải là 2 chữ số cơ bản, nhưng các ký tự được chuyển đổi thành giá trị ASCII của chúng và '' mod 8 là 0 và '!' mod 8 là 1
- 137Ybchuyển đổi 137 thành cơ sở 2 ( Y= 2), thu được [1 0 0 0 1 0 0 1], được đảo ngược và phủ định 110 (trên 8 bit)
- ='!^lấy chữ số cơ sở 2 tương ứng ( mảng kết thúc xung quanh để chỉ mục được lấy mod 8) và xor nó với '!' nhân vật, kết quả là '!' cho 0 và '' cho 1


17

Ruby, 113 ký tự

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

Đưa đầu vào vào stdin. Để sử dụng một quy tắc khác, chỉ cần thay thế 110dòng cuối cùng bằng bất kỳ quy tắc nào bạn muốn thử.

Thí dụ:

$ 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

8

Toán học, 122 byte

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

Có, bạn có thể xem đây là lạm dụng kẽ hở này , nhưng a) lỗ hổng đó khá tranh cãi, b) một câu hỏi Cellular Automaton cần một câu trả lời Mathicala (đặc biệt là về Quy tắc 110) và c) Câu trả lời Ruby của Ventero ngắn hơn, vì vậy tôi không 'T nghĩ rằng bất kỳ tác hại được thực hiện.

Hầu hết các ký tự được sử dụng để phân tích cú pháp đầu vào và định dạng đầu ra. Máy tự động thực tế được mô phỏng bằng cách sử dụng

CellularAutomaton[110,initialGrid,39]

Điều này sử dụng các điều kiện biên định kỳ (vì vậy lưới bao bọc xung quanh).


8

Con trăn - 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)

Chạy như vd python 110.py <<< 38,39


3
['X',' ']có thể được thay đổi 'X 'để lưu 5 ký tự.
Sở thích của Calvin

16
Trái cây yêu thích của tôi bây giờ là mộto=range()
kitcar2000

7

q, 67 62 58 byte

Giả sử không có sự bao bọc:

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

Phiên bản cũ

{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;~:]}

5

Con trăn, 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]

Decent nhưng có lẽ không tối ưu.

Bạn đã không xác định cách nhập liệu để nhận được một hàm.

Sử dụng ví dụ:

r ([38,39])

Đầu ra:

                                      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

Tôi đã chỉ định đầu vào: trong trường hợp của bạn, bạn sẽ phải sử dụng đầu vào () và định dạng đầu vào như được chỉ định trong bài viết gốc.
qwr

5

Toán học, 113 ký tự

Một câu trả lời Mathicala khác sử dụng CellularAutomaton.

Print@@" "["X"][[#]]&/@CellularAutomaton[110,SparseArray[#+1->1&/@ImportString[InputString[],"CSV"][[1]],40],39];

Thú vị, làm việc như thế nào " "["X"][[#]]&?
Martin Ender

@ m.buettner " "["X"][[1]]"X". " "["X"][[0]]trả lại đầu của " "["X"], cụ thể là " ".
alephalpha

Ồ, tôi hiểu rồi. Vì vậy, nói chung chỉ lưu một ký tự cho danh sách. Điều đó thực sự thông minh. Tôi đoán bạn có thể thêm nó vào codegolf.stackexchange.com/questions/12900/ triệt
Martin Ender

4

C - 178

Mã này phụ thuộc vào thực tế là mỗi hàng trong một ma trận được lưu trữ trong bộ nhớ liền kề. Ngoài ra, nó không in hàng đầu tiên, nhưng nó in 40 cái tiếp theo, vì các quy tắc chỉ quy định lưới 40x40.

Được thụt lề chỉ để đọc, số byte chỉ bao gồm mã cần thiết.

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);
}

3

Lua - 351

Không phải là ngôn ngữ lý tưởng để chơi 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

1
do u(n,i,'x')đó là cố ý, phải không?
Stan Strum


3

Haskell , 135 131 130 byte

-1 byte nhờ Ørjan Johansen (sắp xếp lại take 40)

Cách tiếp cận hoàn toàn khác nhau đối với câu trả lời của FrownyFrog nhưng có cùng độ dài:

(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

Giải trình

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

Các (?)nhà điều hành là phần thú vị nhất của giải pháp: Trước đây tôi đã sử dụng một quy tắc Boolean tạo ra với một bản đồ Karnaugh, nhưng lần lượt ra có một cách thậm chí ngắn gọn hơn:

(a?b)r=mod(b+r+b*r+a*b*r)2

1
Lưu một byte bằng cách đặt take 40$trước map(" o"!!)<$>.
Ørjan Johansen

3

Husk , 31 28 byte

Hah, Husk đang đánh Jelly!

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

Hãy thử trực tuyến!

Giải thích & Ungolfed

Trước khi thêm một lời giải thích, hãy để tôi giải thích điều này một chút .. Trước tiên, hãy xóa các tác phẩm khác nhau, thêm dấu ngoặc đơn rõ ràng và giải nén ¨↑¨chuỗi. Ngoài ra, hãy thay thế 40bằng 4một lời giải thích dễ đọc hơn:

†!"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"]

2

Java, 321 ký tự

Đầu vào được truyền dưới dạng đối số từ dòng lệnh, ví dụ java R 38,39

Tôi chưa bao giờ viết mã java khó hiểu hơn :-)

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

2

Cập nhật: Ví dụ đầu ra đúng ở đây (với 40 dòng chứ không phải 50): Đầu ra mới bên dưới (đã loại bỏ trước đó để lấy ngắn gọn):

                                      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

Thực hiện một câu đố khác tôi đã học được một điều thú vị về các câu lệnh lồng nhau trong các vòng lặp trong php, và đột nhiên chúng phức tạp hơn nhiều so với tôi nghĩ ban đầu. Khi tôi có thời gian, tôi nghĩ rằng tôi có thể đánh bại số điểm này một cách đáng kể. Cho đến bây giờ mặc dù nó vẫn không thay đổi ở mức 408 không cạnh tranh.


Phiên bản php của tôi 408 ký tự:

Đây là một câu đố tuyệt vời. Tôi cũng dành nhiều năm chơi với đầu vào vì đây là những điều hấp dẫn phải nói. Dù sao, đây là phiên bản PHP của tôi (không có gì tốt bằng một số câu trả lời được đăng nhưng đã hoàn tất. Ở vị trí số 0 chỉ ở trên và bên phải, ở vị trí 39 chỉ ở trên và bên trái, tức là không có gói. là phiên bản của tôi:

<?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;}?>

Bạn có thể nhìn thấy nó và chạy nó ở đây: http://codepad.org/3905T8i8

Đầu vào là một chuỗi đầu vào khi bắt đầu là $ a = '38, 39 ';

Đầu ra như sau:

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

Hy vọng bạn thích nó!!!

PS Tôi đã phải thêm một vài ngắt dòng vào mã để bạn có thể thấy tất cả mã đó và không bị kéo dài trên trang bằng thanh cuộn.


Đầu ra của bạn có 50 dòng
aditsu 15/07/14

Ah, đó là bởi vì tôi đã chơi với nó sau khi tôi hoàn thành và xem những gì đã xảy ra. Thay đổi các quy tắc một chút có ảnh hưởng thú vị như vậy. Dù sao đã thay đổi nó thành 40 bây giờ và xin lỗi vì đã bỏ lỡ điều đó.
Paul Drewett

Bạn cũng có thể muốn thay đổi đầu ra: p
aditsu 16/07/14

Sửa lỗi đầu ra và thêm liên kết codepad mới với giá trị chính xác. Cám ơn bạn một lần nữa.
Paul Drewett

2

Stax , 24 byte CP437

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

Chạy và gỡ lỗi trực tuyến!

Sử dụng mã số 1 trong CP437 cho các ô "1".

Trường hợp tuyệt vời để thể hiện sức mạnh của ngôn ngữ này.

Giải trình

Sử dụng phiên bản đã giải nén (29 byte) để giải thích.

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`

1

K (ngn / k) , 44 35 byte

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

Hãy thử trực tuyến!

{ } chức năng với đối số x

!40 danh sách các số nguyên từ 0 đến 39

x?tìm chỉ số của họ trong x, sử dụng 0N("số nguyên null") cho không tìm thấy

^cái nào trong số chúng là null? điều này cho chúng ta đầu vào, phủ định

39{ }\ áp dụng 39 lần, thu thập kết quả trung gian trong một danh sách

1,x,1 bao quanh danh sách với 1s (phủ định 0s)

3' bộ ba mục liên tiếp

2/' giải mã nhị phân mỗi

@ sử dụng như chỉ số trong ...

2\145 mã hóa nhị phân 145 (bit phủ định của 110)

"X "cuối cùng, sử dụng ma trận 40x40 làm chỉ mục trong chuỗi "X "( @ở đây là ẩn)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.