소개
이 과제는 2D 패턴 일치 언어 인 Grime 에서 영감을 얻었습니다 . 기본적으로 2 차원 문자 격자를 설명하는 "문법"이 주어지며, 작업은 문법에 따라 격자를 생성하는 것입니다. 또한 그리드는 약한 의미에서 가능한 한 작아야합니다.
입력
귀하의 입력은 소문자 ASCII 문자와 기호가 포함 된 문자열 |
과 -
. 편의상 입력에 반복되는 소문자가 포함되지 않습니다. 문자열은 문자의 사각형 그리드 클래스에 대한 스펙이며 다음과 같이 스택을 사용하여 왼쪽에서 오른쪽으로 구문 분석됩니다.
- 소문자가 주어지면, 문자 그리드를
c
스택에 밀어 넣으 십시오 .m×n
c
m, n ≥ 1
- 파이프 주어
|
두 격자 팝A
과B
스택에서 (B
위에 WAS), 그리드 밀어AB
연결함으로써 얻어진B
오른쪽을A
. 이 것을 요구A
하고B
동일한 높이를 가지고있다. - 하이픈이 주어지면
-
두 개의 그리드A
와B
스택 (B
위에 있음)을 팝 하고의 하단A/B
에 연결B
하여 얻은 그리드 를 밉니다A
. 이 것을 요구A
하고B
동일한 폭을 가지고있다.
이를 위해 보장되는 일부 의 선택 m
하고 n
(각 문자에 대해 상이 할 수 있음) 파싱 과정 중에 입력 사양 올바르게 단부에서 스택에 남아있는 일부 구형을 설명한다.
산출
출력은 입력으로 지정된 직사각형 문자 격자입니다. 행이나 열을 제거하면 무효화 될 수 있다는 점에서 그리드는 최소화되어야합니다. 줄 바꿈으로 구분 된 문자열 (후행 줄 바꿈 유무에 관계없이), 2D 문자 배열 또는 문자열 배열 중 가장 편리한 형식을 반환 할 수 있습니다.
위에서 설명한대로 입력을 처리 할 필요는 없습니다. 유일한 중요한 것은 출력이 정확하다는 것입니다.
예
사양을 고려
par-s||e-
첫째, 우리는 밀어 선택 1×2
의 사각형을 p
, 그리고 1×1
의 사각형 a
과 r
(그 이유는 나중에 분명히 할 것이다). 그런 다음 사각형 a
과 r
사각형 을 팝 하고 세로 연결을 누릅니다.
a
r
다음으로 우리는 1×2
사각형을 밀어 넣고 s
, 위 사각형을 터 뜨리고 가로 연결을 밀어 넣습니다.
as
rs
그런 다음 사각형과 사각형을 팝 p
하고 연결을 푸시합니다.
pas
prs
마지막으로 우리는 3×1
사각형을 밀어 넣고 e
위 사각형을 밀어 수직 연결을 밀어 넣습니다.
pas
prs
eee
이것은 프로그램의 출력이거나 적어도 하나의 가능성입니다. 그럼에도 불구하고
ppas
ppas
pprs
eeee
많은 행과 열을 제거 할 수 있으므로 스펙에 의해 생성되는 경우 올바른 출력이 아닙니다.
더 미묘한 예로서, 고려
co|m|p|il|e|r|-
이 사양은 사각형을 생성합니다
comp
iler
유효한 출력입니다. 그러나 또한 생성
commp
iiler
단일 행 또는 열을 무효화하지 않고 제거 할 수 없으므로 유효합니다.
규칙
당신은 전체 프로그램이나 기능을 제공 할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점은 허용되지 않습니다.
추가 테스트 사례
이를 사용하여 프로그램을 테스트 할 수 있습니다.
Input:
a
Output:
a
Input:
co|mp|l|-ex|i|f|-y|
Example output:
cccoy
mplly
exify
Input:
ja-r|g-o|ni-|ze|d-|
Example output:
jronze
arondd
ggoidd
Input:
un|co|p-yr|i|gh-t-ab|-|le-||-
Example output:
unnnnnnn
coyriggl
ppyrihhe
ppyritte
ppyriabe
n
및 m
비 결정적으로 선택됩니다. 적합한 값이 존재하는 것이 보장되지만 값을 찾는 것이 프로그램의 작업입니다.
un|co|p-|yr|i|gh--t-ab|-|le-||-
유효하지 않습니다. 마지막 -
은 arity가 2이고 스택에는 하나의 요소 만 있습니다.