세번째 Flak! LotM 챌린지의 일부로 게시되었습니다. Brain-Flak

이 챌린지는 2018 년 4 월 LotM 챌린지의 일부로 게시되었습니다.


Brain-Flak 은 PPCG에 많은 명성을 얻은 타르 타르타르 언어입니다. 이 언어의 메모리는 두 개의 스택으로 구성되어 있지만 “숨겨진”세 번째 스택 Wizard에서 Wh e 의해 발견 되어 Brain-Flak 프로그램을 생각하는 흥미로운 새로운 방식으로 이어졌습니다.

그렇다면, 그 열악한 숨겨진 세 번째 스택에 더 많은 가시성을 제공하는 것은 어떻습니까? 세 번째 스택이 인식 할 수있는 언어를 만들어 봅시다! 여기에 나는 당신에게 Third-Flak을 선물합니다 .

언어

Third-Flak에는 세 번째 스택이라고하는 하나의 스택 만 있습니다. 운영자들은 뇌 – 플랙에서와 같은 방법으로 세 번째 스택에 작동하지만 여기에는 없다 [], {}, <>nilads없이 {...}모나드 (써드 플랙 프로그램에서 유일하게 허용 문자는 그래서는 ()[]<>). 각 연산자의 기능은 다음과 같습니다 (마지막 요소가 스택의 맨 위에있는 목록과 함께 세 번째 스택을 나타내는 예제가 제공됨).

  • ()Third-Flak에서 유일한 두 문자 연산자입니다. 세 번째 스택의 상단이 1 씩 증가합니다. 예 : [1,2,3][1,2,4]

  • (, [, <: 앞 케이스에 의해 덮여 있지 않은 모든 개구 괄호는 밀어 0제 스택. 예 : [1,2,3][1,2,3,0]

  • )세 번째 스택에서 두 개의 요소를 팝하고 합계를 되돌립니다. 예 : [1,2,3][1,5]

  • ]세 번째 스택에서 두 개의 요소를 팝하고 두 번째에서 첫 번째 요소를 뺀 결과를 뒤로 밀어냅니다. 예 : [1,2,3][1,-1]

  • >세 번째 스택에서 요소를 팝합니다. 예 [1,2,3][1,2]

