Stack Cats 스타일의 유효한 Stack Cats 프로그램인지 확인하십시오!


16

배경

Stack Cats 는 Martin Ender가 만든 뒤집을 수있는 난해한 언어입니다. Stack Cats의 각 명령은 자체의 역수 ( -_:T|) 와 같은 대칭 문자로 표시 되거나 역 명령 ( () {} [] <>) 과 같은 미러 이미지로 표시됩니다 . Stack Cats는 전체 프로그램이 자체의 미러 이미지 여야한다는 강력한 구문 요구 사항을 가지고 있습니다. 이는 유효한 Stack Cats 프로그램이 자연스러운 미러 이미지 앰비 그램 임을 의미합니다 .

Stack Cats의 전체 명령 세트는 다음과 같습니다.

  • 자기 대칭 : !*+-:=ITX^_|
  • 대칭 쌍 : () {} [] <> \/

다른 문자는 유효하지 않습니다. 위의 문자 세트에없는 문자를 가진 입력은 모두 false를 출력해야합니다.

이 언어에는 추가적인 제약 조건이 ()있으며 {}쌍은 항상 균형을 유지해야하지만 단순성을 위해이 조건을 확인할 필요는 없습니다.

다음은 유효한 Stack Cats 프로그램의 예입니다 (균형 괄호를 확인하지 않음).

{[+]==[+]}
[)>^<(]
({T)}|{(T})
<(*]{[:!-_:>}<[<)*(>]>{<:_-!:]}[*)>

이것들은 아닙니다 :

