Wprowadzenie
To wyzwanie jest inspirowane przez Grime , mój język dopasowywania wzorów 2D. Zasadniczo otrzymujesz „gramatykę” opisującą dwuwymiarowe siatki znaków, a Twoim zadaniem jest wygenerowanie siatki zgodnie z gramatyką. Ponadto siatka powinna być jak najmniejsza w pewnym słabym znaczeniu.
Wejście
Wpisujesz ciąg zawierający małe znaki ASCII oraz symbole |
i -
. Dla uproszczenia dane wejściowe nie zawierają powtarzających się małych liter. Ciąg jest specyfikacją klasy prostokątnych siatek znaków i jest analizowany od lewej do prawej za pomocą stosu w następujący sposób.
- Biorąc pod uwagę małą literę
c
, przesuń na stosm×n
siatkę postacic
, dla dowolnejm, n ≥ 1
. - Biorąc pod uwagę fajkę
|
, przebij dwie siatkiA
iB
ze stosu (B
był na górze) i popchnij siatkęAB
uzyskaną przez konkatenacjęB
na prawo odA
. Wymaga toA
iB
mają jednakową wysokość. - Biorąc pod uwagę łącznik
-
, wysuń dwie siatkiA
iB
ze stosu (B
był na górze) i przesuń siatkęA/B
uzyskaną przez konkatenacjęB
na dółA
. Wymaga toA
iB
mają jednakową szerokość.
Jest pewne, że dla niektórych opcji m
in
dokonywanych podczas przetwarzania (które mogą być różne dla każdej litery) specyfikacja wejściowa poprawnie opisuje prostokąt, który pozostaje na stosie na końcu.
Wynik
Twój wynik jest prostokątną siatką znaków określonych przez dane wejściowe. Siatka musi być minimalna w tym sensie, że usunięcie dowolnego wiersza lub kolumny spowoduje, że będzie ona nieważna. Możesz zwrócić ciąg oddzielony znakiem nowej linii (z końcowym znakiem nowej linii lub bez), tablicę znaków 2D lub tablicę ciągów, w zależności od tego, który z nich jest najwygodniejszy.
Pamiętaj, że nie musisz przetwarzać danych wejściowych dokładnie tak, jak opisano powyżej; jedyną ważną rzeczą jest to, że wyniki są prawidłowe.
Przykład
Rozważ specyfikację
par-s||e-
Najpierw wybieramy pchnięcie 1×2
prostokąta p
i 1×1
prostokąty a
i r
(powód będzie wyjaśniony później). Następnie wyskakujemy a
i r
prostokąty i przesuwamy ich pionowe połączenie
a
r
Następnie wciskamy 1×2
prostokąt s
, pop go i powyższy prostokąt, i przesuwamy ich poziomą konkatenację
as
rs
Następnie przebijamy ten prostokąt i p
prostokąt i przesuwamy ich konkatenację
pas
prs
Na koniec wciskamy 3×1
prostokąt , przesuwamy e
go i powyższy prostokąt i przesuwamy pionową konkatenację
pas
prs
eee
To jest wynik programu lub przynajmniej jedna z możliwości. Zauważ, że mimo to
ppas
ppas
pprs
eeee
jest również generowany przez specyfikację, nie jest to poprawny wynik, ponieważ wiele wierszy i kolumn można usunąć.
Rozważ bardziej subtelny przykład
co|m|p|il|e|r|-
Ta specyfikacja generuje prostokąt
comp
iler
który jest prawidłowym wyjściem. Jednak generuje również
commp
iiler
co również jest ważne, ponieważ nie można usunąć pojedynczego wiersza ani kolumny bez unieważnienia go.
Zasady
Możesz podać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Dodatkowe przypadki testowe
Możesz użyć ich do przetestowania swojego programu.
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
i m
są wybierani niedeterministycznie. Gwarantujemy, że istnieją dla nich odpowiednie wartości, ale znalezienie ich jest zadaniem Twojego programu.
un|co|p-|yr|i|gh--t-ab|-|le-||-
nie można być ważnym. Ostatni -
ma arity 2, podczas gdy na stosie jest tylko 1 element.