Mô phỏng máy tự động di động Wireworld


24

Wireworld là một thiết bị tự động di động được thiết kế giống với các electron chạy qua dây dẫn. Cơ học đơn giản của nó cho phép xây dựng các mạch kỹ thuật số. Nó thậm chí đã cho phép xây dựng toàn bộ máy tính .

Nhiệm vụ của bạn là tạo ra triển khai Wireworld ngắn nhất bằng ngôn ngữ bạn chọn.

Mỗi ô trong lưới có một trong bốn trạng thái. Bốn trạng thái là "trống", "đồng", "đầu điện tử" hoặc "đuôi điện tử".

  • Một ô trống sẽ luôn là một ô trống
  • Đầu điện tử sẽ luôn trở thành đuôi điện tử
  • Đuôi điện tử sẽ luôn trở thành đồng
  • Một tế bào đồng sẽ trở thành một đầu điện tử, chính xác một hoặc hai trong số tám lân cận của nó là các đầu điện tử, nếu không nó sẽ vẫn là đồng

Cuộc thi này sẽ có phong cách tương tự như cuộc thi Trò chơi ngắn nhất trong cuộc sống , nhưng với một vài thay đổi.

  • Lưới phải có ít nhất 40 x 40 ô
  • Các cạnh của lưới KHÔNG được quấn quanh (không phải hình xuyến). Đối xử với các tế bào bên ngoài trường là liên tục "trống".
  • Người dùng phải có thể nhập cấu hình bắt đầu của riêng họ.
  • Nhìn chằm chằm vào màn hình trống không vui. Chương trình phải hiển thị trực quan mô phỏng khi nó đang chạy.

Đây là mã golf, ít byte thắng nhất.

Câu trả lời:


6

APL, Dyalog (131)

{h t c←1↓⍵∘=¨F←' htc'⋄⎕SM∘←1 1,⍨⊂N←F[1+⊃+/H h(t∨c≠H←c∧S↑1 1↓1 2∊⍨⊃+/+/K∘.⊖(K←2-⍳3)∘.⌽⊂¯1⌽¯1⊖h↑⍨2+S←25 79)ר⍳3]⋄∇N⊣⎕DL÷4}↑{79↑⍞}¨⍳25

Đầu ra được hiển thị trong ⎕SMcửa sổ. Các mô phỏng chạy vô tận. Lưới có kích thước 79x25 vì đó là kích thước mặc định của ⎕SMcửa sổ. Đầu điện tử là h, đuôi là t, đồng là c. Chương trình đọc cấu hình bắt đầu từ bàn phím là 25 dòng.

Giải trình:

  • ↑{79↑⍞}¨⍳25: đọc lưới 79x25
  • h t c←1↓⍵∘=¨F←' htc': lấy ba ma trận, một có đầu, một có đuôi và một có đồng. Cũng đặt F thành chuỗi ' htc'.

  • ⎕SM∘←1 1,⍨⊂N←F[1+⊃+/... ר⍳3]: Phần "..." là một vectơ có độ dài ba, trong đó các phần tử là ma trận hiển thị các đầu, đuôi và đồng mới tương ứng. Các đầu được nhân với 1, đuôi bằng 2 và đồng bằng 3, sau đó chúng ta tổng hợp các ma trận này lại với nhau và thêm một, đưa ra một ma trận các chỉ số vào F. Ntrở thành trạng thái mới, có cùng định dạng với đầu vào và được hiển thị trên ⎕SMmàn hình bắt đầu từ góc trên bên trái.

  • ¯1⌽¯1⊖h↑⍨2+S←25 79: Thêm đường viền của khoảng trống vào hbằng cách tăng nó bằng hai hàng và cột, sau đó xoay nó sang phải và một xuống.

  • ⊃+/+/K∘.⊖(K←2-⍳3)∘.⌽⊂: Xoay ma trận theo tất cả tám hướng và sau đó tổng hợp các ma trận kết quả lại với nhau, đưa ra số lượng lân cận đứng đầu trên mỗi vị trí.

  • 1 2∊⍨: Chỉ đặt các vị trí đó thành 1 có 1 hoặc 2 hàng xóm.

  • S↑1 1↓: Xóa đường viền chúng tôi đã thêm trước đó.

  • H←c∧: Các đầu mới là tất cả các ô đồng có 1 hoặc 2 đầu lân cận.

  • t∨c≠H: Các tế bào đồng mới là tất cả các đuôi cũ và tất cả các tế bào đồng cũ chưa trở thành đầu.

  • H h(... ): Các đầu mới Hnhư được tính toán ở trên, các đuôi mới là các đầu cũ và các ô đồng mới như được tính toán ở trên.

  • ∇N⊣⎕DL÷4: Đợi 1/4 giây, sau đó chạy lại chức năng N.


