TwoMega 해석


9

이 문제에서는 대한 통역 쓸 것 2 Ω (로 전사 TwoMega ), 느슨하게 기반으로하는 언어 브레인 퍽 무한 차원의 저장 공간을.

언어

2 Ω는 상태의 세 조각을 포함

  • 테이프 비트의 무한리스트이며,는 모두 0으로 초기화는 좌측의 요소, 우측 요소하지만있다.

  • 메모리 포인터 테이프의 요소의 지표 인 음이 아닌 정수이다. 더 높은 메모리 포인터는 오른쪽에있는 테이프 셀을 나타냅니다. 0의 메모리 포인터는 가장 왼쪽의 요소를 나타냅니다. 메모리 포인터는 0으로 초기화됩니다.

  • 하이퍼 큐브 개념적이며 하이퍼 큐브의 폭을 단지 2 셀마다 차원 결합하지만, 치수의 무한의 수를 의미한다 0으로 초기화 비트를 포함 각각의 셀의 차원 "박스" 세포는 셀 수 없습니다 .

하이퍼 큐브에 대한 인덱스 는 하이퍼 비트의 셀을 참조하는 무한 비트 목록입니다 (유한 차원의 하이퍼 큐브를 참조하기 위해 유한 비트 목록을 사용할 수있는 것과 동일 함). 테이프는 무한 비트 목록이므로 전체 테이프는 항상 하이퍼 큐브의 요소를 나타냅니다. 이 요소를 referent 라고합니다 .

2 Ω는 7 개 개의 다른 문자에 의미를 제공합니다 :

  • < 메모리 포인터를 1 씩 줄입니다. 0 미만으로 줄이면 정의되지 않은 동작이므로 처리 할 필요가 없습니다.
  • > 메모리 포인터를 1 씩 증가시킵니다.
  • ! 지시자에서 비트를 뒤집습니다.
  • . 지시자에서 비트를 출력합니다.
  • ^테이프의 메모리 포인터가 가리키는 셀 의 비트를 참조하는 비트 의 역수 로 바꿉니다 .
  • [x]x참조의 비트가 1 인 한 코드 를 실행합니다 .

도전

작업은 문자열을 입력으로 사용하고 해당 입력을 프로그램 으로 실행하는 프로그램을 작성하는 것 입니다.

이것은 따라서 가장 짧은 유효한 답변 (바이트 단위로 측정)이 이깁니다.

노트

  • 당신은 프로그램이 전적으로 문자로 구성된다고 가정 할 수 있습니다 <>!.^[]그리고 그것은 []제대로 중첩됩니다.
  • 통역사는 시스템의 사용 가능한 메모리에 의해서만 제한되어야합니다. 적절한 시간 내에 샘플 프로그램을 실행할 수 있어야합니다.

샘플 프로그램

인쇄 1 :

!.

인쇄 010 :

.!.!.

0을 영원히 인쇄 :

![!.!]

0을 영원히 인쇄하거나 !앞에 붙인 경우 1을 영원히 인쇄합니다 .

[.]![!.!]

2
작은 참고 사항 : 1테이프 의 s 수가 항상 유한하기 때문에 스토리지 셀 수는 실제로 계산할 수 없습니다 . 실제로, 자연수와 테이프 상태 (테이프 내용을 역방향 이진 숫자로 해석) 사이에 상당히 간단한 삭제가 있는데, 이는 Hypercube가 기본적으로 무한 1D 배열이며 정수 포인터 값의 비트플립 하여 액세스 함을 나타냅니다. , brainfuck에서와 같이 / 감소 대신에.
Lynn

또한, cat프로그램 작성에 대한 귀하의 초대 : 입력을위한 지시가없는 것 같습니다.
Lynn

2
더 많은 명령어 세트를 사용하는 샘플 프로그램이 있어야한다고 생각합니다. 두 가지 간단한 것 : .-단일 0을 인쇄 한 다음 존재합니다. !^!.-하나를 인쇄 한 다음 종료합니다. 그래도 더 좋을 것입니다. 현재 제출물을 확인하기 위해 제출물을 이해해야합니다 (따라서 투표하십시오!)
Jonathan Allan

