2B için bir tercüman yaz


12

2B için bir tercüman yaz

Gibi David Catt sitesindeki gizli dil 2B, her bir hücre bayt ayrı bir bant (bir bant depolanan bellek olan 'subtape'). Bunun için bir tercüman yaz!

Dil Özellikleri

Resmi şartnameyi burada bulabilirsiniz . Bu spesifikasyonda, "aralıktaki bir sayı 0-9( 0olarak yorumlanır 10) ve _herhangi bir uzunlukta bir dize anlamına gelir. Her hücre aralıkta bir değer depolar 0-255ve taşma / taşma bir BF'de olduğu gibi sarar. (Teşekkürler @ MartinBüttner). Metni sayılara dönüştürmek 0-255için ASCII kodlarını kullanın . Bu konuda hiçbir ayrıntı bulamadığım için, bant uzunluğunun 255minimum olması gerektiğini söyleyeceğim , ancak aksi halde lütfen düzenleyin.

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

Testler

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

Çıktı gerekir Hello world!


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

A sıralama catsadece bir satır olmadan, programın.


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

Önce bir ismi kabul etmeli, daha sonra, düğmesine basmak Returngerekir Hello name(burada isim girilen addır ).

Bu programın kredisi David Catt .


Tam bir test programı üzerinde çalışıyorum.

kurallar

  • Standart boşluklar yasaktır
  • Tercümanınız, yorumlar hariç, gerekli olmayan tüm özellikleri karşılamalıdır.

puanlama

  • Bu , çok az bayt kazanır!
  • Tercümanınız yorum yapıyorsa -10 bayt.

Liderler Sıralaması

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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


4
İyi fikir! Burada bazı düşünceler: Lütfen alt bant başına hücre sayısını ve uygulamalarımızda kullanmamız gereken alt bant sayısını tanımlayın (veya bir çeşit uyarlanabilir / sonsuz olup olmadığını belirtin). Bir giriş dizesi 0-255 sayılarına nasıl dönüştürülmelidir? ASCII kodları belki?
flawr

Yanıtlar:


4

Python2, 748 736 731 709 704 691 bayt

Bu eğlenceli küçük bir meydan okumaydı, bu kodu daha da kısa hale getirebileceğime eminim (belki bir noktada daha sonra yapacağım).

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

Bu uygulama, etiketlerin ve işlevlerin çağrılmadan önce bildirilmesini (uygulanmasını) gerektirir. Verilen iki testle mükemmel çalışıyor ancak maalesef dilin yazarı tarafından yazılan "SayHi.2b" programı ile çalışmıyor (fonksiyonların beyan sırasını değiştirdikten sonra bile). Bu sorunun bant ve alt bant sistemini anlama şeklimizle ilgili olması gerektiğini düşünüyorum. Ana bant boyunca hareket ederken, ilgili alt banttaki konum 0'a sıfırlanıyor mu? Şu anda ana bantta hareket ederken bile alt banttaki konumu koruyorum.

İşte daha okunabilir sürüm:

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

Düzenleme: Bir hata ile kapalı bir düzeltme, yorum işleme (-10 bayt) dikkate alın. Bu uygulama iç içe işlev çağrılarını desteklemiyor (gerekli bir özellikse uygulayabilirim)

Edit2: Toplama, çıkarma ve hücre hareketi yapacak işleyici işlevi değiştirildi. Daha fazla lambdalar! : D ("Daha okunabilir sürüm" artık senkronize olmayabilir)

Edit3: Sadece yorum işlemenin bana 5 bayta mal olduğunu fark ettim (-10 dikkate alınarak). Bu yüzden onu kaldırdım, şimdi tamamlanmamış hissetmesi utanç verici.

Edit4: n nin tanımını lambda'dan h () işleyicisinin içindeki değişkene taşıdı


bu kadar çok kişi +a+ile katılmak daha iyi olabilir ami? Ayrıca bir var atamak zorunda kurtulmak olacaktır.
Maltysen

Peki bir sözlükte dizeleri bir bütün olarak katılamaz ve her dize için ayrı ayrı yapmaya değer olmaz. Dizeyi a'ya atamak, kod için gerçekten yararlı hiçbir şey elde etmek için sadece bir numaradır.
basile-henry

Sanırım ben aslında belirtmedim gibi, fonksiyonların sırası hakkında şikayet edemez, ama SayHi.2bdosyayı çalışmaya çalışın . Bir vardiyada alt bandı sıfıra sıfırlarsa ne olur?
JimBobOH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.