Вступ
Цей виклик натхненний Grime , моєю 2D мовою відповідності шаблонів. В основному, вам дається "граматика", яка описує двовимірні сітки символів, і ваше завдання полягає в створенні сітки відповідно до граматики. Крім того, сітка повинна бути якомога меншою у певному слабкому сенсі.
Вхідні дані
Ваш вхід - це рядок, що містить малі символи 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 елемент.