@Lynn 입력은 셀에 1 또는 0을 가짐으로써 [0,0,0,0,0,0,0...](즉 !, 프로그램 시작시 a의 존재) 주어집니다 .
Esolanging 과일

그러면 [.]![!.!]셀의 값을 영원히 인쇄 할 수 있습니다
Leo

답변:


2

파이썬 2 , 167 바이트

t=h=I=0
m=1
E=''
for c in input():i='[<>!.^]'.find(c);E+=' '*I+'while+2**t&h: m/=2 m*=2 h^=2**t print+(2**t&h>0) t=t&~m|m*(2**t&h<1) #'.split()[i]+'\n';I-=~-i/5
exec E

온라인으로 사용해보십시오!

t 는 테이프입니다. t = 6 은 테이프가 [01110000]임을 의미합니다.

m 은 메모리 포인터의 거듭 제곱에 2입니다. 따라서 m = 8 은 테이프 비트 3을 가리키고 있음을 의미합니다.

h 는 하이퍼 큐브입니다. h = 80 (비트 4 및 6 세트)은 [0 0 0…] 및 [0 1 0…]의 비트가 설정되었음을 의미합니다.

심판의 비트를 읽으려면 2 t & h를 확인하십시오 . 뒤집기 위해 h ^ = 2 t를 수행 합니다.

명령어를 파이썬 코드로 번역하고 결과를 실행합니다. 나는 그동안 루프의 들여 쓰기 수준을 저장합니다.


프로그램 또는 두 번째 테스트 사례가 잘못되었습니다
wastl

@wastl 두 번째 테스트 사례가 잘못되었습니다. ;)
DLosc


2

자바 스크립트 (Node.js) 148 바이트

x=>eval(x.replace(e=/./g,c=>({'<':'u/=2','>':'u*=2','!':'e[v]^=1','.':'alert(+!!e[v])','^':'v=(v|u)^u*e[v]','[':'while(e[v]){'}[c]||'}')+';',v=u=1))

온라인으로 사용해보십시오!

튜링 완료

BoolFuck TwoMega
< >^>^>[!]^<<<<[!]^>>[!]!^>[!]!^>[!]!^<<<<(>^>^>1<<<<1>>0>0>0<<<<)
> ^<^<[!]^>>>>[!]^<<[!]!^<[!]!^<[!]!^>>>(^<^<1>>>>1<<0<0<0>>>)

오른쪽 몇 곳으로 이동하여 초기화해야하며 주소의 현재 및 오른쪽 1 비트를 1 ( >>>>>>>>^>^<) 로 초기화하십시오.

온라인으로 사용해보십시오!

nBoolFuck의 장소 는로 표기됩니다 (0, 0, ..., 0(n*0), [1], 1, 0, 0, ...).

를 들어 >, 그렇습니다 n=>n+1

     0 0 0 0 0[1]1 0 0 0 0
^    0 0 0 0 0[x]1 0 0 0 0
<    0 0 0 0[0]x 1 0 0 0 0
^    0 0 0 0[y]x 1 0 0 0 0, yx != 01
<    0 0 0[0]y x 1 0 0 0 0
[!]^ 0 0 0[1]y x 1 0 0 0 0, (0yx10) = 0
>>>> 0 0 0 1 y x 1[0]0 0 0
[!]^ 0 0 0 1 y x 1[1]0 0 0, (1yx10) = 0
<<   0 0 0 1 y[x]1 1 0 0 0
[!]! 0 0 0 1 y[x]1 1 0 0 0, (1yx11) = 1
^    0 0 0 1 y[0]1 1 0 0 0
<    0 0 0 1[y]0 1 1 0 0 0
[!]! 0 0 0 1[y]0 1 1 0 0 0, (1y011) = 1
^    0 0 0 1[0]0 1 1 0 0 0
<    0 0 0[1]0 0 1 1 0 0 0
[!]! 0 0 0[1]0 0 1 1 0 0 0, (10011) = 1
^    0 0 0[0]0 0 1 1 0 0 0
>>>  0 0 0 0 0 0[1]1 0 0 0

