스택 고양이 프로그램을 납작하게


13

Stack Cats 는 뒤집을 수있는 스택 기반 언어입니다. 뒤집을 수있는 성질은 다소 이상한 고리를 만듭니다. 이 과제는 조건부 루프에 관한 것 (...)입니다. 이러한 루프가 특정 방식으로 중첩되면 중첩 깊이를 줄이기 위해 코드를 변환 할 수 있습니다. 다음은 규칙입니다 ( 임의의 스 니펫의 위치 A및 의미 B).

  1. 한 루프가 다른 루프를 시작했을 때, 우리는 전면 내부 루프를 추출 할 수 ((A)B)해진다 (A)(B).
  2. 한 루프가 다른 루프가 종료되면, 우리는 마지막에 내부 루프를 추출 할 수 (B(A))해진다 (B)(A).
  3. 빈 루프 ()는 프로그램에서 완전히 제거 할 수 있습니다. 다른 규칙과 함께 한 추론 ((A))에 해당합니다 (A).

남아있는 유일한 중첩 루프의 형식은 (A(B)C)어디에 A, B그리고 C비 비어 있습니다.

도전

유효한 Stack Cats 프로그램이 주어졌으며 위의 변환을 사용하여 빈 루프를 남기지 않고 중첩 수준을 최대한 줄이십시오.

유효한 Stack Cats 프로그램 ...

  • ... 문자 만 구성되어 있습니다 ()/\<>[]{}!"*+-:=ITX^_|.
  • ... 대칭 대칭이 있습니다 (예 : \(]{}!{}[)/유효한 프로그램이지만 /|/그렇지 않습니다).
  • ... 정확하게 일치하고 중첩 된 (){}( [], <>그리고 \/그들이 때문에 거울 대칭 요구 사항에 쌍으로 표시됩니다 있지만 반드시, 평소와 같이 일치 할 필요가 없습니다).

문자열 또는 문자 목록을 입력으로 사용할 수 있지만 출력은 동일한 형식으로 표시되어야합니다.

당신은 쓸 수 있습니다 프로그램이나 기능을 우리의 사용 표준 방법 입력을 수신하고 출력을 제공합니다. 참고 이러한 허점은 기본적으로 금지되어 있습니다.

이것은 이므로 바이트 단위로 측정 된 가장 짧은 유효한 답변이 이깁니다.

테스트 사례

테스트 사례는 빈 줄로 구분 된 두 줄 (입력 및 출력)입니다. 하나의 출력이 비어 있습니다. 또한 빈 입력을 지원해야합니다 (빈 출력이 발생 함).

(((=+|+=)))
(=+|+=)

({(=+|+=)})
({(=+|+=)})

((\)/)I(\(/))
(\)(/)I(\)(/)

(()()(())()())


