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×ngrade do caracterec, para qualquerm, n ≥ 1. - Dado um cano
|, coloque duas gradesAeBda pilha (Bestava no topo) e empurre a gradeABobtida concatenandoBà direita deA. Isso requer issoAeBtem altura igual. - Dado um hífen
-, retire duas gradesAeBda pilha (Bestava no topo) e empurre a gradeA/Bobtida concatenandoBpara o final deA. Isso requer issoAeBtem largura igual.
É garantido que, para algumas escolhas feitas me nfeitas 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×2retângulo de p, e 1×1retângulos de ae r(a razão para isso ficará clara mais tarde). Então, nós estourar os ae rretângulos, e empurre a concatenação verticais
a
r
Em seguida, pressionamos um 1×2retâ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 pretângulo e pressionamos sua concatenação
pas
prs
Por fim, pressionamos um 3×1retâ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
ne msã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.