세번째 Flak!


19

이 챌린지는 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

스택이 0으로 초기화됩니까? 그렇지 않으면 [()]빈 스택에서 터지는 것에 대해 걱정할 필요가 없다는 규칙을 어기 게됩니다
Jo King

1
@JoKing Yep : "실행 시작시 세 번째 스택에는 단일 0 만 포함됩니다". 어쩌면 나는 그 부분을 약간 강조해야 할 것입니다.
Leo

죄송합니다. 제가 어떻게 놓쳤는 지 모르겠습니다
Jo King

7
교차 e는 여전히 e입니다.
밀 마법사

2
아무도 그것을 볼 수 없다면, 교차 된 부분 e여기에 있습니다 .
user202729

답변:


21

Brain-Flak , 276 바이트

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

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

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


4

레티 나 0.8.2 , 64 48 46 바이트

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

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


무엇입니까 $3? (어쨌든 큰 대답입니다!)
Leo

@Leo 그것은 이전 골프에서 남은 것입니다. 그것을 발견해 주셔서 감사합니다!
Neil

4

파이썬 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가 일반 과제보다 성가신 길다


~-']>)'.index(i)(2-ord(i)%5)4 바이트를 절약 할 수 있습니다 .
Lynn

2

루비 , 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을 넣고 )다음 단계에서 닫기 가 작업을 수행 하도록합니다 .


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


1

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 그것을 추가하고 제거 할 수 있기 때문이다.



1

실론, 285,266 바이트

function f(variable String c){variable Integer[]s=[0];value o=>[s[0]else nothing,s=s.rest][0];void u(Integer i)=>s=[i,*s];while(c!=""){if(c[0:2]=="()"){u(1);c=c.rest;}switch(c[0])case(')'){u(o+o);}case(']'){u(-o+o);}case('>'){noop(o);}else{u(0);}c=c.rest;}return s;}

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

(Leo의 제안으로 19 바이트를 절약했습니다.)

형식화 및 의견 :

// Interpreter for ThirdFlak
// Question:    /codegolf//q/163242/2338
// This answer: /codegolf//a/163403/2338
//
// This function takes the code as a string, and returns the value
// of the stack as a sequence of Integers.
function f(variable String c) {
    // stack, in the beginning just a single 0.
    // Top element of the stack is the first, because push + pop is easier this way.
    variable Integer[] s = [0];
    // pop – used like an Integer variable (not a function – this saves the `()`), but has side effects.
    value o =>
        // `s[0]` is the first element of the stack. We tell the compiler
        // that it is non-null (otherwise we'll get an error at run time)
        // using the `else nothing`. `s.rest` is `s` without its first element.
        // Both together are wrapped into a 2-tuple, of which we then take just
        // the first element, to have both together in an expression instead
        // the longer way using an accessor block with a temporary variable and a return.
        // value o {
        //   value r = s[0] else nothing;
        //   s = s.rest;
        //   return r;
        // }
        [s[0] else nothing, s = s.rest][0];
    // push
    void u(Integer i) =>
        // a tuple enumeration, using the spread argument.
        s = [i, *s];
    // the main loop
    while (c != "") {
        if (c[0:2] == "()") {
            // »`()` is the only two-characters operator in Third-Flak. It increases the top of the third stack by 1.«
            // As `)` alone adds the two top elements together, we can just push a one here, and let the handling for `)` do the rest.
            u(1);
            c = c.rest;
        }
        switch (c[0])
        case (')') {
            // »`)` pops two elements from the third stack and pushes back their sum.«
            u(o + o);
        }
        case (']') {
            // »`]` pops two elements from the third stack and pushes back the result of subtracting the first from the second.«
            // As the o written first is the first one, we can't write this as a subtraction.
            u(-o + o);
        }
        case ('>') {
            // »`>` pops an element from the third stack.«
            // `o;` alone is not a valid statement, so we pass it to the `noop` function.
            noop(o);
        }
        else {
            // all other valid code characters are `(`, `[`, `<`, which all just push a 0.
            u(0);
        }
        c = c.rest;
    }
    return s;
}

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


나는 실론을 모르지만, 아마도 스위치의 첫 번째 케이스를 제거하고 else 부분을 사용하여 모든 여는 괄호를 관리 할 수있을 것입니다 :)
Leo

흠, 나는 그것이 효과가 있다고 생각합니다 ... 유효하지 않은 입력에 대한 행동을 바꿀 것이지만 문제는 아닙니다.
Paŭlo Ebermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.