<작동 방식과 동일


이 번역이 유효합니까? boolfuck로 !>.인쇄 1하지만 TwoMega에서 !>^.1을 인쇄 하는 것으로 변환합니다 ( >테이프에 ^영향을 미치지 않음, 참조자가 1이므로 테이프에 영향을 미치지 않음)
Esolanging Fruit

@EsolangingFruit은 +>;[1]00... 1[0]0...(출력 0), !>^.수행 (0,0,...)=1, ptr=([0],0,...) (0,0,...)=1, ptr=(0,[0],...) (0,0,...)=1, ptr=(0,[1],...)(출력 0), 무슨 일이야?
l4m2

@EsolangingFruit for !>., boolfuck >의 유효한 명령 일뿐입니다 ...
ASCII-only

1
@ l4m2 TwoMega에서는 !테이프 셀이 아닌 지시자를 뒤집습니다 .
Esolanging 과일

@EsolangingFruit 그래서 여기에 무엇이 문제입니까?
l4m2

1

Brain-Flak Classic , 816 바이트

<>(((<(())>)))<>{(([][][])(((({}){}[])({}))({})[]([][](({})(({}())(({}){}{}({}(<()>))<{<>({}<>)}{}>))))))(([]{()(<{}>)}{}){<((<{}>))<>(()(){[](<{}>)}{}<{({}[]<({}<>)<>>)}{}{}>)<>({()<({}<>)<>>}<<>{<>(({}){}<>({}<>)[])<>}{}<>({()<({}[]<<>({}<>)>)>}{})<>(({})<<>{({}[]<({}<>)<>>)}({}<>)<>{({}<>)<>}>)<>>)<>({}<>)<>>}{}([]{()(<{}>)}{}){{}<>({})(<>)}{}([]{()(<{}>)}{}){(<{}<>({}<{((<({}[])>))}{}{((<(())>))}{}>)<>>)}{}([]{()(<{}>)}{}){(<{}<>({}<({}())>)<>>)}{}([]{()(<{}>)}{}){(<{}<>[({})]<>>)}{}([]{()(<{}>)}{})<{((<{}>))<>{}({}<{<>(({}){}<>({}<>)[])<>}{}<>({()<({}[]<<>({}<>)>)>}{})<>(((){[](<{}>)}{})<<>{({}[]<({}<>)<>>)}{}(<>)<>{({}<>)<>}>)<>>)<>({}<>)<>}{}(<>)<>{({}<>)<>}{}>()){((({}[]<>){(<{}({}<>)>)}{}())<{({}<({}<>)<>((((((([][][]){}){}){}()){}){}({})())[][])>{[](<{}>)}{}{()(<{}>)}{})}{}({}<>)>[]){{}(<>)}}{}}

온라인으로 사용해보십시오!

이 코드는 방금 작성되었으므로 Turing-completeness의 증거를 작성할 수 있습니다.

튜링 완성도 증명

Boolfuck에서 TwoMega 로의 축소를 보여줍니다.

Boolfuck   TwoMega
>          >>
<          <<
.          !^!.!^!
[          !^![!^!
]          !^!]!^!
+          !^[!]^[>!^<[!]!^>[!]!^<]

이 변환은 Boolfuck 상태를 TwoMega의 짝수 번호 테이프 셀에 저장합니다. 번역 된 모든 명령은 다음과 같은 불변을 유지합니다.

  • 메모리 포인터는 짝수 셀에 있습니다.
  • 홀수 번째 테이프 셀은 모두 0입니다.
  • 홀수 셀이 모두 0 인 가능한 테이프의 경우 하이퍼 큐브의 해당 값은 0입니다.

코드 조각은 !^!계속됩니다 [0]0사이에 일정하고 스왑을 0[0]하고 [1]1(주의가 메모리 포인터를 이동하지 않고 하이퍼 큐브의 도달에 선으로 제한된다). 따라서 현재 테이프 값을 Boolfuck 명령에 대한 참조 파일에 임시로 넣는 데 사용됩니다.

