introduction
Ce défi est inspiré de Grime , mon langage de correspondance de motifs 2D. Fondamentalement, vous disposez d'une "grammaire" qui décrit les grilles de caractères bidimensionnelles, et votre travail consiste à générer une grille en fonction de la grammaire. De plus, la grille doit être aussi petite que possible dans un certain sens faible.
Contribution
Votre entrée est une chaîne contenant des caractères ASCII minuscules et les symboles |
et -
. Par souci de simplicité, l'entrée ne contient pas de caractères minuscules répétés. La chaîne est une spécification pour une classe de grilles rectangulaires de caractères, et elle est analysée de gauche à droite en utilisant une pile comme suit.
- Étant donné un caractère en minuscule
c
, poussez dans la pile unem×n
grille du caractèrec
, pour toutm, n ≥ 1
. - Étant donné un tuyau
|
, faites éclater deux grillesA
etB
de la pile (B
était en haut), et poussez la grilleAB
obtenue en concaténantB
à droite deA
. Cela nécessite celaA
etB
avoir une hauteur égale. - Étant donné un trait d'union
-
, faites éclater deux grillesA
etB
de la pile (B
était en haut), et poussez la grilleA/B
obtenue en concaténantB
au bas deA
. Cela nécessite celaA
etB
avoir une largeur égale.
Il est garanti que pour certains choix de m
et n
effectués pendant le processus d'analyse (qui peuvent être différents pour chaque lettre), la spécification d'entrée décrit correctement un rectangle, qui est laissé sur la pile à la fin.
Production
Votre sortie est une grille rectangulaire de caractères spécifiée par l'entrée. La grille doit être minimale dans le sens où la suppression d'une ligne ou d'une colonne la rendrait non valide. Vous pouvez renvoyer une chaîne séparée par des sauts de ligne (avec ou sans retour à la ligne), un tableau 2D de caractères ou un tableau de chaînes, selon le format le plus pratique.
Notez que vous n'êtes pas obligé de traiter l'entrée exactement comme décrit ci-dessus; la seule chose importante est que votre sortie soit correcte.
Exemple
Considérez la spécification
par-s||e-
Tout d'abord, nous choisissons de pousser un 1×2
rectangle de p
, et des 1×1
rectangles de a
et r
(la raison en sera claire plus tard). Ensuite, nous les pop a
et r
rectangles, et pousser leur concaténation verticale
a
r
Ensuite, nous poussons un 1×2
rectangle de s
, le pop et le rectangle ci-dessus, et poussons leur concaténation horizontale
as
rs
Ensuite, nous pop ce rectangle et le p
rectangle, et poussons leur concaténation
pas
prs
Enfin, nous poussons un 3×1
rectangle de e
, le pop et le rectangle ci-dessus, et poussons la concaténation verticale
pas
prs
eee
C'est la sortie du programme, ou au moins l'une des possibilités. Notez que même si
ppas
ppas
pprs
eeee
est également généré par la spécification, ce n'est pas une sortie valide, car de nombreuses lignes et colonnes peuvent être supprimées.
Comme exemple plus subtil, considérez
co|m|p|il|e|r|-
Cette spécification génère le rectangle
comp
iler
qui est une sortie valide. Cependant, il génère également
commp
iiler
ce qui est également valable, car aucune ligne ou colonne ne peut être supprimée sans l'invalider.
Règles
Vous pouvez donner un programme complet ou une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.
Cas de test supplémentaires
Vous pouvez les utiliser pour tester votre programme.
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
et m
sont choisis de manière non déterministe. Il est garanti que des valeurs appropriées existent, mais c'est le travail de votre programme de les trouver.
un|co|p-|yr|i|gh--t-ab|-|le-||-
est impossible à valider. Le dernier -
a une arité de 2, alors qu'il n'y a qu'un seul élément sur la pile.