그리고 언어의 다른 규칙은 다음과 같습니다.

  • 실행 시작시 세 번째 스택에는 단일 0 만 포함됩니다.

  • 프로그램 이 비어 []있거나 <>내부에있는 것은 금지되어 있습니다 (Third-Flak의 의미를 따르는 경우 어쨌든 noops 일 수 있지만 실제로 Brain-Flak에서 다른 의미를 가지므로 여기서 다시 만들 수 없습니다).

  • 프로그램 끝의 마지막 닫는 괄호가 누락 될 수 있다는 점을 제외하고 괄호는 항상 균형을 유지해야합니다. 예를 들어 [()<(()유효한 Third-Flak 프로그램입니다 (프로그램 끝의 세 번째 스택은 [1,0,1]).

  • 프로그램은 6 개의 허용 문자 만 포함 할 수 있습니다 ()[]<>. 프로그램은 비어 있지 않은 것으로 보장됩니다.

참고 : 빈 스택에서 팝업해야하는 상황을 처리 할 필요가없는 이전 규칙에 의해 암시됩니다.

도전

간단하게 Third-Flak의 통역사를 작성하십시오. 프로그램은 Third-Flak 프로그램을 입력으로 사용하고 프로그램 끝에서 세 번째 스택의 상태를 출력으로 반환해야합니다.

세 번째 스택의 상태를 명확하게 읽을 수 있고 출력 번호가 항상 같은 방식으로 인코딩되는 한 출력 형식은 유연합니다. 부정 행위를 시도하는 것이 좋습니다).

챌린지가 사소한 일이 아닌 한 출력 선택에 따라 관리 할 수있는 숫자의 범위가 제한 될 수 있습니다 ( 이는 기본 허점 이기 때문입니다 ).

테스트 사례

각 테스트 사례에서 첫 번째 줄은 입력이고 두 번째 줄은 스택의 상단이 마지막 요소 인 공백으로 구분 된 숫자 목록으로 표시됩니다.

[()<(()
0 1 0 1

[((((()()()()()))
0 0 0 5

((([()][()][()])))
-3

[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0

[()]<(([()])><[()]
-1 0 -1

(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2


답변

Brain-Flak , 276 바이트

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

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

당신은 이것이오고 있다는 것을 알아야했다.


답변

레티 나 0.8.2 , 64 48 46 바이트

\(\)
_
[([<]
¶
+1`¶(.*)\)|(.*)¶\2]|¶.*>
$1
%`_

온라인으로 사용해보십시오! 스택을 아래에서 위로 출력합니다. 음수가 아닌 정수로만 작동하며 마지막 테스트 사례는 너무 느리므로 링크에는 세 개의 테스트 사례 만 포함됩니다. 설명 : 스택이 내재적으로 프로그램보다 우선하므로 빈 문자열로 시작하여 단일 0을 나타냅니다. ()nilad은로 설정되어 _다른 열린 괄호들이 발생되는 것과 스택에 푸시 바꿈 제로로 설정되어 있지만, 단항으로 계산하는 데 사용된다. 그런 다음 닫기 브래킷은 한 번에 하나씩 처리되어 스택이 정확합니다. 는 )이전 개행을 삭제하고 맨 위 두 요소를 함께 추가하고 맨 ]위 요소를 삭제하고 스택의 이전 요소와 일치시켜 빼냅니다.>상단 요소 만 삭제합니다. 마지막으로 스택은 10 진수로 변환됩니다. 편집 : @Leo 덕분에 2 바이트가 절약되었습니다.


답변

파이썬 3 , 145144132122116109104 바이트

Leo 덕분에 -7 바이트!

그리고-린에게 5 감사합니다!

s=[0]
for i in input().replace('()',' '):s+=i in']>) 'and(i<'!'or(2-ord(i)%5)*s.pop())+s.pop(),
print(s)

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

꽤 표준적인 구현입니다. 그래도 읽을 수는 없습니다. 그래도 시작과 끝 괄호 사이를 확인하는 더 짧은 방법을 찾을 수 없다는 것에 실망했습니다.

한 줄짜리 시도 :

  • 124 바이트 (익명 함수) :

    lambda c:[s.append(i in']>) 'and(i<'!'or~-']>)'.index(i)*s.pop())+s.pop())or s for s in[[0]]for i in c.replace('()',' ')][0]
  • 115 바이트 (전체 프로그램) :

    s=[0];[s.append(i in']>) 'and(i<'!'or~-']>)'.index(i)*s.pop())+s.pop())for i in input().replace('()',' ')];print(s)

Append가 일반 과제보다 성가신 길다


답변

루비 , 98 91 바이트

->s{a=[i=0];s.chars{|c|a<<("([<"[c]?s[i,2]["()"]?1:0:a.pop*~-"]>)".index(c)+a.pop);i+=1};a}

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

초기 코드는 Jo King의 Python 답변과 비슷하게 작동하므로 소스 문자를 반복하기 전에 모든 ()하위 문자열을 다른 문자 로 대체 연산자로 대체했습니다 .

그러나 적어도 루비에서는 골퍼가 이것을하지 말고 약간 더 성가신 접근 방식을 선택했습니다. 여기서는 i소스 문자열에서 위치를 추적 하는 추가 인덱서를 유지 관리하고 여는 괄호가 발생할 때마다 현재 + 다음 문자 s[i,2]()연산자를 형성 하는지 확인합니다 . 이 경우 스택 맨 위에 0 대신 1을 넣고 )다음 단계에서 닫기 가 작업을 수행 하도록합니다 .


답변

05AB1E , 25 바이트

΄()1:v"0+0\0->"žuykè.V})

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

설명

Î                           # initialize the stack with 0 and the input
 „()1:                      # replace any occurrence of "()" in the input with 1
      v                }    # for each char y in this string
                žuyk        # get its index in the string "()[]<>{}"
       "0+0\0->"    è       # use this to index into the string "0+0\0->"
                     .V     # eval
                        )   # wrap the stack in a list

답변

SOGL V0.12 , 34 바이트

0,Ƨ() Iŗ{"(<[”č0ŗΖ)+ŗ ] -ŗΖ>Xŗ!!}⁰

여기 사용해보십시오!


답변

R , 182 177 바이트

function(P){for(k in utf8ToInt(gsub("\\(\\)",7,P))%%8){if(k%in%0:4)F=c(0,F)
if(k==7)F[1]=F[1]+1
if(k==1)F=c(F[2]+F[3],F[-3:0])
if(k==5)F=c(F[2]-F[1],F[-2:0])
if(k==6)F=F[-1]}
F}

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

스택의 맨 위가 맨이고 맨 아래가 마지막 인 스택을 반환합니다.

스왑 ()7다음과 코드 포인트 문자열보다 더욱 쉽게 작업에 golfier있는 고유 한 숫자 값을 얻기 위해 8 모드 계산한다.

R에서 벡터의 시작 부분을 다루는 것이 골퍼이므로 스택을 그렇게 구성합니다.

그런 다음이를보고 ), 또는 때 k==1, 그것은 스택의 상단에 추가 제로를 추가 그것의 golfier 그것을 추가하고 제거 할 수 있기 때문이다.