((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)

확실히, 우리가 추출해야 할 루프는 괄호로만 표시 ()되므로 입력 {{A}B}은 그대로 유지되고 추출되지 {A}{B}않습니까?
케빈 크루이 ssen

@KevinCruijssen 예, 변환은 (...)-type 루프 에만 유효합니다 .
Martin Ender 2019

마지막 테스트 사례에서 왜 \^/괄호 안에 있습니까?
케빈 크루이 ssen

1
그 @KevinCruijssen 당신이 추출 후 가장 바깥 쪽 괄호는 (<|>((X((T)))[_]))(([_](((T))X))<|>).
Martin Ender 2019

1
아 알 겠어요 그래서 ((A)B(C))이 될 것 (A)(B)(C)모두 규칙 1과 2로 인해 이후 : ((A)B(C))(A)(B(C))(규칙 1) → (A)(B)(C)(규칙 2).
케빈 크루이 ssen

답변:


6

망막 0.8.2 , 113 (107) 67 66 바이트

+`\(\)|(\()?(\(((\()|(?<-4>\))|[^()])*(?(4)@)\))(?(1)|(\)))
$5$2$1

온라인으로 사용해보십시오! @MartinEnder 덕분에 3 4 바이트 절약이 포함됩니다 . 설명:

+`

일치하는 항목이 없을 때까지 대체를 반복해서 적용하십시오.

\(\)|

빈 루프를 일치 시키십시오 (이 경우 아무것도 대체되지 않으므로 대체는 단순히 루프를 삭제함).

(\()?

선택적으로 a와 일치합니다 (. 일치하는 경우 그룹 1에서 캡처되지만 일치하지 않으면 캡처되지 않습니다.

(\(

그룹 2에서 일치하는 본문을 캡처하고 a를 일치 (시킵니다.

(
 (\()
|
 (<-4>\))
|
 [^()]
)*

(를 그룹 4에서 캡처하거나 그룹 4에서 )캡처를 제거 하거나 (없는 경우 실패) 또는 다른 항목을 반복하여 일치 시킵니다.

(?(4)@)

그룹 4에 여분의 캡처가 남아 있지 않은지 확인하십시오.

\))

캡처 그룹 2를 다른 그룹으로 종료하십시오 ).

(?(1)|(\)))

캡처 그룹 1이 비어있는 경우 캡처 그룹 )5를 캡처하십시오 (따라서 두 그룹 중 정확히 하나가 캡처됩니다).

$5$2$1

그룹 1 또는 그룹 5에서 캡처 한 브래킷을 그룹 2의 다른쪽으로 이동합니다. 이는 일치하는면에 따라 내부 루프를 외부 루프의 앞 또는 끝으로 이동시키는 효과가 있습니다.


2

Stax v1.0.3 +, 76 65 64 62 58 바이트 CP437

îÜ•$o,Γ{í]Üf╒9♦╛üΣóç*\$ñ₧└ΦJ♠¥c╥jóu≥3E.╘ⁿ◄◘W₧<¶┼7úê╟┴zç↨aG

압축을 풀 때 70 바이트,

{{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md}X!:Rx!:Rc.()z:rgp

온라인으로 실행하고 디버그하십시오!

설명

{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}MdA((B)C)D네 부분으로 분리 하여로 변환 하는 블록입니다 A(B)(C)D.

X!:Rx!:R입력 문자열에서 블록을 실행 한 다음 (1 단계) 문자열 을 반영 합니다 (Stax에서 문자열 반사는 문자열을 역전하고 (변환) (<[{/을 (to)로 바꾸는 것을 의미 ) \}]>)얻은 문자열에서 블록을 실행 한 다음 다시 반영합니다 (2 단계). 2 단계는 본질적으로 변환된다 (A(B))(A)(B).

c.()z:r 빈 루프를 모두 제거하십시오 (3 단계).

gp반복의 수정 점을 찾는 생성기입니다. 이 경우 문자열은 더 이상 변경되지 않을 때까지 3 단계 프로세스로 반복됩니다.

암시 적 출력.


1

파이썬 (3) , 226 (223) 212 206 바이트

자, 여기 재귀 정규 표현식을 지원하지 않는 언어 로이 문제를 해결하려는 시도가 있습니다.

lambda s:g(g(s,*'()'),*')(').replace('()','')
def g(s,t,u):
 m,*a={},;i=v=0
 for c in s:
  i+=1;a+=[i]*(c==t)
  if c==u:*a,x=a;m[x]=i;v=m.get(x+1)
  if v:return g(s[:x]+s[x+1:v]+t+s[v:],t,u)
 return s[::-1]

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

편집 :

  • [::-1]Mr.Xcoder 덕분에 6 바이트를 절약하기 위해 리팩토링 되었습니다.

g함수는 기본 빌딩 블록으로,의 발생을 찾아서로 ((A)B)변경 (A)(B)한 다음 더 이상 변환 할 수 없을 때까지 결과에 적용됩니다.

주요 단계는 다음과 같습니다.

  • g입력에 정상적으로 적용하십시오 .
  • g뒤집힌 입력에 적용 합니다. 이 실행은 ))A(B(반전 된 입력에서 발생하는 것을 발견하여 효과적으로 처리합니다 (A(B)).
  • 의 발생을 모두 제거하십시오 ().

문제는 g제어 구조가 너무 나빠서 한 줄로 시도하면 부풀어 오를 수 있으므로이 솔루션을 기반으로 큰 개선이 가능하지 않다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.