Jesteś odpowiedzialny za budowę nowej autostrady. Prowadzi jednak przez górzyste ziemie i dlatego potrzebuje wielu mostów i tuneli. Sama autostrada powinna pozostać na jednym poziomie.
Wkład
Otrzymujesz przybliżony opis ASCII tego, jak wyglądają góry na standardowym wejściu, na przykład:
/\
/ \
/\ / \
/\ / \/ \
/ \ / \ /\
/ \/ \ / \
_ / \ /\ / \
\ / \ / \ / \ /\
\ / \ / \/ \/ \
\ / \ /
\/ \/
_
W pierwszych znaków kolumny początkiem a poziom drogi. Pasmo górskie jest przylegające i jeśli ostatni odcinek będzie mostem, ma parzystą liczbę znaków.
Możesz założyć, że linia wejściowa nigdy nie jest dłuższa niż 100 znaków i że nie ma więcej niż 15 linii. Każda linia ma taką samą długość, która na końcu może być wypełniona spacją. Droga nigdy nie zaczyna się w obrębie góry lub mostu. Pierwszą rzeczą po kafelku drogi na wejściu jest zbocze w dół lub w górę.
Wydajność
Wyjście jest tym samym pasmem górskim, z tą różnicą, że istnieje droga, na której wcześniej był tylko jej początek. Dane wyjściowe podano na wyjściu standardowym.
W tym celu istnieje wiele zasad:
Droga musi rozpoczynać się w miejscu wskazanym na wejściu i pozostawać na tym samym poziomie. Aby to ułatwić, przygotowaliśmy szereg gotowych płytek drogowych, które wyglądają następująco
_
:_______ \ / \/\/
Droga musi rozciągać się na drugi koniec pasma górskiego (tj. Długość linii wejściowych decyduje o tym, jak daleko jedzie droga).
Tunele muszą być wiercone za każdym razem, gdy góra jest tam, gdzie musi iść droga. Tunele prowadzą prosto przez górę i pozostawiają dziury na początku i na końcu (tj. Tunel zastępuje zbocze góry zamykającym nawiasem na początku i nawiasem otwierającym na końcu).
Tunele opuszczają, no cóż, tunel w górze, który zwykle ma sufit. Nasze wstępnie przygotowane płytki drogowe na szczęście można wykorzystać do wzmocnienia sufitu, aby tunel się nie zawalił (linia nad tunelem musi zostać użyta
_
do wzmocnienia tunelu):/\ / \ /____\ ___)______(__ \/ \/
Tunel nie musi być wzmacniany, gdy góra nie jest wystarczająco wysoko nad nim. Brzmi również dziwnie dla mnie, ale powiedziano mi, że prefabrykowane płytki drogowe są wystarczająco mocne, aby je utrzymać, nawet gdy są w tym przypadku rozmieszczone (sufit nie jest rysowany, gdy nachylenie jest bezpośrednio nad tunelem):
/\ /\/__\ ___)______(__ \/ \/
Mosty są potrzebne, gdy droga musi przejść przez przepaść. W przypadku krótkich mostów prefabrykowane płytki drogowe są wystarczająco mocne, ale nadal wymagają nieco wsparcia na początku i na końcu mostu (pierwsze nachylenie w dół pod mostem i ostatnie nachylenie w górę są zastąpione przez,
Y
tak aby istniała belka nośna dla mostu ):_____ Y Y \/
Dłuższe mosty wymagają dodatkowego wsparcia. Długi most to taki, który ma więcej niż sześć nieobsługiwanych płytek drogi z rzędu. Długie mosty potrzebują filaru w środku. Filary są łatwo zbudowane z naszych gotowych belek filaru, które wyglądają tak:
|
. Każdy filar potrzebuje dwóch z nich i rozciągają się aż do dna przepaści:_____________________________ Y || Y \ /\ || /\ /\/ \ /\ / \||/ \ /\/ \/ \/ \/ \/
Ponieważ dane wejściowe stanowią tylko część całego pasma górskiego, przez który trzeba zbudować autostradę, może ona nagle zakończyć się na środku mostu lub tunelu. Reguła długiego mostu nadal obowiązuje dla ostatniego segmentu i można założyć, że pierwsza część poza danym wejściem ponownie obsługuje most.
Zgodnie z powyższymi zasadami otrzymujemy następujące informacje:
/\
/ \
/\ / \
/\ / \/ \
/ \ / \ /\
/____\/______________\ /__\
_________)______________________(________)(____)____(______
Y Y Y Y Y Y Y YY
\ / \ / \/ \/ \
\ / \ /
\/ \/
Wygrywa najkrótszy kod według liczby znaków. Końcowe spacje w wierszach są ignorowane podczas sprawdzania poprawności.
Przykładowe dane wejściowe 1
_
\ /\
\ / \
\ / \
\ /\ / \ /\ /
\ /\ / \ / \ /\ /\/ \ /
\ / \ / \/ \ / \/ \/\ /
\/ \ / \ / \/
\ / \/
\/
Próbka wyjściowa 1
____________________________________________________________
Y || YY ||
\ || / \ ||
\ || / \ ||
\ || /\ / \ || /\ /
\ /\ || / \ / \ /\ |/\/ \ /
\ / \ || / \/ \ / \/ \/\ /
\/ \ || / \ / \/
\||/ \/
\/
Przykładowe wejście 2
/\ /\
/ \/ \ /
/\ / \ /\ /
/\ / \ / \/ \ /
/ \ / \/\ / \ /\ /
/ \/ \ / \ / \ /
_/ \ / \/ \/
\ /
\ /\/
\ /\ /
\/ \ /
\ /
\/
Przykładowe wyjście 2
/\ /\
/ \/ \ /
/\ / \ /\ /
/\ / \ / \/ \ /
/ \ / \/\ / \ /\ /
/____\/________\ /__________________\ /__\ /____
_)________________(__________________)____________________()____()_____
Y || Y
\ || /\/
\ /\ || /
\/ \|| /
\| /
\/
Uwaga
Końcowe spacje na wyjściu są ignorowane w celu porównania z rozwiązaniami referencyjnymi.
Warunki wygranej
Wygrywa najkrótszy kod, jak to jest w golfie. W przypadku remisu wygrywa wcześniejsze rozwiązanie.
Przypadki testowe
Istnieją dwa skrypty testowe, zawierające identyczne przypadki testowe:
Wywołanie jest w obu przypadkach: <test script> <my program> [arguments]
np . ./test ruby bridges.rb
Lub ./test.ps1 ./bridges.exe
.
Kolejna uwaga
To zadanie było częścią konkursu golfowego, który odbył się na mojej uczelni w latach 2011-W24. Wyniki i języki naszych zawodników były następujące:
- 304 - Perl
- 343 - C
- 375 - C
- 648 - Python
Nasze własne rozwiązanie (dzięki Ventero) było
- 262 - Rubinowy
Odpowiedzi:
Perl,
210195194193 znakówaktualizacja
Te same pomysły, ale stosowane w bardzo różny sposób, w przeważającej części.
Uruchom z
perl -p0
(zliczono 4 znaki dla przełączników).Wymaga to również zmiany skryptu testowego bash, aby nie przesadzać z argumentami:
BTW, naprawdę doceniam skrypty testowe, @Joey.
skomentował:
edycja :
{3,}
” na 3 dosłowne spacje i+
kwantyfikator, aby zapisać kolejny znak1while(...)
formularza, w którym mogę pominąć średnik na końcu skryptuoryginał (zobacz historię skomentowanej wersji)
Celowo nie patrzyłem na Perla @ Howarda, dopóki moje nie działało, ale mogłem poprawić grę w golfa, patrząc później.
W szczególności pomogły wyrażenia regularne sufitów tunelowych i wysuwanych filarów. Świetnie zrobione, Howard.
I odwrotnie, moja alternatywa dla uzyskania długości linii, użycia niejawnego $ _ do wydruku, pominięcia ostatniego średnika i usunięcia znaków nowej linii może skrócić Howarda do 222 znaków.
źródło
bash
skrypt testowy podziękuj Ventero. Właśnie wziąłem to, co on stworzył i bazowałem na nim, dopóki coś nie zadziałało ;-)Perl, 234 znaki
To jest tylko perlowe wyrażenie regularne. Pomija wszystkie podane przypadki testowe.
Identyczna, ale bardziej czytelna wersja pokazuje kroki podjęte w celu uzyskania wyniku:
źródło
C ++,
662622598 znaków, 4 linieTak powinno być, przetestowałem to za pomocą skryptu PowerShell, więc powinno być ok ...
Edytuj 1
Zastąpiłem wszystkie stałe char cyframi, usunąłem kolejne wywołania std :: cout + kilka innych drobnych zmian.
Edytuj 2
ostatnia edycja, żeby uzyskać mniej niż 600. Wziął g [t] [f] jako #define i przesunąłem kilka rzeczy.
źródło
#define
std::
?Rubinowy,
382356353 znakówPomyślałem, żeby dać rozwiązanie nieregexowe.
Największą oszczędnością miejsca jest użycie
||
operatora warunkowego zamiastif - elsif - end
. Więc zamiast pisaćif(a) lorem_ipsum end
napisałem!a||lopem_ipsum
. Większe bloki można uwzględnić za pomocą nawiasów!a||(block)
. Jeśli warunek obejmuje&&
operatorów, należy je zanegować, używając nawiasów i a!
lub stosując prawa De Morgana.I to samo z większą ilością słów
źródło
Scala, 462 znaków
Niezbyt konkurencyjny, ale dzisiaj wiele się nauczyłem o wyrażeniach regularnych. :-)
źródło
Erlang, 1182 znaków
W ogóle nie konkurencyjny. Szczerze mówiąc, po prostu byłem zainteresowany produkcją fajnej sztuki ascii, a nie golfem. Zauważ, że nie używa to wyrażeń regularnych, zamiast tego sam napisałem maszynę stanową. Będzie to również wymagało poprawki nadmiernego cytowania w skrypcie powłoki, wspomnianej w powyższym rozwiązaniu perla.
źródło
PowerShell,
300295 287 bajtów-8 bajtów poprawiono z odpowiedzi DCharnessa .
Skrypt testowy bez golfisty:
Wydajność:
Wyjaśnienie komiksów:
źródło