To zadanie jest częścią First Periodic Premier Programming Puzzle Push .
Otrzymasz hierarchię pozycji w następującym formacie:
2
Hat
1
Gloves
które należy umieścić w pudełkach, np .:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
W formacie wejściowym liczby zaczynają się od pola zawierającego tyle elementów, ile określa liczba. Pierwsze pudełko zawiera dwa przedmioty (Kapelusz i pudełko zawierające Rękawiczki), drugie zawiera tylko jeden przedmiot - rękawiczki.
Jak widać, pudła mogą również mieszkać wewnątrz pudełek. I zawsze są zaokrąglone ... w pewnym sensie (spiczaste rogi stanowią zagrożenie dla ran i nie chcielibyśmy tego).
Poniżej znajdują się paskudne szczegóły dla tych, którzy chcą wykorzystać każdą najmniejszą swobodę, jaką daje specyfikacja. Pamiętaj, że nie czytanie specyfikacji nie jest usprawiedliwieniem do przesyłania złych rozwiązań. Na samym końcu znajduje się skrypt testowy i kilka przypadków testowych.
Specyfikacja
Pudełka są zbudowane z następujących znaków:
|
(U + 007C) służy do budowy pionowych krawędzi.-
(U + 002D) służy do konstruowania poziomych krawędzi.'
(U + 0027) to okrągłe dolne rogi..
(U + 002E) to okrągłe górne rogi.
Dlatego pudełko wygląda następująco:
.--. | | '--'
Zauważ, że chociaż Unicode ma również okrągłe rogi i odpowiednie znaki do rysowania ramek, to zadanie jest tylko w ASCII. Chociaż uwielbiam Unicode, zdaję sobie sprawę, że istnieją języki i środowiska, które nie dotarły do końca w ciągu ostatniej dekady.
Pudełka mogą zawierać sekwencję elementów, które są tekstem lub innymi elementami. Poszczególne elementy w pudełku są renderowane od góry do dołu. Sekwencja A, B, C jest zatem następująca:
.---. | A | | B | | C | '---'
Dotyczy to oczywiście również zagnieżdżonych pól, które są tak samo jak tekst. Tak więc sekwencja A, B, Box (C, Box (D, E)), F wyglądałaby następująco:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
Pola dostosowują swój rozmiar do zawartości, a pola zagnieżdżone zawsze rozciągają się na rozmiar elementu nadrzędnego. Zawsze jest spacja przed i po zawartości, więc ani tekst, ani zagnieżdżone pola nie są zbyt blisko krawędzi zewnętrznego pola. Krótko mówiąc, następujące informacje są błędne:
.---. |Box| '---'
I poprawne jest:
.-----. | Box | '-----'
Wygląda też o wiele ładniej :-)
Elementy tekstowe (patrz Wejście poniżej) muszą być dokładnie odtworzone.
Zawsze jest jedno pole najwyższego poziomu (por. XML). Jednak jedno pudełko może zawierać kilka innych pól.
Wejście
Dane wejściowe są podawane na standardowe dane wejściowe; dla łatwiejszego testowania prawdopodobnie przekierowane z pliku.
Dane wejściowe są podawane liniowo, przy czym każda linia reprezentuje albo element tekstowy, który ma zostać umieszczony w bieżącym polu, albo otwiera nowe pole.
Każda linia kończy się przerwaniem linii.
Elementy tekstowe są oznaczone linią, która nie składa się z liczby (patrz poniżej). Tekst używa znaków alfabetu, spacji i interpunkcji (
.,-'"?!()
). Tekst nie będzie zaczynać się ani kończyć spacją i zawsze będzie miał co najmniej jeden znak.Pole zaczyna się od pojedynczego wiersza z liczbą. Liczba określa rozmiar pudełka, tj. Liczbę następujących elementów, które są w nim umieszczone:
2 A B
daje pole z dwoma elementami tekstowymi:
.---. | A | | B | '---'
Pudełko zawsze będzie zawierało co najmniej jeden przedmiot.
Koniec pól nie jest wyraźnie oznaczony linią; zamiast tego pola są domyślnie zamykane po umieszczeniu w nich określonej liczby elementów.
Pudełko jest zawsze tylko pojedynczym przedmiotem, niezależnie od tego, ile jest w nim przedmiotów. Na przykład
3 A 4 a b c d B
da pudełko z trzema przedmiotami, z których drugie to kolejne pudełko z czterema przedmiotami.
Zagnieżdżanie nie wpływa również na fakt, że pudełko jest tylko jednym przedmiotem.
Granice
Maksymalny poziom zagnieżdżenia to pięć . Tzn. W środku jest najwyżej pięć pudeł. Dotyczy to również najbardziej zewnętrznego.
Opakowanie zawiera maksymalnie dziesięć przedmiotów.
Elementy tekstowe mają maksymalną długość 100 znaków.
Wynik
- Dane wyjściowe to renderowane pole zawierające wszystkie elementy zawierające i zagnieżdżone zgodnie z zasadami opisanymi powyżej.
- Dane wyjściowe powinny być podane na wyjściu standardowym i muszą być dokładnie dopasowane. Niedozwolone są wiodące lub końcowe białe znaki.
- Każda linia musi być zakończona podziałem linii, w tym ostatnią.
Warunki wygranej
- Najkrótszy kod wygrywa (tzn. Otrzymuje akceptowaną odpowiedź).
Przykładowe dane wejściowe 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
Próbka wyjściowa 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
Przykładowe wejście 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
Przykładowe wyjście 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
Przykładowe dane wejściowe 3
1
1
1
1
1
Extreme nesting Part Two
Próbka wyjściowa 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
Przykładowe wejście 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
Próbka wyjściowa 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Skrypt testowy
Ponieważ prawidłowe uzyskanie szczegółów może być czasami trudne (my i Ventero ) przygotowaliśmy skrypt testowy, w którym możesz uruchomić swoje rozwiązanie, aby sprawdzić, czy jest poprawne. Jest dostępny zarówno jako skrypt PowerShell, jak i skrypt bash . Inwokacja jest: <test-script> <program invocation>
.
AKTUALIZACJA: Skrypty testowe zostały zaktualizowane; było wiele przypadków testowych, które nie respektowały określonych przeze mnie limitów. Skrypt testowy PowerShell nie używał porównania wielkości liter do sprawdzania wyniku. Mam nadzieję, że teraz wszystko jest w porządku. Liczba przypadków testowych została zmniejszona do 156, chociaż ostatni jest teraz dość ... duży.
AKTUALIZACJA 2: Przesłałem mój generator przypadków testowych . Napisane w języku C # , ukierunkowane na środowisko uruchomieniowe .NET 2. Działa na Mono. Może to pomóc ludziom przetestować ich wdrożenie. Jako najgorszy przypadek, biorąc pod uwagę ograniczenia zadania, możesz spróbować:
nb.exe 1 10 10 5 100 100 | my invocation
który wygeneruje tylko pola do najbardziej wewnętrznego poziomu i wykorzysta zarówno maksymalną liczbę elementów w polu, jak i maksymalną długość elementów tekstowych. Nie uwzględniłem tego przypadku testowego w skrypcie testowym, ponieważ jest on dość duży, a wynik jeszcze większy.
AKTUALIZACJA 3: Zaktualizowałem skrypt testowy PowerShell, który miał skłonność do zgłaszania błędów w zależności od tego, jak kończą się linie w skrypcie i jakie końce linii drukuje rozwiązanie. Teraz powinno być agnostyczne dla obu. Jeszcze raz przepraszam za zamieszanie.