introduzione
Questa sfida è ispirata a Grime , il mio linguaggio di corrispondenza dei motivi 2D. Fondamentalmente, ti viene data una "grammatica" che descrive griglie bidimensionali di caratteri e il tuo compito è generare una griglia secondo la grammatica. Inoltre, la griglia dovrebbe essere il più piccola possibile in un certo senso debole.
Ingresso
Il tuo input è una stringa contenente caratteri ASCII minuscoli e i simboli |
e -
. Per semplicità, l'input non contiene caratteri minuscoli ripetuti. La stringa è una specifica per una classe di griglie rettangolari di caratteri e viene analizzata da sinistra a destra usando una pila come segue.
- Dato un carattere minuscolo
c
, spingi in pila unam×n
griglia del personaggioc
, per qualsiasim, n ≥ 1
. - Dato un pipe
|
, fai scoppiare due griglieA
eB
dalla pila (B
era in cima), e spingi la grigliaAB
ottenuta concatenandoB
a destra diA
. Ciò richiede questoA
eB
avere uguale altezza. - Dato un trattino
-
, fai scoppiare due griglieA
eB
dalla pila (B
era in cima) e spingi la grigliaA/B
ottenuta concatenandoB
sul fondo diA
. Ciò richiede cheA
eB
abbiano la stessa larghezza.
È garantito che per alcune scelte di m
e n
fatte durante il processo di analisi (che può essere diverso per ogni lettera), la specifica di input descrive correttamente un rettangolo, che viene lasciato in pila alla fine.
Produzione
L'output è una griglia rettangolare di caratteri specificata dall'input. La griglia deve essere minima, nel senso che la rimozione di qualsiasi riga o colonna la renderebbe non valida. È possibile restituire una stringa separata da una nuova riga (con o senza una nuova riga finale), una matrice 2D di caratteri o una matrice di stringhe, a seconda di quale sia il formato più conveniente.
Si noti che non è necessario elaborare l'input esattamente come descritto sopra; l'unica cosa importante è che l'output sia corretto.
Esempio
Considera le specifiche
par-s||e-
Innanzitutto, scegliamo di premere un 1×2
rettangolo di p
e 1×1
rettangoli di a
e r
(la ragione di ciò sarà chiara più avanti). Poi, abbiamo pop le a
e r
rettangoli, e spingere il loro concatenamento verticale
a
r
Successivamente, spingiamo un 1×2
rettangolo di s
, lo pop e il rettangolo sopra e spingiamo la loro concatenazione orizzontale
as
rs
Quindi pop quel rettangolo e il p
rettangolo e spingiamo la loro concatenazione
pas
prs
Infine, spingiamo un 3×1
rettangolo di e
, lo pop e il rettangolo sopra e spingiamo la concatenazione verticale
pas
prs
eee
Questo è l'output del programma, o almeno una delle possibilità. Notalo anche se
ppas
ppas
pprs
eeee
viene inoltre generato dalla specifica, non è un output valido, poiché è possibile rimuovere molte righe e colonne.
Come esempio più sottile, considera
co|m|p|il|e|r|-
Questa specifica genera il rettangolo
comp
iler
che è un output valido. Tuttavia, genera anche
commp
iiler
anche questo è valido, poiché nessuna riga o colonna può essere rimossa senza invalidarla.
Regole
Puoi dare un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.
Casi di prova extra
Puoi usarli per testare il tuo programma.
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
e m
sono scelti in modo non deterministico. È garantito che esistano valori adeguati per loro, ma è compito del tuo programma trovarli.
un|co|p-|yr|i|gh--t-ab|-|le-||-
è impossibile essere validi. L'ultimo -
ha un'arità di 2, mentre nello stack è presente solo 1 elemento.