Viết thông dịch viên cho 2B


12

Viết thông dịch viên cho 2B

Tôi thích ngôn ngữ bí truyền 2B của David Catt , có bộ nhớ được lưu trữ trong một băng trong đó mỗi ô là một băng byte riêng biệt ('phụ đề'). Viết một thông dịch viên cho nó!

Đặc tả ngôn ngữ

Thông số kỹ thuật chính thức có thể được tìm thấy ở đây . Trong đặc tả này, "có nghĩa là một số trong phạm vi 0-9( 0được hiểu là 10) và _có nghĩa là một chuỗi có độ dài bất kỳ. Mỗi ô lưu trữ một giá trị trong phạm vi 0-255và tràn / tràn kết thúc xung quanh giống như một BF. (Cảm ơn @ MartinBüttner). Để chuyển đổi văn bản thành số 0-255, sử dụng mã ASCII . Bởi vì tôi không thể tìm thấy chi tiết nào về điều này, tôi sẽ nói rằng độ dài băng phải là 255tối thiểu, nhưng nếu bạn biết cách khác xin vui lòng chỉnh sửa.

+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Instruction |                                                              Description                                                               |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 0           | Zeroes the current cell and clears the overflow/underflow flag.                                                                        |
| {           | If the current cell is zero, jump to the matching }.                                                                                   |
| }           | A placeholder for the { instruction.                                                                                                   |
| (           | Read a byte from the input stream and place it in the current cell.                                                                    |
| )           | Write the value of the current cell to the console.                                                                                    |
| x           | Store the value of the current cell in a temporary register.                                                                           |
| o           | Write the value of the temporary register to the console.                                                                              |
| !           | If the last addition overflowed, add one to the current cell. If the last subtraction underflowed, subtract one from the current cell. |
| ?           | Performs a binary NOT on the current cell.                                                                                             |
| +"          | Adds an amount to the current cell.                                                                                                    |
| -"          | Subtracts an amount from the current cell.                                                                                             |
| ^"          | Moves the subtape up a number of times.                                                                                                |
| V"          | Moves the subtape down a number of times.                                                                                              |
| <"          | Moves the tape left a number of times.                                                                                                 |
| >"          | Moves the tape right a number of times.                                                                                                |
| :_:         | Defines a label of name _.                                                                                                             |
| *_*         | Jumps to a label of name _.                                                                                                            |
| ~_~         | Defines a function of name _.                                                                                                          |
| @_@         | Calls a function of name _.                                                                                                            |
| %           | Ends a function definition.                                                                                                            |
| #_#         | Is a comment.                                                                                                                          |
| [SPACE]     | Is an NOP.                                                                                                                             |
| [NEWLINE]   | Is treated as whitespace and removed.                                                                                                  |
| [TAB]       | Is treated as whitespace and removed.                                                                                                  |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+

Xét nghiệm

+0+0+0+0+0+0+0+2)+0+0+9)+7))+3)-0-0-0-0-0-0-0-9)+0+0+0+0+0+0+0+0+7)-8)+3)-6)-8)-7-0-0-0-0-0-0)

Nên đầu ra Hello world!


+1:i:{()*i*}

Sắp xếp một catchương trình, chỉ cần không có một dòng mới.


+1:loop:{@ReadChar@*loop*}@PrintHello@@WriteAll@(~ReadChar~(x-0-3<2o^1>1+1>1%~PrintHello~+0+0+0+0+0+0+0+2)-1+0+0+0)+7))+3)+1-0-0-0-0-0-0-0-0)%~WriteAll~<1x:reverse:{<1v1>1-1*reverse*}o-1:print:{-1<1)^1>1*print*}%

Trước tiên, nên chấp nhận một tên, sau đó, khi nhấn Return, nên xuất ra Hello name(trong đó tên là những gì đã được nhập).

Tín dụng cho chương trình đó được gửi đến David Catt .


Tôi đang làm việc trên một chương trình thử nghiệm đầy đủ.

Quy tắc

  • Sơ hở tiêu chuẩn bị cấm
  • Thông dịch viên của bạn phải đáp ứng tất cả các thông số kỹ thuật, ngoại trừ các ý kiến, không bắt buộc.

Chấm điểm

  • Đây là , vì vậy ít byte nhất sẽ thắng!
  • -10 byte nếu trình thông dịch của bạn xử lý các bình luận.

Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes


4
Ý tưởng tuyệt vời! Dưới đây là một số suy nghĩ: Vui lòng xác định số lượng ô trên mỗi ô phụ và số lượng phụ mà chúng ta nên sử dụng trong các triển khai của mình (hoặc chỉ định liệu nó có phải là một loại thích ứng / vô hạn) hay không. Làm thế nào một chuỗi đầu vào nên được chuyển đổi thành số 0-255? Mã ASCII có lẽ?
flawr

Câu trả lời:


4

Python2, 748 736 731 709 704 691 byte

Đây là một thử thách nhỏ thú vị, tôi chắc chắn rằng tôi có thể làm cho mã này ngắn hơn nữa (có thể tôi sẽ làm điều đó vào một lúc nào đó).

