Це завдання є частиною першого періодичного прем’єрного програмування головоломки .
Ви отримуєте ієрархію елементів у такому форматі:
2
Hat
1
Gloves
які потрібно помістити в ящики, наприклад:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
У форматі введення цифри починають поле з стільки елементів, скільки задає число. У першій коробці є два предмети (Капелюх і коробка, що містить Рукавички), друга - лише один предмет - рукавички.
Як видно, ящики теж можуть жити всередині ящиків. І вони завжди закруглені ... начебто (точкові куточки є небезпекою рани, і ми цього не хотіли б).
Нижче наведені неприємні деталі для тих, хто хоче використовувати кожен крихітний шматочок свободи, який дає специфікація. Зауважте, що не читати специфікацію - це не привід для подання неправильних рішень. Існує тестовий сценарій та кілька тестових випадків у самому кінці.
Специфікація
Коробки побудовані з таких символів:
|
(U + 007C) використовується для побудови вертикальних ребер.-
(U + 002D) використовується для побудови горизонтальних ребер.'
(U + 0027) - круглі нижні кути..
(U + 002E) - круглі верхні кути.
Тому поле виглядає приблизно так:
.--. | | '--'
Зауважте, що, хоча у Unicode також є круглі кути та належні символи для малювання поля, це завдання є лише в ASCII. Наскільки я люблю Unicode, я усвідомлюю, що там існують мови та середовища, які не зовсім приїхали у другому та останньому десятилітті.
Коробки можуть містити послідовність елементів, які є або текстовими, або іншими елементами. Окремі елементи у вікні відображаються зверху вниз. Послідовність 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
вийде коробка з трьома предметами, другий з яких - ще одна коробка з чотирма предметами.
Гніздування також не впливає на те, що коробка - це лише один предмет.
Обмеження
Максимальний рівень гніздування - п’ять . Тобто, щонайменше, п'ять коробок всередині один одного. Сюди входить і самий зовнішній.
В коробці є максимум десять предметів.
Текстові елементи мають довжину не більше 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? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Тестовий сценарій
Оскільки правильність отримання деталей часом може бути складною, ми ( Вентеро і я) підготували тестовий сценарій, з яким можна запустити рішення, щоб перевірити, чи правильно воно. Він доступний як сценарій PowerShell, так і bash . Відозва це: <test-script> <program invocation>
.
ОНОВЛЕННЯ: Тестові сценарії оновлено; було ряд тестових випадків, які не відповідали визначеним мною обмеженням. Тест сценарію PowerShell не використовував порівняння з урахуванням регістру для перевірки результату. Я сподіваюся, що зараз все добре. Кількість тестових випадків скоротилася до 156, хоча останній зараз досить ... великий.
ОНОВЛЕННЯ 2: Я завантажив свій генератор тестових випадків . Написано на C # , орієнтуючись на час виконання .NET 2. Він працює на Моно. Це може допомогти людям перевірити їх виконання. Як остаточний випадок, враховуючи обмеження у завданні, можна спробувати:
nb.exe 1 10 10 5 100 100 | my invocation
що генеруватиме лише вікна до самого внутрішнього рівня та використовуватиме як максимальну кількість елементів у коробці, так і максимальну довжину текстових елементів. Я не включав цей тестовий випадок у тестовий скрипт, оскільки він досить великий, а вихід ще більший.
ОНОВЛЕННЯ 3: Я оновив тестовий скрипт PowerShell, який був схильний до помилок, залежно від того, як закінчувалися рядки у сценарії та які закінчення рядків надруковано у рішенні. Тепер він повинен бути агностичним для обох. Пробачте знову за плутанину.