Diese Aufgabe ist Teil des First Periodic Premier Programming Puzzle Push .
Sie erhalten eine Hierarchie von Elementen im folgenden Format:
2
Hat
1
Gloves
die müssen in Kisten gelegt werden, wie so:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
Im Eingabeformat beginnen die Zahlen mit einem Kästchen mit so vielen Elementen, wie die Nummer angibt. Die erste Schachtel enthält zwei Gegenstände (den Hut und die Schachtel mit den Handschuhen), die zweite enthält nur einen einzigen Gegenstand - die Handschuhe.
Wie man sieht, können Kisten auch in Kisten leben. Und sie sind immer abgerundet ... irgendwie (spitze Ecken sind eine Gefahr für Wunden und das würden wir nicht wollen).
Nachfolgend finden Sie die Details für diejenigen, die jeden noch so kleinen Spielraum nutzen möchten, den die Spezifikation bietet. Wohlgemerkt, das Nichtlesen der Spezifikation ist keine Entschuldigung für das Einreichen falscher Lösungen. Ganz am Ende stehen ein Testskript und einige Testfälle.
Spezifikation
Boxen bestehen aus folgenden Zeichen:
|
(U + 007C) wird verwendet, um die vertikalen Kanten zu konstruieren.-
(U + 002D) wird verwendet, um die horizontalen Kanten zu konstruieren.'
(U + 0027) sind die runden unteren Ecken..
(U + 002E) sind die runden oberen Ecken.
Eine Box sieht also so aus:
.--. | | '--'
Beachten Sie, dass Unicode zwar auch runde Ecken und korrekte Box-Zeichen aufweist, diese Aufgabe jedoch nur in ASCII ausgeführt wird. So sehr ich Unicode liebe, so sehr stelle ich fest, dass es Sprachen und Umgebungen gibt, die im vorletzten Jahrzehnt noch nicht ganz angekommen sind.
Boxen können eine Folge von Elementen enthalten, die entweder Text oder andere Elemente sind. Einzelne Elemente in einer Box werden von oben nach unten gerendert. Die Folge A, B, C ergibt sich somit wie folgt:
.---. | A | | B | | C | '---'
Dies gilt natürlich auch für verschachtelte Felder, die genau wie Text ein Element sind. Die Folge A, B, Box (C, Box (D, E)), F würde also wie folgt aussehen:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
Boxen passen ihre Größe an den Inhalt an und verschachtelte Boxen erstrecken sich immer auf die Größe ihrer Eltern. Vor und nach dem Inhalt befindet sich immer ein Leerzeichen, sodass weder Text noch verschachtelte Felder zu nah am Rand des äußeren Felds sind. Kurz gesagt ist das Folgende falsch:
.---. |Box| '---'
Und das Folgende ist richtig:
.-----. | Box | '-----'
Sieht auch viel schöner aus :-)
Textelemente (siehe Eingabe unten) müssen exakt reproduziert werden.
Es gibt immer eine einzige Top-Level-Box (vgl. XML). Eine Box kann jedoch mehrere andere Boxen enthalten.
Eingang
Die Eingabe erfolgt über die Standardeingabe. zum leichteren Testen wahrscheinlich aus einer Datei umgeleitet.
Die Eingabe erfolgt zeilenweise, wobei jede Zeile entweder ein Textelement darstellt, das in das aktuelle Feld eingefügt werden soll, oder ein neues Feld öffnet.
Jede Zeile wird durch einen Zeilenumbruch abgeschlossen.
Textelemente werden durch eine Zeile markiert, die nicht aus einer Zahl besteht (siehe unten). Text verwendet alphabetische Zeichen, Leerzeichen und Interpunktion (
.,-'"?!()
). Text beginnt oder endet nicht mit einem Leerzeichen und hat immer mindestens ein Zeichen.Ein Kästchen beginnt mit einer einzelnen Zeile mit einer Zahl. Die Zahl gibt die Größe des Kartons an, dh die Anzahl der folgenden Elemente, die darin abgelegt werden:
2 A B
ergibt eine Box mit zwei Textelementen:
.---. | A | | B | '---'
Eine Box enthält immer mindestens einen Artikel.
Das Ende von Feldern ist nicht explizit mit einer Linie markiert. Stattdessen werden Boxen implizit geschlossen, nachdem die angegebene Anzahl von Elementen in sie eingefügt wurde.
Eine Schachtel ist immer nur ein einzelnes Objekt, unabhängig davon, wie viele Objekte sich darin befinden. Z.B
3 A 4 a b c d B
ergibt eine Schachtel mit drei Gegenständen, von denen der zweite eine weitere Schachtel mit vier Gegenständen ist.
Das Verschachteln hat auch keinen Einfluss darauf, dass eine Schachtel nur ein einzelnes Objekt ist.
Grenzen
Die maximale Verschachtelungsstufe beträgt fünf . Dh es sind höchstens fünf Kisten ineinander. Dies schließt den äußersten ein.
Es gibt maximal zehn Artikel pro Karton.
Textelemente haben eine maximale Länge von 100 Zeichen.
Ausgabe
- Die Ausgabe ist das gerenderte Feld, das alle enthaltenen und verschachtelten Elemente gemäß den oben angegebenen Regeln enthält.
- Die Ausgabe sollte auf der Standardausgabe erfolgen und muss genau übereinstimmen. Es ist kein führendes oder nachfolgendes Leerzeichen zulässig.
- Jede Zeile muss mit einem Zeilenumbruch abgeschlossen werden, einschließlich des letzten.
Gewinnbedingung
- Kürzester Code gewinnt (dh bekommt die akzeptierte Antwort).
Probeneingabe 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
Beispielausgabe 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
Probeneingabe 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
Beispielausgabe 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
Probeneingabe 3
1
1
1
1
1
Extreme nesting Part Two
Beispielausgabe 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
Probeneingabe 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
Beispielausgabe 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Skript testen
Da es manchmal schwierig sein kann, die richtigen Details zu ermitteln, haben wir ( Ventero und ich) ein Testskript erstellt, mit dem Sie Ihre Lösung ausführen können, um zu überprüfen, ob sie korrekt ist. Es ist sowohl als PowerShell-Skript als auch als Bash-Skript verfügbar . Invocation ist: <test-script> <program invocation>
.
UPDATE: Die Testskripte wurden aktualisiert. Es gab eine Reihe von Testfällen, die die von mir festgelegten Grenzwerte nicht einhielten. Das PowerShell-Testskript verwendete für die Überprüfung des Ergebnisses nicht die Groß- und Kleinschreibung. Ich hoffe, jetzt ist alles in Ordnung. Die Anzahl der Testfälle wurde auf 156 reduziert, obwohl der letzte jetzt ziemlich ... groß ist.
UPDATE 2: Ich habe meinen Testfallgenerator hochgeladen . In C # geschrieben und auf die .NET 2-Laufzeit ausgerichtet. Es läuft auf Mono. Es kann Leuten helfen, ihre Implementierung zu testen. In Anbetracht der Grenzen der Aufgabe können Sie im schlimmsten Fall Folgendes versuchen:
nb.exe 1 10 10 5 100 100 | my invocation
Dabei werden nur Felder bis zur innersten Ebene generiert und sowohl die maximale Anzahl von Elementen pro Feld als auch die maximale Länge von Textelementen verwendet. Ich habe diesen Testfall jedoch nicht in das Testskript aufgenommen, da er ziemlich groß und die Ausgabe noch größer ist.
UPDATE 3: Ich habe das PowerShell- Testskript aktualisiert, das Fehler auslöst, je nachdem, wie die Zeilenenden im Skript sind und welche Zeilenenden die Lösung ausgibt. Jetzt sollte es für beide agnostisch sein. Entschuldigung nochmal für die Verwirrung.