TwoMega에 ,예상되는 의미가 있는 입력 명령이 제공 되면 Boolfuck 명령 ,은로 변환됩니다 >^<,!^>[!]!^<. 이후 ,Boolfuck은 튜링 완료되었음을 입증 할 필요는 없습니다, 입력 명령의 부족이 증거에 영향을주지 않습니다.


주로 큐브 자체가 아닌 하이퍼 큐브의 위치에 정보를 저장합니까?
l4m2

@ l4m2 BoolFuck에서 축소 한 내용은 큐브 자체에 데이터를 저장하지 않습니다. 내가 하이퍼 큐브에서 만든 1은 테이프 셀을 0으로 설정하기 위해서만 존재합니다.
Nitrodon

0

파이썬 3 , 297 284 274 바이트

ovs와 Jonathan Allan 덕분에 -10 바이트

C=input()
h={}
t=set()
def f(C,p):
 c=C[0];r=hash(frozenset(t));v=h.get(r,0)
 p={"<":p-1,">":p+1}.get(c,p)
 if'"'>c:h[r]=not v
 if"."==c:print(int(v))
 if"]"<c:t.discard(p)if v else t.add(p)
 if"["==c:
  while f(C[1:],p):1
 else:return c=="]"and v or C and f(C[1:],p)
f(C,0)

온라인으로 사용해보십시오!


t.discard(p)->t-={p}
shooqie

@shooqie 즉 않는 한 작동하지 않는 t것입니다 global.
fergusq

@fergusq 비록 당신이 다음 f과 같이 선언하면 작동한다고 확신합니다f(C,p,t=set())
shooqie

0

, 75 71 바이트

lPB0aR:^"!><[].^_""!:_
--viPU0
++v
W_{
}
O_
i@v:!_LFBilPB0
l@FBi"^n;Vau

온라인으로 사용해보십시오!

2 변환 Ω에 해당하는 핍 코드 및 평가하여 그것으로 코드를.

i테이프, v테이프 포인터 * 및 l하이퍼 큐브 를 나타내는 데 사용 합니다 . 처음 두 가지는 유용한 값으로 미리 초기화됩니다. l로 시작하여 색인 생기-빈 목록 문제를 피하기 위해 ( )를 []누릅니다 .0lPU0

* 실제로 테이프 포인터를 비트 단위로 무시합니다. 왜냐하면 우리는 10 진수로 쉽게 변환 할 수 있도록 테이프를 뒤로 저장하기 때문입니다.

나머지 코드는 다음과 같습니다.

aR:...;     Do a bunch of replacements in a, translating it into Pip code
       Va   Evaluate a
         u  Suppress output of the final expression that was evaluated

번역 표 :

!  !:_
>  --viPU0
<  ++v
[  W_{
]  }
.  O_
^  i@v:!_LFBilPB0
_  l@FBi

l@FBil인덱스에서 하이퍼 큐브의 요소 : 요소입니다 ( i바이너리에서 변환 ). 우리가 전화를, 그래서 그것은 종종 나타납니다 _및 교체 _끝에 실제 코드.

  • !:_ 논리적으로 해당 지시자를 부정합니다.

  • --viPU0감소 v(테이프 포인터를 오른쪽으로 이동); 그런 다음 테이프 포인터가 바운드에 있도록 다른 0을 왼쪽으로 밉니다 i.

  • ++v증분 v(OP 당 경계 검사 불필요)

  • W_{지시자가 진실한 동안 (즉, 0이 아닌, 즉 1) 루프를 실행합니다 .

  • } 루프를 닫습니다.

  • O_ 줄 바꿈없이 지시자를 출력합니다.

마지막으로, 대한 ^:

i@v:            Set the current tape cell to
    !_          The logical negation of the referent
                Now, make sure the list representing the hypercube is long enough:
      LFBi      Loop frombinary(i) times:
          lPB0  Push another 0 to the end of l
                This ensures that FBi will always be a valid index into l
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.