from sys import*
w=stdout.write
p=open(argv[1],'r').read()
c,r,s,x,y,t,o=0,0,256,0,0,0,0
g=[[0]*s]*s
e=lambda d:p.find(d,c+1)
def h(i,j=0,k=0):global c,x,y;c+=1;n=1+(int(p[c])-1)%10;l=g[x][y]+n*i;g[x][y]=l%s;o=l/s;x=(x+n*j)%s;y=(y+n*k)%s
a="g[x][y]"
b="[p[c+1:i]]"
l={}
f={}
d={'0':a+"=0",'{':"if "+a+"<1:c=e('}')",'(':"i=stdin.read(1);"+a+"=ord(i)if i else 0",')':"w(chr("+a+"))",'x':"t="+a,'o':"w(chr(t))",'!':a+"+=o",'?':a+"=0if "+a+"else 1",'+':"h(1)",'-':"h(-1)",'^':"h(0,1)",'V':"h(0,-1)",'<':"h(0,0,-1)",'>':"h(0,0,1)",':':"i=e(':');l"+b+"=i;c=i",'*':"i=e('*');c=l"+b,'~':"i=e('~');f"+b+"=i;c=e('%')",'@':"i=e('@');r=i;c=f"+b,'%':"c=r"}
while c<len(p):
    if p[c]in d:exec d[p[c]]
    c+=1

Việc thực hiện này đòi hỏi các nhãn và chức năng phải được khai báo (thực hiện) trước khi được gọi. Nó hoạt động hoàn hảo với hai bài kiểm tra được đưa ra nhưng thật không may, nó không hoạt động với chương trình "SayHi.2b" được viết bởi tác giả của ngôn ngữ (ngay cả sau khi thay đổi thứ tự khai báo các hàm). Tôi nghĩ vấn đề này có thể liên quan đến cách tôi hiểu hệ thống băng và phụ. Khi di chuyển dọc theo băng chính, vị trí trên thiết lập lại phụ đề tương ứng thành 0? Hiện tại tôi đang giữ vị trí trên trang phụ ngay cả khi di chuyển trên băng chính.

Đây là phiên bản dễ đọc hơn:

#!/usr/bin/python

import sys
w=sys.stdout.write
p=open(sys.argv[1],'r').read()
c,r,s,x,y,t,o=0,0,256,0,0,0,0
# c is the current index in the program string
# r is the return index (for functions)
# s is the size of the tape, subtapes and modulo for ints (max int will be 255)
# x and y are the coordinates in the grid
# t is the temporary register
# o is overflow
g=[[0]*s]*s # initialise a grid 256x256 with 0

e=lambda d:p.find(d,c+1)
def n():global c;c+=1;i=int(p[c]);return i if i>0 else 10 # get the number specified
def h(i):j=g[x][y]+i;g[x][y]=j%s;o=j/s # handle addition and substraction
def m(i,j):global x,y;x=(x+i)%s;y=(y+j)%s # move current cell

a="g[x][y]" # string of current cell
b="[p[c+1:i]]" # key for label or function
l={} # dictionary of labels
f={} # dictionary of functions
d={'0':a+"=0",
   '{':"if "+a+"<1:c=e('}')",
   '(':"i=sys.stdin.read(1);"+a+"=ord(i)if i else 0",
   ')':"w(chr("+a+"))",
   'x':"t="+a,
   'o':"w(chr(t))",
   '!':a+"+=o",
   '?':a+"=0if "+a+"else 1",
   '+':"h(n())",
   '-':"h(-n())",
   '^':"m(n(),0)",
   'V':"m(-n(),0)",
   '<':"m(0,-n())",
   '>':"m(0,n())",
   ':':"i=e(':');l"+b+"=i;c=i",
   '*':"i=e('*');c=l"+b,
   '~':"i=e('~');f"+b+"=i;c=e('%')",
   '@':"i=e('@');r=i;c=f"+b,
   '%':"c=r",
   '#':"c=e('#')"
   }

while c<len(p): # loop while c is not EOF
    # print c, p[c]
    if p[c]in d:exec d[p[c]] # execute code kept as a string
    c+=1 # increment index

Chỉnh sửa: Hãy tính đến việc xử lý các bình luận (-10 byte), sửa lỗi bằng một lỗi. Việc triển khai này không hỗ trợ các lệnh gọi hàm lồng nhau (tôi có thể thực hiện nó nếu đó là một tính năng bắt buộc)

Edit2: Thay đổi chức năng xử lý để thực hiện phép cộng, chuyển động và di chuyển tế bào. Thêm lambdas! : D (Hiện tại "phiên bản dễ đọc hơn" có thể không đồng bộ hóa)

Edit3: Tôi mới nhận ra rằng việc xử lý các bình luận tiêu tốn của tôi 5 byte (có tính đến -10). Vì vậy, tôi chỉ cần loại bỏ nó, thật xấu hổ vì bây giờ nó cảm thấy không đầy đủ.

Edit4: chuyển định nghĩa của n từ lambda sang var bên trong trình xử lý h ()


với rất nhiều +a+có thể tốt hơn để tham gia a? Nó cũng sẽ giúp bạn thoát khỏi việc phải gán nó cho một var.
Maltysen

Chà, ngoại trừ tôi không thể tham gia các chuỗi trong toàn bộ từ điển và sẽ không đáng để làm điều đó cho từng chuỗi riêng biệt. Việc gán chuỗi cho a chỉ là một mẹo để thu được một số byte không có gì thực sự hữu ích cho mã.
basile-henry

Tôi đoán tôi không thể phàn nàn về thứ tự các chức năng, vì tôi thực sự không chỉ định điều đó, nhưng hãy cố gắng để SayHi.2btập tin hoạt động. Điều gì xảy ra nếu nó được thay đổi để đặt lại phụ đề về 0 khi thay đổi?
JimBobOH
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.