Эта задача является частью первой периодической главной головоломки программирования .
Вы получаете иерархию элементов в следующем формате:
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, который был подвержен ошибкам в зависимости от того, как заканчивались строки в сценарии, и какие окончания строк печатало решение. Теперь это должно быть агностиком к обоим. Извините еще раз за путаницу.
Ответы:
GolfScript, 125 символов
Использование подхода, аналогичного решению Кейта .
источник
Питон, 204 символа
P
возвращает список троек, каждый из которых представляет собой префикс / суффикс строки (суффикс является обратным к префиксу), некоторый текст строки и символ заполнения строки. После вычисления всех троек они печатаются с использованием правильного количества символов заполнения, чтобы все строки имели одинаковую длину.Безголовая версия:
источник
P
там.Ruby 1.9, 174 символа
Несколько похоже на решение Кейта .
источник
APL (78)
источник
Питон -
355314259 символовисточник
Рубин 1.9,
229228226223222источник
C
390366363 символовКомпилировать с
gcc -std=gnu99 -w file.c
Даже близко не к версии Кейта, но эй, это хорошо, С '
источник
160/160 passed
(я имел в виду строку из 100 символов, которой нет в любом случае)FreeBSD 8.2-RELEASE #5: Sun Feb 27 10:40:25 CET 2011
сgcc version 4.2.1 20070719 [FreeBSD]
х64 здесь. Я верю вашему слову за 160, тогда :-). И действительно, должен быть контрольный пример со 100 символами (тесты 143–147).очень функциональный питон, 460 символов
источник
|
персонажи расставлены неправильно. Это очень похоже на мое решение на PythonHaskell, 297 символов
В то время как Golf'd, метод довольно прост. Только ограничения доступны в памяти.
источник
C # -
1005 859 852782 знаковМне нужно еще раз взглянуть на это, так как я уверен, что это можно улучшить, но это мой
первыйтретий шаг.Ungolf'd:
источник
var a = 1, b = 2, c = 3;
. Разве вы не можете сделать то же самое в C?var
утверждения. Вы можете комбинировать, только если у них есть явный тип, такой как упомянутый Джоиstring b="",e=""
.PHP,
403388306 символовUngolfed:
Я позаимствовал идею префикса у Кейта (это вообще разрешено?), В остальном это почти как оригинал. Тем не менее не мог получить ниже 300. Застрял в этом. Onwards.
источник
PHP,
806769721653619 символовБезголовая версия:
источник
<?
в начале даже запустить. Тогда вы, очевидно, используете максимальную длину всех текстовых элементов в тестовом примере в качестве ширины для самого внутреннего блока. Этот код проходит только 118 тестовых случаев (проверено на Linux и FreeBSD). Я понятия не имею, что вы сделали со сценарием PowerShell, чтобы он не запускался, хотя :-(. Наpowershell -noprofile -file test.ps1 php boxes.php
самом деле он вызывается так, как должно работать. Но на моем компьютере с Windows нет PHP для тестирования.Ява -
681668 символовпо сути тот же метод, что и код Python Кейта Рэндалла
Безголовая версия:
источник
throws
.break;
)char
сравнения, посмотрев на коды ASCII дольше ... но мне нужно идти готовиться к отпускуPerl -
200199 символовТот же алгоритм, что и в Python Кейта Рэндалла (хороший дизайн, Кейт), но чуть более компактный в этом Perl.
источник
$_@_@_
похоже, что кто-то гонится за знаком доллараF # - 341 символов
Версия F # решения Кейта. Списки являются неизменяемыми по умолчанию, поэтому эта версия помещает всю рекурсивную функцию в список, возвращает список, из которого элементы извлекаются с использованием
for..do
цикла и ayield!
. Я не мог найти способ кратко изменить префикс, поэтому я просто прикрепил суффикс к тройкам.К вашему сведению, метод TryParse возвращает значение типа double
(bool,int)
.источник
Clojure - 480 символов
Это моя первая программа Clojure, а также моя первая попытка игры в гольф Clojure, поэтому, разумеется, это не следует воспринимать как представитель решений Clojure в целом. Я уверен, что это может быть значительно сокращено, особенно если будет сразу реализован метод синтаксического анализа и построения блоков Китом Рэндаллом .
источник
C # -
472 470 426 422398 символовисточник
goto
! Кстати, вы можете опустить скобки вокруг лямбда-аргументовz
иv
, доведя это до 421.Скала - 475 символов
источник
C #
1198 1156 1142 689 671634 символовисточник
\n
кажется, достаточно в конце.Пип , 89 байт (не конкурирует)
(Язык новее, чем вызов. Кроме того, я не мог переиграть APL.)
Код 87 байтов, +2 для
-rn
флагов.Попробуйте онлайн!
Функция
z
обрабатывает первый элемент списка ввода (g
копируется в глобальную переменную,i
чтобы быть доступным внутри вызовов функций). Если это число n , оно вызывает себя рекурсивно n раз,"| " " |"
добавляет результирующий список строк в полный прямоугольник, переносит каждую строку и добавляет.---.
и'---'
строки перед возвратом нового списка. Если это строка, она просто конвертирует ее в список из одного элемента и возвращает его. Окончательный результат печатается через новую строку (-n
флаг). Более подробная информация доступна по запросу.источник
Java (1369 символов, включая EOL)
Не могу оставить это без реализации Java. Предполагается, что Java более многословна, чем слики Python и Ruby, поэтому я выбрал элегантное рекурсивное решение.
Идея - это дерево (график) объектов (строк и блоков), содержащих друг друга, начиная с поля «голова». Когда вы линейно анализируете входной файл, вы добавляете строки и поля в «текущий» блок, и пока вы добавляете, максимальная длина контейнера корректируется. Когда контейнер достигает количества предопределенных элементов, которые он может удержать, вы возвращаетесь к предыдущему контейнеру. В конце входного файла у вас есть контейнер «head», в котором уже рассчитан «maxLength», поэтому вы просто вызываете его метод print ().
Это действительно приятное решение для написания. Мне очень понравился вопрос. Как я упоминал ранее, я выбрал элегантность решения, а не минималистский подход, к сожалению, в Java нет печати Python "-" * 4 для создания "----" :-)
Вот негольфированная версия:
источник