Вступление
Этот вызов вдохновлен Grime , моим языком сопоставления двухмерных паттернов. По сути, вам предоставляется «грамматика», описывающая двумерные сетки символов, и ваша задача - создать сетку в соответствии с грамматикой. Кроме того, сетка должна быть как можно меньше в определенном слабом смысле.
вход
Ваш ввод - это строка, содержащая строчные ASCII-символы, а также символы |
и -
. Для простоты ввод не содержит повторяющихся строчных букв. Строка является спецификацией для класса прямоугольных сеток символов и анализируется слева направо, используя стек следующим образом.
- Если задан строчный символ
c
, поместите в стекm×n
сетку символаc
для любогоm, n ≥ 1
. - Получив трубу
|
, вытолкните две сеткиA
иB
из стека (B
был сверху), и протолкните сетку,AB
полученную путем объединения,B
справа отA
. Для этого требуетсяA
иB
одинаковая высота. - Получив дефис
-
, извлеките две сеткиA
иB
из стека (B
был сверху) и вставьте сетку,A/B
полученную путем объединения,B
в нижнюю частьA
. Это требует тогоA
иB
иметь равную ширину.
Гарантируется, что для некоторых вариантов m
и n
сделанных в процессе анализа (которые могут отличаться для каждой буквы) спецификация ввода правильно описывает некоторый прямоугольник, который остается в стеке в конце.
Выход
Ваш вывод представляет собой прямоугольную сетку символов, указанную при вводе. Сетка должна быть минимальной в том смысле, что удаление любой строки или столбца сделает ее недействительной. Вы можете вернуть строку, разделенную новой строкой (с завершающей новой строкой или без нее), двумерный массив символов или массив строк, в зависимости от того, какой формат является наиболее удобным.
Обратите внимание, что вы не обязаны обрабатывать ввод точно так, как описано выше; единственная важная вещь - то, что Ваш вывод правильный.
пример
Рассмотрим спецификацию
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-||-
невозможно быть действительным. Последний -
имеет арность 2, тогда как в стеке есть только 1 элемент.