Mô phỏng một máy tính bi-a (dựa trên trọng lực)


12

Máy

Một loại máy bi-a chỉ bao gồm các ký hiệu \ _ /cùng với chữ in hoa và chữ thường, dấu cách và số 1.

\/là những dốc. Một quả bóng đến từ phía trên sẽ bị lệch về phía bên phải hoặc bên trái, tương ứng. Đối với cả hai đường dốc, nếu một quả bóng đến từ hai bên, nó sẽ bị lệch xuống dưới.

_là một yếu tố logic. Logic được thực hiện bởi nó là phần không giống như bi-a của máy tính. Đầu tiên, một quả bóng đến từ bên trái hoặc bên phải tiếp tục theo cùng một hướng. Một quả bóng đến từ phía trên sẽ được dừng lại. Sau đó, sau khi kết thúc quá trình thực hiện (xem Chạy máy bên dưới), nếu số lượng bóng đi qua / hạ cánh trên đó là số chẵn dương, thì một quả bóng sẽ được giải phóng từ dưới cùng của phần tử.

Một không gian không làm gì cả. Bất kỳ quả bóng đến từ bất kỳ hướng nào rơi thẳng xuống do trọng lực.

Chữ thường là đầu vào. Tất cả các đầu vào sẽ là 1 hoặc 0.

Chữ in hoa là đầu ra. Con số xuất ra sẽ là số quả bóng bi-a đánh vào vị trí của nó.

Con số 1phát hành thêm một quả bóng bi-a tại vị trí đó. Nó đại diện cho logic 1.

Tất cả các nhân vật ngoài việc \_/làm cho bất kỳ quả bóng đến từ bất kỳ hướng nào rơi thẳng xuống do trọng lực.

Bóng không bao giờ kết hợp, phân chia hoặc va chạm. Chúng chỉ được tạo khi được phát hành từ đầu vào, a _hoặc a 1. Chúng chỉ bị phá hủy khi chúng rơi thẳng xuống a _.

Ví dụ máy-

1 a
\_/ b
  \_/
 \/
 /\ /
_  _
A  B

Sẽ không bao giờ có bất kỳ dòng trống nào trong một máy, nhưng _có thể làm cho nó xuất hiện rằng có một dòng trống.

Chạy máy

Một máy được chạy theo lớp, hoặc hàng. Tất cả các chuyển động bóng bi-a trên lớp trên cùng được thực hiện trước khi bất cứ điều gì xảy ra trên lớp thứ hai.

Máy

ab
\_A
 C

được chạy như sau:

Đầu tiên, nó nhắc cho đầu vào atrong mẫu a:. Sau đó, người dùng sẽ nhập 1 hoặc 0 (tiếp theo là nhập). Nó lặp lại điều này cho đầu vào b. Đây là phần cuối của lớp đầu tiên. Tôi sẽ giả định rằng người dùng đã nhập 1 cho cả hai đầu vào.

Sau đó, nó lần theo dấu vết của quả bóng đầu tiên (từ a), đi dọc theo \, ngang qua _, vào trong Avà rơi xuống vị trí bên dưới A. Sau đó, nó vạch ra con đường cho quả bóng thứ hai (từ b), đi thẳng xuống _và chấm dứt. Đây là phần cuối của lớp thứ hai.

Bây giờ, trước lớp thứ ba, vì _đã có hai quả bóng giao nhau, nó giải phóng một quả bóng. Đầu ra Ađã có một quả bóng đi qua nó, vì vậy nó xuất ra A:1.

Đối với lớp thứ ba, nó theo dõi đường đi của quả bóng thứ nhất (từ _), đi qua Cvà rơi thẳng xuống. Quả bóng thứ hai (rơi qua A) cũng rơi thẳng xuống.

Bây giờ, trước lớp thứ tư, vì đầu ra Ccó một quả bóng di chuyển qua nó, nó xuất ra C:1.

Vì lớp thứ tư là trống, chương trình kết thúc.

Tổng kết quả sẽ như thế nào

a:1     (the user entered the one)
b:1     (same here)
A:1
C:1

Mục đích

