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.
Réponses:
GolfScript, 125 caractères
En utilisant une approche similaire à celle de la solution de Keith .
la source
Python, 204 caractères
P
renvoie une liste de triplets, chacun étant un préfixe de ligne / suffixe (le suffixe étant l'inverse du préfixe), du texte de ligne et un caractère de remplissage de ligne. Après avoir calculé tous les triplets, ils sont imprimés avec le bon nombre de caractères de remplissage pour que toutes les lignes aient la même longueur.Version non-golfée:
la source
P
là.Ruby 1.9, 174 caractères
Un peu similaire à la solution de Keith .
la source
APL (78)
la source
Python -
355314259 caractèresla source
Ruby 1.9,
229228226223222la source
C,
390366363 caractèresCompiler avec
gcc -std=gnu99 -w file.c
Pas même proche de la version de Keith, mais bon, c'est bon vieux
la source
160/160 passed
FreeBSD 8.2-RELEASE #5: Sun Feb 27 10:40:25 CET 2011
avecgcc version 4.2.1 20070719 [FreeBSD]
sur x64 ici. Je te crois sur parole pour le 160, alors :-). Et il devrait y avoir un scénario de test avec 100 caractères, en fait (tests 143 à 147).python très fonctionnel, 460 caractères
la source
|
caractères ne sont pas correctement espacés. C'est très similaire à ma solution pythonHaskell, 297 caractères
Alors que golf'd, la méthode est assez simple. Seules les limites sont la mémoire disponible.
la source
C # -
1005 859 852782 caractèresJe dois examiner cela de nouveau car je suis sûr que cela peut être amélioré, mais c'est mon troisième essai
initial.Ungolf'd:
la source
var a = 1, b = 2, c = 3;
. Tu ne peux pas faire la même chose en C?var
déclarations implicites de ce genre. Vous ne pouvez combiner que s'ils ont un type explicite comme Joey, mentionné en utilisantstring b="",e=""
.PHP,
403388306 caractèresUngolfed:
J'ai emprunté le préfixe-idée à Keith (est-ce permis?), Sinon c'est assez semblable à l'original. Je ne pouvais toujours pas descendre en dessous de 300. Coincé avec ça. En avant.
la source
PHP,
806769721653619 caractèresVersion non-golfée:
la source
<?
au début une course. Ensuite, vous utilisez apparemment la longueur maximale de tous les éléments de texte dans un scénario de test comme largeur pour la zone la plus à l'intérieur. Ce code ne transmet que 118 des cas de test (testés sous Linux et FreeBSD). Je n'ai aucune idée de ce que vous avez fait au script PowerShell selon lequel il ne fonctionnerait pas :-(. L'appeler comme telpowershell -noprofile -file test.ps1 php boxes.php
devrait fonctionner, en fait. Mais je n'ai pas de code PHP sur ma machine Windows à tester.Java -
681668 caractèresessentiellement la même méthode que le code Python de Keith Randall
Version non-golfée:
la source
throws
.break;
)char
comparaisons en regardant les codes ASCII plus longtemps ... mais je dois me préparer pour les vacancesPerl -
200199 caractèresMême algorithme que Python de Keith Randall (joli design, Keith), mais un peu plus compact dans cette version de Perl.
la source
$_@_@_
on dirait que quelqu'unF # - 341 caractères
Une version F # de la solution de Keith. Les listes étant immuables par défaut, cette version intègre la totalité de la fonction récursive dans une liste et renvoie la liste à partir de laquelle les éléments sont extraits à l'aide de la
for..do
boucle et de la commande ayield!
. Je ne pouvais pas trouver un moyen d'inverser le préfixe de manière concise, alors j'ai simplement attaché le suffixe aux triples.Pour votre information, la méthode TryParse renvoie un double
(bool,int)
.la source
Clojure - 480 caractères
Il s’agit de mon premier programme Clojure et de ma première tentative de golf Clojure. Inutile donc de dire que cela ne doit pas être considéré comme représentatif des solutions Clojure en général. Je suis sûr que cela pourrait être considérablement raccourci, surtout si la méthode d'analyse et de construction des boîtes à la fois de Keith Randall était appliquée.
la source
C # -
472 470 426 422398 caractèresla source
goto
! En passant, vous pouvez omettre les parenthèses autour des arguments lambdaz
etv
ramener cela à 421.Scala - 475 caractères
la source
C #
1198 1156 1142 689 671634 Caractèresla source
\n
semble suffire à la fin.Pip , 89 octets (non concurrents)
(La langue est plus récente que le défi. En outre, je ne pouvais pas tout à fait surgluter APL.)
Le code est 87 octets, +2 pour les
-rn
drapeaux.Essayez-le en ligne!
La fonction
z
traite le premier élément de la liste d'entrées (g
, copiée dans une variable globalei
afin d'être disponible dans les appels de fonction). Si ce chiffre est n , il se dit récursive n fois, la liste des tampons résultant des lignes à un rectangle plein, enveloppe chaque ligne"| " " |"
et ajoute.---.
et les'---'
lignes avant de retourner la nouvelle liste. S'il s'agit d'une chaîne, il la convertit simplement en une liste à un élément et la renvoie. Le résultat final est imprimé séparé par une ligne (-n
drapeau). Plus de détails disponibles sur demande.la source
Java (1369 caractères, y compris les EOL)
Impossible de laisser cela sans implémentation Java. Java est supposé être plus bavard que les nappes de Python et de Ruby, alors je suis allé vers une solution élégante et récursive.
L'idée est un arbre (graphe) d'objets (chaînes et boites), se contenant les uns les autres à partir d'une boite "tête". Lorsque vous analysez linéairement le fichier d'entrée, vous ajoutez des chaînes et des cases à la case "actuelle" et pendant que vous ajoutez, la longueur maximale du conteneur est ajustée. Lorsqu'un conteneur atteint la quantité d'éléments prédéfinis, il peut vous permettre de revenir au conteneur précédent. À la fin du fichier d'entrée, vous avez un conteneur "head" qui a déjà un "maxLength" calculé, vous appelez donc simplement sa méthode print ().
C'est vraiment une solution agréable à écrire. J'ai beaucoup aimé la question. Comme je l'ai mentionné plus tôt, j'ai opté pour une élégance des solutions plutôt qu'une approche minimaliste. Malheureusement, Java n'a pas l'empreinte de Python "-" * 4 pour produire "----" :-)
Voici la version non-golfée:
la source