Tôi nghĩ sẽ tốt hơn nếu nó có thể chứa một lưới 40 đến 40.
mbomb007 16/07/2015

6

ALPACA, 82 ký tự

ALPACA là một ngôn ngữ được thiết kế đặc biệt cho các máy tự động di động.

o không là gì cả; c là dây dẫn; e là electron; t là đuôi electron.

state o " ";
state c "c" to e when 1 e or 2 e;
state e "e" to t;
state t "t" to c.

Ngôn ngữ này được phát hành khi nào? Có bất kỳ liên kết cho ngôn ngữ?
Tối ưu hóa

@Optimizer Ở đây bạn đi! Tôi đã không tạo ra ngôn ngữ.
DanTheMan

4
Mát mẻ. Đúng ngôn ngữ cho thử thách phù hợp ..
Trình tối ưu hóa

4

GolfScript ( 125 120 105 100 ký tự)

n%{.,,{1${.0=,:w[1,*]\+2*>3<}:^~`{zip^''+.4=5%'`X '@{+}*(7&1>'iX'>+=}+w,%}%"\033[H\033[J"@n*+puts 6.?.?}do

Lưu ý rằng tôi đang đếm \033từng ký tự một, bởi vì chúng có thể được thay thế bằng một ESCký tự theo nghĩa đen . Điều này sử dụng mã kiểm soát ANSI, do đó dựa vào một tty tương thích. Cũng lưu ý rằng các khung được in bắt đầu với lưới đầu vào.

Có một số trùng lặp với Tạo một lưới các khoản tiền , cũng sử dụng vùng lân cận Moore.

Mã hóa: không gian trống => ; đầu electron => i; đuôi điện tử => `; đồng => X.

Thời gian tạm dừng giữa các lần lặp là thời gian cần thiết để tính toán 46656 46656 . Thay đổi 6.?.?sang biểu thức khác cho phép bạn kiểm soát tốc độ; chậm nhất tiếp theo cho số ký tự cùng là 7.?.?, đó là nhiều chậm hơn (đầu ra là 22 lần lớn, và nó không phải là một tính toán phức tạp tuyến tính).

Đối với trường hợp thử nghiệm, tôi đã sử dụng

`iXXXXXXXXX
X   X      
   XXX     
X   X      
i`XX XXXXXX

từ thử thách Rosetta Code Wireworld .


3

Python 371 341 ký tự

Vâng, nó không phải là ngắn, nhưng nó có một gui tương tác!

import matplotlib.pylab as l,scipy.ndimage as i
r=round
w=l.zeros((40,40),int)-1
p=l.matshow(w,vmax=2)
c=p.figure.canvas
def h(e):
 try:w[r(e.ydata),r(e.xdata)]=[0,2,-1][e.button-1]
 except:x=i.convolve(w==2,l.ones((3,3)),int,'constant');w[:]=w/2+((w==0)&(x>0)&(x<3))*2
 p.set_data(w);c.draw()
c.mpl_connect('button_press_event',h)
l.show()

Hướng dẫn:

Nhấp bằng nút chuột trái để đặt dây

Nhấp bằng nút chuột phải để xóa

Nhấp chuột vào nút chuột giữa để đặt đầu điện tử

Nhấp vào bên ngoài các trục để bước tự động


(x>0)&(x<3)-> (0<x<3). :)
beary605

3

Con trăn ( 243 214)

Đã cố gắng để tạo ra một chéo giữa khả năng sử dụng và nhân vật. Lưới có kích thước 40x40. Đầu vào được đưa ra trên stdin. Một đầu điện tử là h, đuôi điện tử là t, đồng là c, bất cứ thứ gì khác đều trống.

import os
f=raw_input()
while 1:f=''.join('h'if(i=='c')&(0<sum(1 for i in[-1,1,-39,-40,-41,39,40,41]if f[e+i:e+i+1]=='h')<3)else't'if i=='h'else'c'if i=='t'else f[e]for e,i in enumerate(f));os.system('cls');print f

Vòng lặp while (dòng 3) không nén (sẽ không hoạt động nếu được đặt trong mã):

while 1:
 for e,i in enumerate(f):
  if(i=='c')&(0<sum(1 for i in[-1,1,-39,-40,-41,39,40,41]if f[e+i:e+i+1]=='h')<3):f[e]='h'
  elif i=='h':f[e]='t'
  elif i=='t':f[e]='c'
  else:f[e]=f[e]  #redundant, but Python needs this to run
 os.system('cls') #cls is shorter than clear, so I used that
 print f

Tôi nghĩ bạn có thể thay thế các dòng 5-7 bằng một biểu thức duy nhất : g[e]='h'if(t=='c')&...else't'if i=='h'else'c'if i=='t'else i. Không chắc chắn nếu nó hoạt động chính xác như vậy, nhưng một cái gì đó dọc theo những dòng đó sẽ hoạt động
Strigoides

2

C, 355 347 300 294 ký tự

Chỉnh sửa: nhận ra tôi không cần feof()

Chỉnh sửa: Đã lưu 47 ký tự! Loại bỏ giấc ngủ, loại bỏ gần như tất cả các niềng răng, kết hợp rất nhiều thao tác.

Chỉnh sửa: Lần cuối cùng hôm nay, kể từ khi tôi phá vỡ 300 ký tự. Thay đổi printfđể puts, tìm thấy một chút tối ưu hóa dễ thương với sự so sánh đầu tiên.

C không cho vay đúng với loại vấn đề này, nhưng này, chơi golf thật là vui. Đây là một triển khai khá mạnh mẽ, nhưng tôi muốn xem tôi có thể chơi nó bao xa.

Đầu vào là một tệp văn bản có tên i. Nó chứa một đại diện của trạng thái bắt đầu, với *đồng, +cho đầu điện tử, -cho đuôi điện tử, không gian cho các ô trống. Tôi đang sử dụng cổng XOR từ trang wiki để thử nghiệm.

   ****-+**
  +        ******
   -*******      *
                ****
                *  *****
                ****
   ********      *
  +        ******
   -****+-*

char*p,t[42][42],s[42][42];
main(i,r,c,n,j)
{
  for(p=fopen("i","r");fgets(s[i++]+1,40,p););

  for(;;getch(),memcpy(s,t,1764))
    for(j=1;j<41;puts(s[j++]+1))
      for(i=1;i<41;)
      {
        p=t[j]+i;
        r=s[j][i++];
        *p=r==43?45:r;
        if(r==45)
          *p=42;
        if(r==42)
          for(r=-1,n=0;r<2;++r,*p=n&&n<3?43:42)
            for(c=-2;c<1;)
              n+=s[j+r][i+c++]==43;
      }
}

Có thể cond?43:42được viết 42+(cond)? Và tôi chắc chắn r=s[j][i++];*p=r==43?45:r;if(r==45)*p=42;có thể giảm xuống r=s[j][i++];*p=r==43?45:r==45?42:r;nếu khôngr=s[j][i++]-43;*p=!r?45:r==2?42:r;
Peter Taylor

1

Python, 234 218 ký tự

import time
I=input
C=I()
H=I()
T=I()
R=range(40)
while 1:
 for y in R:print''.join(' CHT'[(C+H+2*T).count(x+y*1j)]for x in R)
 H,T=[c for c in C if 0<sum(1 for h in H if abs(c-h)<2)<3and c not in H+T],H;time.sleep(.1)

Bạn nhập bảng dưới dạng ba danh sách các số phức biểu thị tọa độ của các ô bằng đồng (phải bao gồm các danh sách đầu và đuôi), đầu và đuôi. Đây là một ví dụ:

[3+2j+x for x in range(8)] + [3+4j+x for x in range(8)] + [11+3j+x for x in range(6)] + [2+3j]
[3+2j]
[2+3j]

Lưu ý rằng chúng tôi evalnhập liệu, vì vậy bạn có thể sử dụng các biểu thức phức tạp tùy ý cho danh sách các số phức.


1

QBasic, 309 byte

Cảnh báo: phiên bản chơi gôn không thân thiện với người dùng: nó có một phương thức nhập liệu kỳ lạ, chạy như một vòng lặp vô hạn và không có bất kỳ độ trễ nào (do đó, chạy quá nhanh trên một số hệ thống). Chỉ chạy nó nếu bạn biết cách chấm dứt chương trình trong môi trường QBasic của bạn. Phiên bản không được khuyến khích (xem bên dưới).

INPUT w,h
SCREEN 9
FOR y=1TO h
FOR x=1TO w
PSET(x,y),VAL(INPUT$(1))
NEXT
NEXT
DO
FOR y=1TO h
FOR x=1TO w
SCREEN,,0
c=POINT(x,y)
d=c
IF c=7THEN d=1
IF c=1THEN d=6
IF c=6THEN
n=0
FOR v=y-1TO y+1
FOR u=x-1TO x+1
n=n-(POINT(u,v)=7)
NEXT
NEXT
d=7+(n=0OR n>2)
END IF
SCREEN,,1,0
PSET(x,y),d
NEXT
NEXT
PCOPY 1,0
LOOP

Để chạy, chỉ định tại dấu nhắc đầu vào chiều rộng wvà chiều cao cấu hình của bạn h. 1 Sau đó nhập w*hmã một chữ số cho các ô (di chuyển từ trái sang phải, sau đó từ trên xuống dưới), với

  • 0 = trống
  • 6 = dây
  • 7 = đầu tín hiệu
  • 1 = đuôi tín hiệu

Khi bạn đã nhập tất cả các ô, mô phỏng sẽ bắt đầu (và tiếp tục mãi mãi cho đến khi bạn tắt chương trình).

Bị đánh cắp

Một phiên bản thân thiện hơn. Để sửa đổi bố cục, sửa đổi các DATAbáo cáo ở cuối.

Mã tận dụng POINTchức năng, đọc giá trị màu của một pixel từ màn hình. Điều này có nghĩa là chúng ta không phải lưu trữ các ô riêng biệt như một mảng. Để đảm bảo rằng tất cả các ô cập nhật đồng thời, chúng tôi thực hiện cập nhật trên "trang" thứ hai. Chúng tôi có thể chuyển trang hoạt động bằng một phiên bản của SCREENcâu lệnh và sao chép nội dung của trang này sang trang khác bằng cách sử dụng PCOPYcâu lệnh.

SCREEN 9

EMPTY = 0 ' Black
HEAD = 7  ' Light gray
TAIL = 1  ' Blue
WIRE = 6  ' Brown/orange

' First two data values are the width and height
READ w, h
' The rest are the initial configuration, row by row
' Read them and plot the appropriately colored pixels
FOR y = 1 TO h
  FOR x = 1 TO w
    READ state$
    IF state$ = "" THEN value = EMPTY
    IF state$ = "H" THEN value = HEAD
    IF state$ = "T" THEN value = TAIL
    IF state$ = "W" THEN value = WIRE
    PSET (x, y), value
  NEXT x
NEXT y

' Loop the simulation until user presses a key
DO UNTIL INKEY$ <> ""
  ' Store current time for delay purposes
  t# = TIMER

  FOR y = 1 TO h
    FOR x = 1 TO w
      ' Active page = display page = 0
      SCREEN , , 0
      ' Get the color value of the pixel at x,y
      oldVal = POINT(x, y)
      IF oldVal = EMPTY THEN
        newVal = EMPTY
      ELSEIF oldVal = HEAD THEN
        newVal = TAIL
      ELSEIF oldVal = TAIL THEN
        newVal = WIRE
      ELSEIF oldVal = WIRE THEN
        neighbors = 0
        FOR ny = y - 1 TO y + 1
          FOR nx = x - 1 TO x + 1
            IF POINT(nx, ny) = HEAD THEN neighbors = neighbors + 1
          NEXT nx
        NEXT ny
        IF neighbors = 1 OR neighbors = 2 THEN
          newVal = HEAD
        ELSE
          newVal = WIRE
        END IF
      END IF
      ' Active page = 1, display page = 0
      SCREEN , , 1, 0
      ' Plot the new value on page 1
      PSET (x, y), newVal
    NEXT x
  NEXT y

  ' Copy page 1 to page 0
  PCOPY 1, 0

  ' Delay
  WHILE TIMER >= t# AND t# + 0.2 > TIMER
  WEND
LOOP

DATA 8,5
DATA T,H,W,W,W,W,W,W
DATA W, , , ,W, , , 
DATA  , , ,W,W,W, , 
DATA W, , , ,W, , , 
DATA H,T,W,W, ,W,W,W

1 Các giá trị tối đa cho chiều rộng và chiều cao tùy thuộc vào chế độ màn hình nào được sử dụng. Trong SCREEN 9, chiều rộng có thể lên tới 638 và chiều cao lên tới 348. SCREEN 7có độ phân giải nhỏ hơn (kích thước cấu hình tối đa 318 bằng 198), nhưng các pixel lớn hơn và do đó dễ nhìn hơn (trên DOS QBasic hoặc trình giả lập DOSBox - không may là QB64 cho một cửa sổ nhỏ hơn).

Chạy ví dụ

Phiên bản Ungolfed trên archive.org , với chế độ màn hình 7:

Thế giới dây trong QBasic

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.