Cette tâche fait partie de la première poussée périodique de programmation Premier .
Vous obtenez une hiérarchie d'éléments dans le format suivant:
2
Hat
1
Gloves
qui doivent être mis dans des boîtes, comme suit:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
Dans le format d'entrée, les nombres commencent par une zone contenant autant d'éléments que le nombre spécifié. La première boîte contient deux éléments (le chapeau et la boîte contenant les gants), la seconde ne contient qu'un seul élément, les gants.
Comme on peut le constater, les boîtes peuvent aussi vivre à l’intérieur des boîtes. Et ils sont toujours arrondis ... en quelque sorte (les coins pointus représentent un risque de blessure et nous ne le voudrions pas).
Ci-dessous, vous trouverez les détails désagréables pour ceux qui veulent utiliser chaque petite marge de manœuvre offerte par la spécification. Attention, ne pas lire les spécifications n'est pas une excuse pour soumettre de mauvaises solutions. Il y a un script de test et quelques cas de test à la fin.
spécification
Les boîtes sont construites à partir des caractères suivants:
|
(U + 007C) est utilisé pour construire les arêtes verticales.-
(U + 002D) est utilisé pour construire les arêtes horizontales.'
(U + 0027) sont les coins arrondis inférieurs..
(U + 002E) sont les coins supérieurs arrondis.
Une boîte ressemble donc à ceci:
.--. | | '--'
Notez que, même si Unicode a aussi des coins arrondis et des caractères de dessin de boîte appropriés, cette tâche est en ASCII uniquement. Bien que j'aime Unicode, je me rends compte qu'il existe des langages et des environnements qui ne sont pas encore arrivés avant la dernière décennie.
Les boîtes peuvent contenir une séquence d'éléments qui sont du texte ou d'autres éléments. Les éléments individuels dans une boîte sont rendus de haut en bas. La séquence A, B, C se traduit ainsi:
.---. | A | | B | | C | '---'
Ceci s'applique bien sûr aussi aux boîtes imbriquées, qui sont un élément au même titre que du texte. Ainsi, la séquence A, B, Boîte (C, Boîte (D, E)), F rendrait comme suit:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
Les cases ajustent leur taille au contenu et les cases imbriquées s'étendent toujours à la taille de leur parent. Il y a toujours un espace avant et après le contenu, de sorte que ni le texte ni les zones imbriquées ne soient trop proches du bord de la zone extérieure. En bref, ce qui suit est faux:
.---. |Box| '---'
Et ce qui suit est correct:
.-----. | Box | '-----'
C'est beaucoup plus joli aussi :-)
Les éléments de texte (voir Entrée ci-dessous) doivent être reproduits exactement.
Il y a toujours une seule boîte de premier niveau (cf. XML). Cependant, une boîte peut contenir plusieurs autres boîtes.
Contribution
L'entrée est donnée sur l'entrée standard; pour un test plus facile probablement redirigé à partir d'un fichier.
L'entrée est donnée ligne par ligne, chaque ligne représentant un élément de texte à insérer dans la zone actuelle ou en ouvrant une nouvelle.
Chaque ligne est terminée par un saut de ligne.
Les éléments de texte sont marqués par une ligne qui ne consiste pas en un nombre (voir ci-dessous). Le texte utilise des caractères alphabétiques, l’espace et la ponctuation (
.,-'"?!()
). Le texte ne commencera ni ne finira par un espace et aura toujours au moins un caractère.Une boîte commence par une seule ligne avec un numéro. Le nombre indique la taille de la boîte, c'est-à-dire le nombre d'éléments suivants qui y sont placés:
2 A B
donne une boîte avec deux éléments de texte:
.---. | A | | B | '---'
Une boîte contiendra toujours au moins un élément.
La fin des cases n'est pas explicitement marquée par une ligne; au lieu de cela, les boîtes sont implicitement fermées une fois que le nombre d'éléments spécifié y est placé.
Une boîte est toujours constituée d'un seul élément, quel que soit le nombre d'éléments qu'il contient. Par exemple
3 A 4 a b c d B
donnera une boîte avec trois articles, le second est une autre boîte avec quatre articles.
L'imbrication n'affecte pas non plus le fait qu'une boîte n'est qu'un seul élément.
Limites
Le niveau de nidification maximal est de cinq . C'est-à-dire qu'il y a au plus cinq boîtes l'une dans l'autre. Cela inclut le plus externe.
Il y a un maximum de dix articles par boîte.
Les éléments de texte ont une longueur maximale de 100 caractères.
Sortie
- La sortie est la boîte rendue incluant tous les éléments contenant et imbriqués conformément aux règles décrites ci-dessus.
- La sortie doit être donnée sur la sortie standard et doit correspondre exactement. Aucun espace de début ou de fin n'est autorisé.
- Chaque ligne doit être terminée par un saut de ligne, y compris le dernier.
Condition gagnante
- Le code le plus court gagne (c'est-à-dire qu'il obtient la réponse acceptée).
Exemple d'entrée 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
Exemple de sortie 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
Exemple d'entrée 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
Exemple de sortie 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
Exemple d'entrée 3
1
1
1
1
1
Extreme nesting Part Two
Exemple de sortie 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
Exemple d'entrée 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
Exemple de sortie 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Script de test
Étant donné qu'il peut être difficile d'obtenir des détails corrects, nous ( Ventero et moi) avons déjà préparé un script de test avec lequel vous pouvez exécuter votre solution pour vérifier si elle est correcte. Il est disponible en tant que script PowerShell et script bash . L' invocation est: <test-script> <program invocation>
.
UPDATE: Les scripts de test ont été mis à jour. il y a eu un certain nombre de cas tests qui n'ont pas respecté les limites que j'ai définies. Le script de test PowerShell n'a pas utilisé de comparaison sensible à la casse pour vérifier le résultat. J'espère que tout va bien maintenant. Le nombre de cas tests a été réduit à 156, bien que le dernier soit maintenant ... assez grand.
MISE À JOUR 2: J'ai téléchargé mon générateur de cas de test . Écrit en C # , ciblant le runtime .NET 2. Il fonctionne sur Mono. Cela peut aider les gens à tester leur mise en œuvre. En tant que pire cas définitif étant donné les limites de la tâche, vous pouvez essayer:
nb.exe 1 10 10 5 100 100 | my invocation
qui générera uniquement des boîtes jusqu'au niveau le plus profond et utilisera à la fois le nombre maximal d'éléments par boîte et la longueur maximale d'éléments de texte. Je n'ai toutefois pas inclus ce scénario dans le script de test, car il est assez volumineux et la sortie encore plus volumineuse.
MISE À JOUR 3: J'ai mis à jour le script de test PowerShell qui risquait de générer des erreurs en fonction de la fin des lignes dans le script et de la fin de ligne imprimée par la solution. Maintenant, il devrait être agnostique pour les deux. Désolé encore pour la confusion.