Напишіть перекладача для 2B


12

Напишіть перекладача для 2B

Мені подобається езотерична мова 2В Девіда Кетта , що пам'ять зберігається у стрічці, де кожна комірка є окремою стрічкою байтів ("підзаголовок"). Напишіть для нього перекладача!

Специфікація мови

Офіційну специфікацію можна знайти тут . У цій специфікації "означає число в діапазоні 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(де ім'я - те, що було введено).

Кредит на цю програму припадає на Девіда Кетта .


Я працюю над повною програмою тестування.

Правила

  • Стандартні лазівки заборонені
  • Ваш перекладач повинен відповідати всім технічним умовам, крім коментарів, які не потрібні.

Оцінка балів

  • Це є , тому виграє найменше байтів!
  • -10 байт, якщо ваш перекладач обробляє коментарі.

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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


4
Чудова ідея! Ось деякі думки: Будь ласка, визначте кількість комірок на підтапці та кількість підтасовок, які ми повинні використовувати у своїх реалізаціях (або вкажіть, чи має бути вона якоюсь адаптивною / нескінченною). Як слід ввести рядок введення в числа 0-255? ASCII-коди, можливо?
flawr

Відповіді:


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", написаною автором мови (навіть після зміни порядку декларування функцій). Я думаю, що ця проблема може бути пов'язана з тим, як я зрозумів систему стрічок і підкасет. Переміщення по головній стрічці повертається до 0? На даний момент я зберігаю позицію на підсерії навіть під час руху по головній стрічці.

Ось більш читаема версія:

#!/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 байт), виправляючи одну помилку. Ця реалізація не підтримує вкладені виклики функцій (я міг би її реалізувати, якщо це обов'язкова функція)

Edit2: Змінено функцію обробника для додавання, віднімання та переміщення комірок. Більше лямбда! : D ("Більш читабельна версія" зараз може не синхронізуватися)

Edit3: Я щойно зрозумів, що обробка коментарів коштує мені 5 байт (враховуючи -10). Тож я просто її зняв, прикро, що зараз це неповно.

Edit4: переміщене визначення n від lambda до var всередині обробника h ()


з такою кількістю +a+може бути краще приєднатися a? Це також позбудеться того, що вам доведеться призначити його вару.
Мальтісен

Ну хіба що я не можу приєднатись до рядків у словнику в цілому, і не варто робити це для кожного рядка окремо. Присвоєння рядка а - це лише хитрість отримати кілька байтів, що насправді не корисне для коду.
Базиль-Генрі

Напевно, я не можу поскаржитися на порядок функцій, оскільки я насправді цього не вказував, але спробуйте налагодити роботу SayHi.2bфайлу. Що станеться, якщо її змінити, щоб змінити підзаголовок на нуль за зміну?
JimBobOH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.