b<+>d
())(
({[<++<]})

도전

주어진 문자열이 유효한 Stack Cats 프로그램인지 확인하는 프로그램이나 함수를 작성하십시오. 코드는 자연스러운 미러 이미지 ambigram이어야 합니다.

  • 코드는 자체의 미러 이미지 여야합니다.
    • 전체 코드가 자연스럽게 표시되는 한 코드에는 하나 이상의 줄 바꿈이있을 수 있습니다.
    • 디스플레이를 변경하지 않기 때문에 각 줄에 후행 공백을 생략하거나 추가 할 수 있습니다.
    • 탭 문자는 표시하기에 모호성이 있으므로 허용되지 않습니다.

참고 : 코드가 유효한 Stack Cats 프로그램 일 필요 는 없습니다 . Stack Cats에서는 허용되지 않는 추가 문자가 포함될 수 있습니다. (전체 목록은 아래를 참조하십시오.)

예를 들어, 다음 두 프로그램은 대칭 (따라서 유효한 제출 )이지만 세 번째는 그렇지 않습니다.

({bTd})
[<q|p>]
({bTd})
  IXI
({bTd})
IXI
  • "미러 대칭"과 관련하여 스택 고양이 스타일의 대칭 만 고려됩니다 (예 : ({IH})미러 대칭이 있어도 유효한 제출물은 아닙니다).
  • 코드에는 다음 문자 세트와 개행 문자 만 포함될 수 있습니다.
    • 자기 대칭 : 공간 ( 0x20) +!"'*+-.8:=AHIMOTUVWXY^_ovwx|
    • 대칭 쌍 : () /\ <> [] bd pq {}

문자 세트는 SE에서 코드로 표시 될 때 엄격하게 대칭이거나 자체 대칭이되도록 선택됩니다.

입력과 출력

입력 범위는 인쇄 가능한 ASCII 문자의 한 줄 문자열입니다 .

문자열, 문자 목록 또는 ASCII 값 목록으로 입력하도록 선택할 수 있습니다.

다음 중 하나를 출력하도록 선택할 수 있습니다.

  • 선택한 언어로 정의 된 진실 / 거짓 값
    • 실제 결과 값은 입력에 따라 다를 수 있습니다 (예 : 정확한 입력의 경우 출력 1과 다른 확실한 입력의 경우 2).
    • 진실과 허위 가치를 교환하는 것은 허용되지 않습니다.
  • 각각 true / false에 대한 두 개의 상수 값
    • 이 경우 결과 값은 두 상수 값 중 하나 여야합니다.

제출시 입력 방법과 출력 값을 지정해야합니다.

승리 조건

이것은 이므로 각 언어에서 가장 낮은 바이트가 이깁니다.

노트

  • 표준 허점 은 평소와 같이 금지되어 있습니다.
  • 물론 Stack Cats 에서이 문제를 해결할 수 있지만 코드 크기를 절반으로 줄일 수있는 플래그를 사용할 수는 없습니다. 그리고 말하기 어려운 언어입니다 : P

1
왜 날카롭지 #않은가?
tsh

1
@tsh SE의 코드 글꼴을 포함하여 많은 글꼴로 약간 왜곡되어 있습니다 (적어도 Chrome에서는 표시됩니다).
Bubbler

@DLosc 나는 그 주위의 몇 가지 요점을 명확히하려고 노력했다. 그러나 설명이 여전히 명확하지 않다고 생각되면 자유롭게 편집하십시오.
Bubbler

답변:


16

자바 스크립트 (ES6), 487 467 378 298 292 280 266 264 바이트

@Bubbler 덕분에 14 바이트 절약

I=>(V=v=>!I[v]||((T=o=>[[]][+!!A[o]]||[(I[v]!=A[o]||A)[o^o<88/8]]+T(++o))(8-8)==I.pop())*V(++v))(V|(A='(){}[]<>\\/ !*+-:=ITX^_|'))//\\(('|_^XTI=:-+*! \//<>[]{}()'=A)|V)((v++)V*(()qoq.I==(8-8)((o++)T+[[8\88>o^o](A||[o]A=![v]I)]||[[o]A!!+][[]]<=o=T))||[v]I!<=v=V)<=I

문자 배열을 가져와 원하는 출력을 반환하는 익명 함수를 정의합니다. 결과는 진실 / 거짓입니다. 일반적으로 1/ 0이지만 빈 문자열은 제공합니다 true.

어떻게?

가장 분명한 요령은 //\\미러링 된 버전의 코드를 주석 처리하기위한 중심점 으로 사용 하는 것입니다. 그 후에는 주어진 문자 세트 만 사용하여 문제를 해결하는 가장 짧은 방법을 찾는 게임이됩니다.

우리가 겪는 첫 번째 문제는 키워드와 내장 기능이 없다는 것입니다. 우리는 기적적으로 여전히 있지만 .pop(), 다른 모든 것은 루프를 에뮬레이트하기 위해 재귀와 함께 허용 된 연산자 ( a[b]및 포함 f(c)) 를 통해 수행되어야합니다 .

두 번째 문제는 논리 연산자가 없다는 것입니다. 나도 &?수단, 이는 허용되지 않습니다 우리가 사용할 수있는 의사 결정 연산자입니다 ||. 따라서이를 설명하기 위해 논리를 신중하게 구성해야합니다.

내가 한 첫 번째 일은 T개별 문자를 반영하는 함수를 정의하는 것이 었습니다 . 기본 아이디어는 미러 가능한 문자 문자열에서 각 문자를 반복하여 주어진 문자와의 동등성을 테스트하는 것입니다. 이 같은 경우, 우리는 자사의 거울 숯불을 반환 index^1에 대한 (){}[]<>\/, 또는 휴식을위한 문자 자체.

내가 여기에서 겪었던 첫 번째 문제는 각 반복에서 미러 된 문자 또는 잘못된 값을 얻는 것이 었습니다. 이 솔루션의 나는 결국했다 해낸 (x!=A[o]||A)[o^o<88/8]경우, x입력 문자 A미러링 알파벳이며, o현재의 인덱스입니다. x와 같지 않으면 이 값 A[o]이 주어 true지고 인덱스 표현식 은 다음과 같이 평가됩니다 undefined. 그렇지 않으면가 ||A활성화되어 결국을 얻습니다 A[o^(o<11)].

두 번째 문제는 재귀를 종료하는 방법입니다. 이 작업을 수행하는 가장 좋은 방법은 모든 반복의 결과를 단순히 연결하고 끝에 A도달 하면 빈 문자열을 반환하는 것 입니다. 이것은 undefineds를 빈 문자열 로 변환하고 빈 문자열을 반환하는 두 가지 문제가 더 있습니다 ||. 이것들은 배열 남용으로 해결할 수 있습니다 : [a]+""의 문자열 표현을 제공 a하거나 a정의되지 않은 경우 빈 문자열을 제공합니다 . 보너스로, []진실하지만 빈 문자열로 묶습니다. 그래서 우리는 이것을 "truthy empty string"으로 편리하게 사용할 수 있습니다.

이제이 T함수를 사용하여 단일 문자를 미러링 할 수 있습니다 . 우리는 문자 배열의 끝에 도달 I[v++]I.pop()때까지의 거울을 비교하면서 재귀 적으로 수행합니다 . 모든 비교가 사실인지 확인 &&하거나 사용할 수 &는 없지만 *대신 사용하십시오. 이 모든 결과를 곱 1하면 모든 문자가 반대 문자의 거울인지 또는 0비교가 실패하는지 알 수 있습니다.

이것이 기본적으로이 답변의 작동 방식입니다. 아마 그것을 명확하게 설명하지 않았을 수도 있으므로, 질문이 있으시거나 제가 저지른 실수를 지적하십시오.


U=([A,...H])=>!(V=H.pop())||!(W=([x,...X]=(T="!*+-:=ITX^_|")+"(){}[]<>\\/",[o,...O]=T+")(}{][></\\")=>!x||((o!=A)+(x!=V))*(W(X,O)))()*U(H)//...280 바이트
tsh

@tsh 쉼표 는 소스 코드에서 대칭이 아니며 (SE 코드 글꼴로) 거울이 없기 때문에 (ASCII에서는) 없습니다.
ETHproductions

미안, 나는 그 부분을 놓쳤다.
tsh

@tsh 나는 처음에 그것을 놓 쳤고, 그것이 유효하지 않다는 것을 깨닫기 위해서만 솔루션에 20 분을 보냈다 : P
ETHproductions

어쨌든 이미 JavaScript 솔루션을 게시했기 때문에. 우리는 지금 또 다른 JSF * k 솔루션을 필요로하지 않습니다 ... // 내가 당신이라면 JSF * k로 컴파일하여이 문제를 해결할 것입니다.
tsh

1

Stax , 76 70 바이트

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq*!-W:"|_^XTI=:-+*!\>])}"_=_HM^^xW:

실행 및 디버깅

Stax는 Stack Cats의 친구이며 Stack Cats 프로그램의 후반부를 상반기부터 생성 할 수있는 내부 기능을 갖추고 있습니다. 소스 제한에 신경 쓰지 않고 문자셋을 확인할 필요가없는 경우 4 바이트 솔루션은 다음과 같습니다.

4 바이트

:R_=

실행 및 디버깅

설명

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq...
:W                                         "Mirror" the string
                                           Equivalent to appending the reverse of the string to itself
                                           And map `{([</\>])}` to its mirror in the appended string
  x^^                                      2, but we can't just use `2` here ...
     MH                                    Partition the "mirror"ed string to two parts, take the later part.
       _=                                  The string is the same as the original one (*)
                                           `:Wx^^MH_=` is just `:R_=`, but we can't use `R` here ...
         _                                 Input string
          "{([</!*+-:=ITX^_|":W-           Remove valid characters from input
                                !          The final string is empty (**)
                                 *         (*) and (**)
                                  p        Pop and print result
                                   q       Peek stack and print
                                           Since the stack is now empty, this causes the program to terminate
                                    ...    Not executed

의 존재 RW정말 흥미 롭습니다. pq조합에 의한 프로그램 종료 도 인상적입니다.
Bubbler

감사합니다. 명령어는 실제로 2 바이트입니다 : :R:W. Stax에 내부 직원이 있다고 말하는 모든 사람에게 도움을 줄 수 없다고 생각합니다.
Weijun Zhou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.