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.
Odpowiedzi:
GolfScript, 125 znaków
Stosując podobne podejście jak rozwiązanie Keitha .
źródło
Python, 204 znaki
P
zwraca listę trójek, z których każda jest prefiksem / sufiksem linii (sufiksem jest odwrotność prefiksu), pewnym tekstem linii i znakiem wypełnienia linii. Po obliczeniu wszystkich trójek są one drukowane przy użyciu odpowiedniej liczby znaków wypełnienia, aby wszystkie linie miały tę samą długość.Wersja bez golfa:
źródło
P
.Ruby 1.9, 174 znaków
Nieco podobne do rozwiązania Keitha .
źródło
APL (78)
źródło
Python -
355314259 znakówźródło
Ruby 1.9,
229228226223222źródło
C,
390366363 znakówPołącz z
gcc -std=gnu99 -w file.c
Nawet nie jest zbliżona do wersji Keitha, ale hej, to jest dobre, stare
źródło
160/160 passed
(miałem na myśli ciąg 100 znaków, który i tak nie jest obecny)FreeBSD 8.2-RELEASE #5: Sun Feb 27 10:40:25 CET 2011
zgcc version 4.2.1 20070719 [FreeBSD]
na x64 tutaj. Uwierzę ci na 160, a potem :-). I powinien istnieć przypadek testowy ze 100 znakami (Testy 143–147).bardzo funkcjonalny python, 460 znaków
źródło
|
postacie nie są poprawnie rozmieszczone. Jest bardzo podobny do mojego rozwiązania w PythonieHaskell, 297 znaków
Podczas gry w golfa metoda jest dość prosta. Dostępne są tylko limity pamięci.
źródło
C # -
1005 859 852782 znakówMuszę
rzucićna to okiem, ponieważ jestem pewien, że można to poprawić, ale jest to mojepierwsze przejście natrzecie przejście.Ungolf'd:
źródło
var a = 1, b = 2, c = 3;
. Nie możesz zrobić tego samego w C?var
stwierdzeń. Możesz łączyć tylko wtedy, gdy mają wyraźny typ, o którym wspominał Joeystring b="",e=""
.PHP,
403388306 znakówNie golfowany:
Pożyczyłem pomysł Keixa na prefiks (czy to w ogóle dozwolone?), W przeciwnym razie jest to mniej więcej oryginał. Nadal nie mógł spaść poniżej 300. Utknąłem z tym. Dalej.
źródło
PHP,
806769721653619 znakówWersja bez golfa:
źródło
<?
na początku nawet uruchomienia. Wtedy najwyraźniej używasz maksymalnej długości wszystkich elementów tekstowych w przypadku testowym jako szerokości najbardziej wewnętrznego pola. Ten kod przekazuje tylko 118 przypadków testowych (testowanych w systemie Linux i FreeBSD). Nie mam pojęcia, co zrobiłeś ze skryptem PowerShell, który by nie działał :-(. Wywołanie go tak, jakpowershell -noprofile -file test.ps1 php boxes.php
powinno działać, w rzeczywistości. Ale nie mam PHP na moim komputerze z systemem Windows do przetestowania.Java -
681668 znakówzasadniczo taka sama metoda jak kod Pythona Keitha Randalla
Wersja bez golfa:
źródło
throws
.break;
)char
porównań patrząc na kody ASCII na dłużej ... ale muszę iść przygotować się do urlopuPerl -
200199 znakówTen sam algorytm jak Python Keitha Randalla (ładny design, Keith), ale akceptuje go nieco bardziej kompaktowy w tym Perlu.
źródło
$_@_@_
wygląda na to, że ktoś ściga znak dolaraF # - 341 znaków
Wersja F # rozwiązania Keitha. Listy są domyślnie niezmienne, więc ta wersja umieszcza całą funkcję rekurencyjną w liście, zwraca listę, z której elementy są wyodrębniane za pomocą
for..do
pętli i ayield!
. Nie mogłem znaleźć sposobu na zwięzłe odwrócenie prefiksu, więc po prostu przyłączyłem sufiks do potrójnych.Do Twojej wiadomości, metoda TryParse zwraca wartość podwójną
(bool,int)
.źródło
Clojure - 480 znaków
To mój pierwszy program Clojure, a także moja pierwsza próba golfowa Clojure, więc nie trzeba dodawać, że nie należy tego traktować jako reprezentatywnego dla rozwiązań Clojure. Jestem pewien, że można by go znacznie skrócić, szczególnie jeśli metoda parsowania i budowania skrzynek jednocześnie zostanie zaimplementowana przez Keitha Randalla .
źródło
C # -
472 470 426 422398 znakówźródło
goto
! Nawiasem mówiąc, możesz pominąć nawiasy wokół argumentów lambdaz
iv
sprowadzając to do 421.Scala - 475 znaków
źródło
C #
1198 1156 1142 689671634 znakówźródło
\n
wydaje się w końcu wystarczające.Pip , 89 bajtów (niekonkurujący)
(Język jest nowszy niż wyzwanie. Poza tym nie mogłem całkowicie prześcignąć APL-a).
Kod to 87 bajtów, +2 dla
-rn
flag.Wypróbuj online!
Funkcja
z
przetwarza pierwszy element listy danych wejściowych (g
skopiowany do zmiennej globalneji
, aby był dostępny w wywołaniach funkcji). Jeśli jest to liczba n , wywołuje się rekurencyjnie n razy,"| " " |"
wstawia wynikową listę linii do pełnego prostokąta, zawija każdą linię i dodaje.---.
i'---'
linie przed zwróceniem nowej listy. Jeśli jest to ciąg znaków, po prostu konwertuje go na listę jednopunktową i zwraca. Ostateczny wynik jest drukowany jako separator nowej linii (-n
flaga). Więcej szczegółów dostępnych na życzenie.źródło
Java (1369 znaków łącznie z EOL)
Nie można tego zostawić bez implementacji Java. Java ma być bardziej gadatliwa niż sztuczki Pythona i Ruby, więc wybrałem eleganckie, rekurencyjne rozwiązanie.
Chodzi o drzewo (wykres) obiektów (ciągi i pola), zawierające się nawzajem, zaczynając od pola „głowy”. Podczas liniowego przetwarzania pliku wejściowego dodajesz ciągi i pola do pola „bieżącego”, a podczas dodawania dostosowywana jest maksymalna długość kontenera. Kiedy kontener osiągnie liczbę predefiniowanych przedmiotów, które może Cię zatrzymać, powróć do poprzedniego kontenera. Na końcu pliku wejściowego znajduje się kontener „head”, który ma już obliczoną wartość „maxLength”, więc wystarczy wywołać jego metodę print ().
To naprawdę przyjemne rozwiązanie do pisania. Bardzo podobało mi się to pytanie. Jak wspomniałem wcześniej, zdecydowałem się na elegancję rozwiązania, a nie minimalistyczne podejście, niestety Java nie ma wydruku Pythona „-” * 4 do wyprodukowania ”----„ :-)
Oto wersja bez golfa:
źródło