Эта задача является частью первой периодической главной головоломки программирования .
Вы получаете иерархию элементов в следующем формате:
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? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Тестовый скрипт
Поскольку правильная детализация иногда может быть затруднена, мы ( Ventero и я) подготовили тестовый сценарий, с помощью которого вы можете запустить свое решение, чтобы проверить его правильность. Он доступен и как сценарий PowerShell и сценарий Баш . Воззвание это: <test-script> <program invocation>
.
ОБНОВЛЕНИЕ: тестовые сценарии были обновлены; было несколько тестов, которые не соответствовали установленным мною ограничениям. Тестовый сценарий PowerShell не использовал сравнение с учетом регистра для проверки результата. Я надеюсь, что сейчас все в порядке. Количество тестовых случаев было сокращено до 156, хотя последний сейчас довольно ... большой.
ОБНОВЛЕНИЕ 2: я загрузил свой генератор тестовых случаев . Написан на C # , ориентирован на среду выполнения .NET 2. Он работает на моно. Это может помочь людям проверить их реализацию. В качестве окончательного наихудшего случая, учитывая ограничения в задаче, вы можете попробовать:
nb.exe 1 10 10 5 100 100 | my invocation
который будет генерировать только блоки до самого внутреннего уровня и использовать как максимальное количество элементов в блоке, так и максимальную длину текстовых элементов. Я не включил этот тестовый сценарий в тестовый скрипт, так как он довольно большой, а результат еще больше.
ОБНОВЛЕНИЕ 3: Я обновил тестовый сценарий PowerShell, который был подвержен ошибкам в зависимости от того, как заканчивались строки в сценарии, и какие окончания строк печатало решение. Теперь это должно быть агностиком к обоим. Извините еще раз за путаницу.