เขียนล่ามสำหรับ 2B


12

เขียนล่ามสำหรับ2B

ฉันชอบภาษาลึกลับของDavid Catt 2B มีหน่วยความจำเก็บไว้ในเทปที่แต่ละเซลล์เป็นเทปแยกไบต์ ('subtape') เขียนล่ามให้มัน!

ข้อกำหนดภาษา

สเปคอย่างเป็นทางการสามารถพบได้ที่นี่ ในสเปคนี้"หมายถึงตัวเลขในช่วง0-9( 0ถูกตีความว่าเป็น10) และ_หมายถึงสตริงที่มีความยาวใด ๆ แต่ละเซลล์เก็บค่าไว้ในช่วง0-255และโอเวอร์โฟลว์ / อันเดอร์โฟลว์จะพันรอบเหมือนที่มันเป็น BF (ขอบคุณ @ MartinBüttner) การแปลงข้อความให้เป็นตัวเลข0-255การใช้รหัส ASCII เนื่องจากฉันไม่สามารถหารายละเอียดเกี่ยวกับเรื่องนี้ได้ฉันจะบอกว่าความยาวของเทปควร255น้อยที่สุด แต่ถ้าคุณรู้อย่างอื่นโปรดแก้ไข

+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 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.                                                                                                  |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+

การทดสอบ

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

ควรส่งออก Hello world!


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

เรียงลำดับของcatโปรแกรมโดยไม่มีการขึ้นบรรทัดใหม่


+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*}%

ควรยอมรับชื่อก่อนแล้วกดReturnเอาท์พุทHello name(โดยที่ชื่อคือสิ่งที่ถูกป้อนเข้า)

เครดิตสำหรับโปรแกรมที่จะไปเดวิด Catt


ฉันกำลังทำงานกับโปรแกรมทดสอบเต็มรูปแบบ

กฎระเบียบ

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • ล่ามของคุณจะต้องตรงตามข้อกำหนดทั้งหมดยกเว้นสำหรับความคิดเห็นที่ไม่จำเป็น

เกณฑ์การให้คะแนน

  • นี่คือซึ่งมีจำนวนน้อยที่สุดที่จะชนะ!
  • -10 ไบต์หากล่ามของคุณจัดการกับความคิดเห็น

ลีดเดอร์บอร์ด

นี่เป็นตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวได้ ตัวอย่างเช่น

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


4
ความคิดที่ดี! ที่นี่ความคิดบางอย่าง: โปรดกำหนดจำนวนของเซลล์ต่อหนึ่ง subtape และจำนวนของรูปหลายเหลี่ยมที่เราควรใช้ในการใช้งานของเรา (หรือระบุว่ามันควรจะเป็นแบบปรับตัว / อนันต์) สตริงอินพุตควรถูกแปลงเป็นตัวเลข 0-255 อย่างไร บางทีรหัส ASCII?
ข้อบกพร่อง

คำตอบ:


4

Python2, 748 736 731 709 704 691 ไบต์

นี่เป็นความท้าทายเล็กน้อยที่สนุกฉันแน่ใจว่าฉันสามารถทำให้รหัสนี้สั้นลงได้ (บางทีฉันอาจจะทำในภายหลัง)

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

การนำไปปฏิบัตินี้จำเป็นต้องมีการประกาศเลเบลและฟังก์ชั่น (นำไปใช้) ก่อนที่จะถูกเรียกใช้ มันทำงานได้อย่างสมบูรณ์กับการทดสอบสองครั้งที่ให้มา แต่น่าเสียดายที่มันไม่สามารถใช้งานได้กับโปรแกรม "SayHi.2b" ที่เขียนโดยผู้เขียนภาษา (แม้หลังจากเปลี่ยนลำดับการประกาศของฟังก์ชัน) ฉันคิดว่าปัญหานี้อาจเกี่ยวข้องกับวิธีที่ฉันเข้าใจระบบเทปและ subtape เมื่อเคลื่อนย้ายไปตามเทปหลักตำแหน่งของการถอดซับเซ็ตที่เกี่ยวข้องจะถูกรีเซ็ตเป็น 0 หรือไม่ ในขณะนี้ฉันยังคงรักษาตำแหน่งไว้ใน subtape แม้ว่าจะเคลื่อนไหวบนเทปหลัก

นี่คือรุ่นที่อ่านได้มากขึ้น:

#!/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

แก้ไข: คำนึงถึงการจัดการความคิดเห็น (-10 ไบต์) แก้ไขข้อผิดพลาดเดียว การใช้งานนี้ไม่รองรับการเรียกใช้ฟังก์ชันที่ซ้อนกัน (ฉันสามารถใช้งานได้หากเป็นคุณสมบัติที่จำเป็น)

แก้ไข 2: เปลี่ยนฟังก์ชั่นการจัดการเพื่อทำการเพิ่มการลบและการเคลื่อนที่ของเซลล์ lambdas เพิ่มเติม! : D ("รุ่นที่อ่านได้มากกว่า" อาจไม่ซิงค์กันในตอนนี้)

แก้ไข 3: ฉันเพิ่งรู้ว่าการจัดการความคิดเห็นมีค่าใช้จ่ายฉัน 5 ไบต์ (คำนึงถึง -10) ดังนั้นฉันเพิ่งลบมันมันน่าละอายตอนนี้รู้สึกไม่สมบูรณ์

Edit4: ย้ายนิยามของ n จากแลมบ์ดาไปยัง var ภายใน handler h ()


มีหลายคน+a+ที่เข้าร่วมด้วยดีกว่าaไหม? นอกจากนี้ยังจะกำจัดคุณต้องกำหนดให้กับ var
Maltysen

ดียกเว้นฉันไม่สามารถเข้าร่วมสตริงในพจนานุกรมโดยรวมและมันจะไม่คุ้มค่าที่จะทำเช่นนั้นสำหรับแต่ละสตริงแยกกัน การกำหนดสตริงให้กับ a เป็นเพียงกลลวงเพื่อให้ได้จำนวนไบต์ที่ไม่มีประโยชน์สำหรับโค้ด
basile-henry

ฉันเดาว่าฉันไม่สามารถบ่นเกี่ยวกับลำดับของฟังก์ชั่นได้เพราะฉันไม่ได้ระบุอย่างนั้น แต่พยายามทำให้SayHi.2bไฟล์ใช้งานได้ จะเกิดอะไรขึ้นหากมีการเปลี่ยนแปลงเพื่อรีเซ็ตการ subtape ให้เป็นศูนย์ในกะ?
JimBobOH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.