이 작업은 제 1 회 정기 프리미어 프로그래밍 퍼즐 푸시의 일부입니다 .
다음 형식의 항목 계층 구조를 얻습니다.
2
Hat
1
Gloves
다음과 같이 상자에 넣어야합니다.
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
입력 형식에서 숫자는 숫자가 지정하는 항목 수만큼 상자를 시작합니다. 첫 번째 상자에는 두 개의 항목 (햇과 장갑이 들어있는 상자)이 있으며 두 번째 상자에는 장갑이라는 단일 항목 만 있습니다.
보시다시피 상자는 상자 안에 살 수 있습니다. 그리고 그들은 항상 반올림됩니다 ... (뾰족한 모서리는 상처의 위험이 있으며 우리는 그것을 원하지 않을 것입니다).
아래에는 사양이 제공하는 모든 작은 여유를 활용하려는 사람들에 대한 불쾌한 세부 사항이 있습니다. 스펙을 읽지 않아도 잘못된 솔루션을 제출할 이유가 없습니다. 끝에 테스트 스크립트와 몇 가지 테스트 사례가 있습니다.
사양
상자는 다음 문자로 구성됩니다.
|
(U + 007C)는 수직 모서리를 구성하는 데 사용됩니다.-
(U + 002D)는 수평 가장자리를 구성하는 데 사용됩니다.'
(U + 0027)은 둥근 아래쪽 모서리입니다..
(U + 002E)는 둥근 상단 모서리입니다.
따라서 상자는 다음과 같습니다.
.--. | | '--'
유니 코드에는 둥근 모서리와 적절한 상자 그리기 문자가 있지만이 작업은 ASCII로만 이루어집니다. 내가 유니 코드를 좋아하는 한, 2 ~ 10 년 사이에 아직 도착하지 않은 언어와 환경이 있다는 것을 알고 있습니다.
상자에는 텍스트 또는 다른 항목 인 일련의 항목이 포함될 수 있습니다. 상자의 개별 항목은 위에서 아래로 렌더링됩니다. 따라서 시퀀스 A, B, C는 다음과 같이 렌더링됩니다.
.---. | A | | B | | C | '---'
이것은 물론 텍스트와 같은 항목 인 중첩 상자에도 적용됩니다. 따라서 시퀀스 A, B, Box (C, Box (D, E)), F는 다음과 같이 렌더링됩니다.
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
상자는 내용에 따라 크기를 조정하고 중첩 된 상자는 항상 부모의 크기로 확장됩니다. 내용 앞뒤에 항상 공백이 있으므로 텍스트 상자 나 중첩 상자가 바깥 상자 가장자리에 너무 가까이 있지 않습니다. 요컨대, 다음은 잘못되었습니다.
.---. |Box| '---'
그리고 다음이 맞습니다.
.-----. | Box | '-----'
훨씬 더 좋아 보인다 :-)
텍스트 항목 (아래 입력 참조)을 정확하게 재현해야합니다.
항상 최상위 수준의 단일 상자가 있습니다 (XML 참조). 그러나 한 상자에 여러 개의 다른 상자가 포함될 수 있습니다.
입력
입력은 표준 입력에 제공됩니다. 더 쉬운 테스트를 위해 파일에서 리디렉션 될 수 있습니다.
입력은 줄 단위로 제공되며 각 줄은 현재 상자에 넣거나 새 상자를 여는 텍스트 항목을 나타냅니다.
모든 줄은 줄 바꿈으로 종료됩니다.
텍스트 항목은 숫자로 구성되지 않은 줄로 표시됩니다 (아래 참조). 텍스트는 알파벳 문자, 공백 및 문장 부호 (
.,-'"?!()
)를 사용합니다. 텍스트는 공백으로 시작하거나 끝나지 않으며 항상 하나 이상의 문자를 갖습니다.상자는 숫자가있는 한 줄로 시작합니다. 숫자는 상자의 크기, 즉 상자에 넣은 다음 항목의 수를 나타냅니다.
2 A B
두 개의 텍스트 항목이있는 상자를 생성합니다.
.---. | A | | B | '---'
상자에는 항상 하나 이상의 항목이 포함됩니다.
상자의 끝은 명시 적으로 선으로 표시되지 않습니다. 대신 지정된 수의 항목을 넣은 후 상자가 암시 적으로 닫힙니다.
상자는 항목 수에 관계없이 항상 단일 항목입니다. 예 :
3 A 4 a b c d B
세 개의 항목이있는 상자가 나오고 두 번째는 네 개의 항목이있는 다른 상자입니다.
중첩은 상자가 단일 항목이라는 사실에도 영향을 미치지 않습니다.
제한
최대 중첩 수준은 5 입니다. 즉, 서로 안에 최대 5 개의 상자가 있습니다. 여기에는 가장 바깥 쪽이 포함됩니다.
상자 당 최대 10 개의 품목이 있습니다.
텍스트 항목의 최대 길이는 100 자입니다.
산출
- 출력은 위에서 설명한 규칙에 따라 모든 포함 및 중첩 항목을 포함하는 렌더링 된 상자입니다.
- 출력은 표준 출력으로 제공되어야하며 정확하게 일치해야합니다. 선행 또는 후행 공백은 허용되지 않습니다.
- 각 줄은 마지막 줄을 포함하여 줄 바꿈으로 끝나야합니다.
승리 조건
- 가장 짧은 코드가 승리합니다 (즉, 허용 된 답변을 얻음).
샘플 입력 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
샘플 출력 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
샘플 입력 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
샘플 출력 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
샘플 입력 3
1
1
1
1
1
Extreme nesting Part Two
샘플 출력 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
샘플 입력 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
샘플 출력 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
테스트 스크립트
우리 ( Ventero 와 나)는 테스트 스크립트를 준비했을 때 세부 정보를 올바르게 얻는 것이 어려울 수 있으므로 솔루션이 올바른지 확인하기 위해 솔루션을 실행할 수 있습니다. PowerShell 스크립트 와 bash 스크립트 모두로 사용할 수 있습니다 . 호출은 다음과 같습니다 <test-script> <program invocation>
.
업데이트 : 테스트 스크립트가 업데이트되었습니다. 내가 정의한 한계를 따르지 않는 여러 테스트 사례가있었습니다. PowerShell 테스트 스크립트는 결과를 확인하기 위해 대소 문자 구분을 사용하지 않았습니다. 지금은 모든 것이 잘되기를 바랍니다. 마지막 사례는 현재 상당히 많지만 테스트 사례의 수는 156으로 줄었습니다.
업데이트 2 : 테스트 케이스 생성기를 업로드했습니다 . .NET 2 런타임을 대상으로하는 C #으로 작성되었습니다 . 모노에서 실행됩니다. 사람들이 구현을 테스트하는 데 도움이 될 수 있습니다. 작업의 한계를 고려한 결정적인 최악의 경우 :
nb.exe 1 10 10 5 100 100 | my invocation
이것은 가장 안쪽 레벨까지 상자 만 생성하며 상자 당 최대 항목 수와 최대 텍스트 항목 길이를 모두 사용합니다. 그러나이 테스트 케이스는 테스트 스크립트에 포함시키지 않았습니다. 왜냐하면 상당히 크고 출력이 훨씬 큽니다.
업데이트 3 : 스크립트의 줄 끝과 솔루션이 인쇄 된 줄 끝에 따라 오류가 발생하기 쉬운 PowerShell 테스트 스크립트를 업데이트했습니다. 이제 두 가지 모두에 대해 불가지론해야합니다. 혼란을 드려 죄송합니다.