Introdução
Esse desafio é inspirado no Grime , minha linguagem de correspondência de padrões 2D. Basicamente, você recebe uma "gramática" que descreve grades bidimensionais de caracteres e seu trabalho é gerar uma grade de acordo com a gramática. Além disso, a grade deve ser a menor possível em um certo sentido fraco.
Entrada
Sua entrada é uma sequência que contém caracteres ASCII em minúsculas e os símbolos |
e -
. Para simplificar, a entrada não contém caracteres minúsculos repetidos. A sequência é uma especificação para uma classe de grades retangulares de caracteres e é analisada da esquerda para a direita usando uma pilha da seguinte maneira.
- Dado um caractere minúsculo
c
, empurre para a pilha umam×n
grade do caracterec
, para qualquerm, n ≥ 1
. - Dado um cano
|
, coloque duas gradesA
eB
da pilha (B
estava no topo) e empurre a gradeAB
obtida concatenandoB
à direita deA
. Isso requer issoA
eB
tem altura igual. - Dado um hífen
-
, retire duas gradesA
eB
da pilha (B
estava no topo) e empurre a gradeA/B
obtida concatenandoB
para o final deA
. Isso requer issoA
eB
tem largura igual.
É garantido que, para algumas escolhas feitas m
e n
feitas durante o processo de análise (que podem ser diferentes para cada letra), a especificação de entrada descreva corretamente algum retângulo, que é deixado na pilha no final.
Resultado
Sua saída é uma grade retangular de caracteres especificada pela entrada. A grade deve ser mínima no sentido de que remover qualquer linha ou coluna a tornaria inválida. Você pode retornar uma string separada por nova linha (com ou sem uma nova linha à direita), uma matriz 2D de caracteres ou uma matriz de cadeias, o que for o formato mais conveniente.
Observe que você não é obrigado a processar a entrada exatamente como descrito acima; a única coisa importante é que sua saída esteja correta.
Exemplo
Considere a especificação
par-s||e-
Primeiro, escolhemos empurrar um 1×2
retângulo de p
, e 1×1
retângulos de a
e r
(a razão para isso ficará clara mais tarde). Então, nós estourar os a
e r
retângulos, e empurre a concatenação verticais
a
r
Em seguida, pressionamos um 1×2
retângulo de s
, pop e o retângulo acima, e pressionamos sua concatenação horizontal
as
rs
Em seguida, colocamos esse retângulo e o p
retângulo e pressionamos sua concatenação
pas
prs
Por fim, pressionamos um 3×1
retângulo de e
, pop e o retângulo acima, e pressionamos a concatenação vertical
pas
prs
eee
Esta é a saída do programa, ou pelo menos uma das possibilidades. Observe que, embora
ppas
ppas
pprs
eeee
também é gerado pela especificação, não é uma saída válida, pois muitas das linhas e colunas podem ser removidas.
Como um exemplo mais sutil, considere
co|m|p|il|e|r|-
Esta especificação gera o retângulo
comp
iler
que é uma saída válida. No entanto, também gera
commp
iiler
o que também é válido, pois nenhuma linha ou coluna pode ser removida sem a invalidação.
Regras
Você pode dar um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Casos de teste extras
Você pode usá-los para testar seu programa.
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
são escolhidos de forma não determinística. É garantido que existam valores adequados para eles, mas é tarefa do seu programa encontrá-los.
un|co|p-|yr|i|gh--t-ab|-|le-||-
é impossível ser válido. O último -
tem uma área de 2, enquanto há apenas 1 elemento na pilha.