Mục tiêu của bạn là lấy một máy từ STDIN và mô phỏng nó bằng cách lấy đầu vào và in đầu ra khi cần đến STDOUT. Phần đầu tiên của chương trình đầu vào của bạn sẽ bao gồm máy sẽ được chạy, theo sau là một dòng trống. Bất kỳ chữ cái đầu vào nào gặp phải sẽ khiến chương trình của bạn nhắc nhập liệu dưới dạng tên đầu vào theo sau là dấu hai chấm. Bất kỳ đầu ra nào cũng phải được hiển thị dưới dạng tên đầu ra, theo sau là dấu hai chấm, theo sau là số lượng bóng đi qua điểm đó.

Đây là golf.

Ví dụ

Một dây qua

ab
\/
AB

Một cổng XOR

ab1
\_/
 C

Một bộ cộng đầy đủ

1 a
\_/ b
  \_/
 \/
 /\
_ __/
 \_/ 
  \/c
 \\_/ 
  _S1
\  \/
 __/
  /
 _
\__
 C

Trong ví dụ đầu tiên của bạn, tại sao quả bóng đầu tiên rơi xuống dưới chữ A? Có một quy tắc bất thành văn nào mà bóng dừng lại khi chúng chuyển sang một nhân vật không \_/?
Peter Taylor

@PeterTaylor Vâng, tôi nên thêm rằng tất cả các chữ cái hoạt động như một khoảng trống khi nói đến việc ảnh hưởng đến quả bóng và trọng lực kéo quả bóng xuống.
PhiNotPi

1
Bạn, trong mọi trường hợp, có nghĩa là 'flipper', không phải 'billard'?
người dùng không xác định

MAKE DIS AN ESOLANG
Matthew Roh

1
@AlexL. Cũng có liên quan: Marbelous
PhiNotPi

Câu trả lời:


3

JavaScript ( 392 423)

Giả sử máy được đặt trong một biến được gọi m, sau đó cảnh báo đầu ra cuối cùng.

l=m.split(q='\n');o='';for(r=Array(z=l[i=0].length);i<l.length;i++){L=l[i];n=Array(z);for(c=0;c<z;n[c]=N,r[c++]=R){C=L[c];N=~~n[c];R=~~r[c];if(C>'`'){N+=x=~~prompt(C);R+=x;o+=C+': '+x+q}else if(C=='\\'||C=='/'){for(d=c+(g=C=='/'?-1:1);L[d]=='_';r[d]+=R,d+=g);if(L[d]>'@'&L[d]<'[')r[d]+=r[c];n[d]=~~n[d]+R}else if(C<'2')N+=R+=~~C;else if(C!='_')o+=C+': '+R+q}for(c=0;c<z;c++)if(L[c]=='_')n[c]+=(r[c]%2)?0:r[c]>0;r=n}alert(o)

Nguồn mẫu (chạy máy cộng, xem lịch sử để biết các nguồn ít chơi gôn hơn): http://jsfiddle.net/96yLj/12/

Kẻ phá hoại:

- rtheo dõi # quả bóng trên hàng hiện tại, ntheo dõi # quả bóng trên hàng tiếp theo.
- Thuật toán: xử lý từng ký tự hàng theo ký tự, nhưng xử lý _cuối cùng.
- Thuật toán: \-> theo dõi _và tăng rcho đến khi không _. Tương tự cho /nhưng theo hướng ngược lại. Vào cuối tăng ncho trọng lực kéo quả bóng xuống. ggiữ hướng.
- if(L[d]>'@'&L[d]<'[')r[d]+=r[c];dành cho lỗi được đề cập trong Chỉnh sửa 1 . Lý do chúng tôi không thể chỉ nói r[d]+=r[c];là bởi vì \_/sẽ tăng gấp đôi-count bóng khi xử lý /
- else if(C<'2')xử lý cả hai trường hợp '1'' ', mà ~~Cbiến thành 1 và 0, tương ứng.


Chỉnh sửa 1: Sửa lỗi với bóng chạy qua _không được bao gồm trong Amã mẫu.


Lưu ý rằng tôi luôn bỏ qua các yêu cầu STDIN và STDOUT vì chúng là những hạn chế không thú vị. Tôi đang sử dụng promptcho đầu vào và alertđầu ra khá chuẩn cho JavaScript :-)
mellamokb
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.