Tulis penerjemah untuk 2B

12

Tulis penerjemah untuk 2B

Saya suka bahasa esoterik David Catt 2B, memiliki memori yang disimpan dalam rekaman di mana setiap sel adalah kaset byte yang terpisah ('subtape'). Tulis penerjemah untuk itu!

Spesifikasi Bahasa

Spesifikasi resmi dapat ditemukan di sini . Dalam spesifikasi ini, "berarti angka dalam kisaran 0-9( 0ditafsirkan sebagai 10), dan _berarti string dengan panjang berapa pun. Setiap sel menyimpan nilai dalam kisaran 0-255, dan overflow / underflow membungkus seperti halnya BF. (Terima kasih @ MartinBüttner). Untuk mengonversi teks menjadi angka 0-255, gunakan kode ASCII . Karena saya tidak dapat menemukan detail tentang ini, saya akan mengatakan bahwa panjang rekaman harus 255minimum, tetapi jika Anda tahu sebaliknya, silakan edit.

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

Tes

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

Haruskah output Hello world!


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

Semacam catprogram, hanya tanpa baris baru.


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

Pertama-tama harus menerima nama, kemudian, pada tekan Return, harus menampilkan Hello name(di mana nama adalah apa yang dimasukkan).

Penghargaan untuk program itu diberikan kepada David Catt .


Saya sedang mengerjakan program tes penuh.

Aturan

  • Celah standar dilarang
  • Penerjemah Anda harus memenuhi semua spesifikasi, kecuali untuk komentar, yang tidak diperlukan.

Mencetak gol

  • Ini , byte paling sedikit menang!
  • -10 byte jika penerjemah Anda menangani komentar.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

JimBobOH
sumber
4
Ide yang hebat! Berikut beberapa pemikiran: Tolong jelaskan jumlah sel per subtape, dan jumlah subtape yang harus kita gunakan dalam implementasi kami (atau tentukan apakah itu harus semacam adaptif / tak terbatas). Bagaimana seharusnya sebuah string input dikonversi ke angka 0-255? Mungkin kode ASCII?
flawr

Jawaban:

4

Python2, 748 736 731 709 704 691 byte

Ini adalah tantangan kecil yang menyenangkan, saya yakin saya bisa membuat kode ini lebih pendek (mungkin saya akan melakukannya nanti).

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

Implementasi ini membutuhkan label dan fungsi yang harus dinyatakan (diimplementasikan) sebelum dipanggil. Ini berfungsi dengan baik dengan dua tes yang diberikan tetapi sayangnya tidak bekerja dengan program "SayHi.2b" yang ditulis oleh penulis bahasa (bahkan setelah mengubah urutan deklarasi fungsi). Saya pikir masalah ini mungkin ada hubungannya dengan cara saya memahami sistem kaset dan subtape. Saat bergerak di sepanjang pita utama, apakah posisi pada subtape yang sesuai diatur ulang ke 0? Saat ini saya menjaga posisi pada subtape bahkan ketika bergerak pada kaset utama.

Ini versi yang lebih mudah dibaca:

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

Sunting: Mempertimbangkan penanganan komentar (-10 byte), memperbaiki kesalahan dengan satu kesalahan. Implementasi ini tidak mendukung panggilan fungsi bersarang (saya bisa mengimplementasikannya jika ini merupakan fitur yang diperlukan)

Sunting2: Mengubah fungsi penangan untuk melakukan penambahan, substraksi dan pergerakan sel. Lebih banyak lambda! : D ("Versi yang lebih mudah dibaca" mungkin tidak sinkron sekarang)

Edit3: Saya baru sadar bahwa menangani komentar biayanya 5 byte (dengan memperhitungkan -10). Jadi saya baru saja menghapusnya, sayang sekarang rasanya tidak lengkap.

Sunting4: memindahkan definisi n dari lambda ke var di dalam handler h ()

basile-henry
sumber
dengan begitu banyak +a+mungkin lebih baik untuk bergabung a? Ini juga akan menghilangkan Anda harus menugaskannya ke var.
Maltysen
Yah kecuali saya tidak bisa bergabung dengan string dalam kamus secara keseluruhan dan itu tidak layak dilakukan untuk setiap string secara terpisah. Menetapkan string ke hanya trik untuk mendapatkan beberapa byte sebenarnya tidak berguna untuk kode.
basile-henry
Saya kira saya tidak bisa mengeluh tentang urutan fungsi, karena saya tidak benar-benar menentukan itu, tetapi cobalah untuk membuat SayHi.2bfile berfungsi. Apa yang terjadi jika diubah untuk mengatur ulang subtape ke nol secara bergiliran?
JimBobOH