Questo compito fa parte del primo periodico Premier Programming Puzzle Push .
Ottieni una gerarchia di elementi nel seguente formato:
2
Hat
1
Gloves
che devono essere messi in scatole, in questo modo:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
Nel formato di input i numeri iniziano una casella con tutti gli elementi specificati dal numero. La prima scatola contiene due oggetti (il Cappello e la scatola che contiene i Guanti), la seconda contiene un solo oggetto: i guanti.
Come si può vedere, anche le scatole possono vivere all'interno delle scatole. E sono sempre arrotondati ... in un certo senso (gli angoli appuntiti sono un pericolo per la ferita e non lo vorremmo).
Di seguito ci sono i dettagli sgradevoli per coloro che vogliono utilizzare ogni piccolo margine di manovra fornito dalle specifiche. Intendiamoci, non leggere le specifiche non è una scusa per presentare soluzioni sbagliate. C'è uno script di test e alcuni casi di test alla fine.
specificazione
Le scatole sono costruite con i seguenti caratteri:
|
(U + 007C) viene utilizzato per costruire i bordi verticali.-
(U + 002D) viene utilizzato per costruire i bordi orizzontali.'
(U + 0027) sono gli angoli inferiori rotondi..
(U + 002E) sono gli angoli superiori rotondi.
Una scatola quindi appare così:
.--. | | '--'
Si noti che, sebbene Unicode abbia anche angoli arrotondati e caratteri di disegno a scatola adeguati, questa attività è solo in ASCII. Per quanto amo Unicode, mi rendo conto che ci sono lingue e ambienti che non sono arrivati nel secondo all'ultimo decennio.
Le caselle possono contenere una sequenza di elementi che sono testo o altri elementi. I singoli elementi in una casella vengono visualizzati dall'alto verso il basso. La sequenza A, B, C viene quindi visualizzata come segue:
.---. | A | | B | | C | '---'
Questo ovviamente si applica anche alle caselle nidificate, che sono un elemento proprio come il testo. Quindi la sequenza A, B, Riquadro (C, Riquadro (D, E)), F verrebbe visualizzato come segue:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
Le caselle adattano le loro dimensioni al contenuto e le caselle nidificate si estendono sempre alle dimensioni del loro genitore. C'è sempre uno spazio prima e dopo il contenuto, in modo che né il testo né i riquadri nidificati siano troppo vicini al bordo del riquadro esterno. In breve, quanto segue è sbagliato:
.---. |Box| '---'
E il seguente è corretto:
.-----. | Box | '-----'
Sembra anche molto più bello :-)
Gli elementi di testo (vedi input sotto) devono essere riprodotti esattamente.
C'è sempre una sola casella di livello superiore (vedi XML). Tuttavia, una casella può contenere diverse altre caselle.
Ingresso
L'input è dato su input standard; per test più facili probabilmente reindirizzati da un file.
L'input viene dato in linea, con ogni riga che rappresenta un elemento di testo da inserire nella casella corrente o l'apertura di una nuova casella.
Ogni riga è terminata da un'interruzione di riga.
Gli elementi di testo sono contrassegnati da una riga che non è composta da un numero (vedi sotto). Il testo utilizza caratteri alfabetici, lo spazio e la punteggiatura (
.,-'"?!()
). Il testo non inizierà o finirà con uno spazio e avrà sempre almeno un carattere.Una casella inizia con una singola riga con un numero al suo interno. Il numero indica la dimensione della casella, ovvero il numero dei seguenti elementi che vengono inseriti:
2 A B
restituisce una casella con due elementi di testo:
.---. | A | | B | '---'
Una scatola conterrà sempre almeno un oggetto.
La fine delle caselle non è esplicitamente contrassegnata da una linea; invece le caselle vengono implicitamente chiuse dopo che il numero specificato di elementi viene inserito in esse.
Una scatola è sempre solo un singolo oggetto, indipendentemente da quanti oggetti ci siano. Per esempio
3 A 4 a b c d B
produrrà una scatola con tre oggetti, il secondo dei quali è un'altra scatola con quattro oggetti.
La nidificazione inoltre non influisce sul fatto che una scatola è solo un singolo elemento.
limiti
Il livello massimo di annidamento è cinque . Cioè ci sono al massimo cinque scatole l'una dentro l'altra. Questo include quello più esterno.
C'è un massimo di dieci articoli per scatola.
Gli elementi di testo hanno una lunghezza massima di 100 caratteri.
Produzione
- L'output è la casella di rendering che include tutti gli elementi contenenti e nidificati in base alle regole descritte sopra.
- L'output deve essere fornito su output standard e deve corrispondere esattamente. Non sono consentiti spazi bianchi iniziali o finali.
- Ogni riga deve essere terminata con un'interruzione di riga, inclusa l'ultima.
Condizioni vincenti
- Vince il codice più breve (ovvero ottiene la risposta accettata).
Esempio di input 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
Uscita campione 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
Esempio di input 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
Uscita campione 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
Esempio di input 3
1
1
1
1
1
Extreme nesting Part Two
Uscita campione 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
Esempio di input 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
Uscita campione 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Test script
Dal momento che ottenere i dettagli giusti può essere difficile a volte ( noi e Ventero ) abbiamo preparato uno script di test con cui è possibile eseguire la soluzione per verificare se è corretta. E 'disponibile sia come script di PowerShell e script bash . Invocazione è: <test-script> <program invocation>
.
AGGIORNAMENTO: gli script di test sono stati aggiornati; c'erano diversi casi di test che non rispettavano i limiti da me definiti. Lo script di test di PowerShell non ha utilizzato il confronto con distinzione tra maiuscole e minuscole per verificare il risultato. Spero che ora vada tutto bene. Il numero di casi di test è stato ridotto a 156, sebbene l'ultimo ora sia abbastanza ... grande.
AGGIORNAMENTO 2: ho caricato il mio generatore di test case . Scritto in C # , destinato al runtime .NET 2. Funziona su Mono. Può aiutare le persone a testare la loro implementazione. Come caso peggiore definitivo, dati i limiti dell'attività, puoi provare:
nb.exe 1 10 10 5 100 100 | my invocation
che genererà solo riquadri fino al livello più interno e utilizzerà sia il numero massimo di elementi per riquadro sia la lunghezza massima degli elementi di testo. Non ho incluso questo caso di test nello script di test, poiché è piuttosto grande e l'output è ancora più grande.
AGGIORNAMENTO 3: ho aggiornato lo script di test di PowerShell che era incline a generare errori a seconda di come erano terminate le righe nello script e quali terminazioni di riga stampavano la soluzione. Ora dovrebbe essere agnostico per entrambi. Scusami ancora per la confusione.