2B에 대한 통역사 작성


12

2B에 대한 통역사 작성

나는 David Catt 의 난해한 언어 2B를 좋아한다 . 각 셀이 별도의 바이트 테이프 ( '서브 테이프') 인 테이프에 메모리가 저장되어있다. 통역사를 작성하십시오!

언어 사양

공식 사양은 여기에서 확인할 수 있습니다 . 본 명세서 "에서, 범위 내의 숫자를 의미하고 0-9( 0로 해석 됨 10) _임의의 길이의 문자열을 의미한다. 각 셀은 range의 값을 저장 0-255하고 오버플로 / 언더 플로는 BF와 같이 줄 바꿈됩니다. (@ MartinBüttner에게 감사합니다). 텍스트를 숫자로 변환하려면 ASCII 코드를0-255 사용하십시오 . 이에 대한 세부 정보를 찾을 수 없으므로 테이프 길이가 최소 가되어야한다고 말하지만 다른 방법을 알고 있다면 편집하십시오.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(여기서 name 은 입력 된 내용 임).

그 프로그램에 대한 학점은 David Catt 에게갑니다 .


전체 테스트 프로그램을 진행하고 있습니다.

규칙

  • 표준 허점 은 금지되어 있습니다
  • 통역사는 필요하지 않은 의견을 제외한 모든 사양을 충족해야합니다.

채점

  • 이것은 이므로 가장 적은 바이트가 이깁니다!
  • 인터프리터가 주석을 처리하는 경우 -10 바이트

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# 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 바이트)를 고려하여 하나의 오류로 off를 수정하십시오. 이 구현은 중첩 함수 호출을 지원하지 않습니다 (필요한 기능인 경우 구현할 수 있음)

Edit2 : 더하기, 빼기 및 셀 이동을 수행하도록 처리기 기능을 변경했습니다. 더 많은 람다! : D ( "더 읽기 쉬운 버전"이 동기화되지 않았을 수 있습니다)

Edit3 : 방금 주석 처리에 5 바이트가 소요된다는 것을 깨달았습니다 (-10을 고려하여). 방금 제거했는데 이제는 불완전하다고 느끼는 것이 부끄러운 일입니다.

edit4 : 핸들러 h () 내부의 람다에서 var로 n의 정의를 옮겼습니다.


너무 많은 사람들과 +a+합류하는 것이 더 a좋을까요? 또한 var에 할당하지 않아도됩니다.
Maltysen

글쎄, 내가 사전에 문자열을 전체적으로 결합 할 수 없다는 것을 제외하고는 각 문자열에 대해 그렇게 할 가치가 없습니다. 문자열을 a에 할당하는 것은 코드에 실제로 유용한 바이트를 얻는 트릭입니다.
basile-henry

실제로 지정하지 않았지만 SayHi.2b파일 작동을 시도하기 때문에 함수 순서에 대해 불평 할 수 없다고 생각 합니다. 시프트시 서브 테이프를 0으로 재설정하도록 변경되면 어떻게됩니까?
JimBobOH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.