세번째 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.