W Stanach Zjednoczonych dwa przeciwne kierunki ruchu na drodze są oddzielone przerywaną żółtą linią, jeśli dozwolone jest przejazd, oraz dwie stałe żółte linie, jeśli przejazd jest niedozwolony.
(Tylko jedna strona może być przerywana, aby umożliwić przejście po tej stronie, a żółte linie mogą oznaczać inne rzeczy, takie jak środkowe lub odwracalne pasy, ale nie zajmujemy się tymi przypadkami.)
Napisz program, który odbywa się w run-length zakodowany ciąg P
na przejściu i N
na żadnym biegiem , a drukuje wersji ASCII odpowiedniej drogi. Z wyjątkiem linii środkowej droga ma zawsze ten sam wzór, co można łatwo wywnioskować z poniższych przykładów.
Przed każdym P
iw N
ciągu wejściowym będzie dodatnia liczba dziesiętna . Liczba ta określa długość przejeżdżającego lub nie przejeżdżającego regionu bieżącej części drogi.
Przykłady
Dane wejściowe 12N
wygenerowałyby 12 kolumn bez przejeżdżającej drogi (linia środkowa wszystkie =
):
____________
============
____________
Dane wejściowe 12P
wygenerowałyby 12 kolumn przejeżdżającej drogi ( -
powtarzająca się linia środkowa ):
____________
- - - - - -
____________
Podanie i brak podania nie mogą być następnie połączone, np. 4N4P9N7P1N1P2N2P
Spowoduje
______________________________
====- - =========- - - -=-==-
______________________________
Są to 4 kolumny bez przejścia , następnie 4 przejścia , a następnie 9 brak przejścia itp.
Zauważ, że mijająca strefa zawsze zaczyna się od myślnika ( -
) po lewej stronie, a nie spacji ( ). To jest wymagane.
Detale
- Wejście nigdy nie będzie miało dwóch
N
lub dwóchP
stref z rzędu. np.4P5P
nigdy nie nastąpi. - Nie musisz obsługiwać liter bez wiodącej liczby dodatniej. Zwykły
P
zawsze będzie1P
, zwykłyN
zawsze będzie1N
. - Mogą występować spacje końcowe, o ile nie rozciągają się one poza ostatnią kolumnę drogi. Może być jeden opcjonalny znak nowej linii.
- Zamiast programu możesz napisać funkcję, która pobiera zakodowany ciąg znaków i wypisuje lub zwraca drogę ASCII.
- Pobiera dane wejściowe w dowolny standardowy sposób (standardowe, wiersz poleceń, funkcja arg).
Najkrótszy kod w bajtach wygrywa. Tiebreaker jest wcześniejszym postem.
Odpowiedzi:
CJam, 38 bajtów
Jak to działa
My najpierw przypisać właściwą kolumnę droga do zmiennych
N
iP
, a następnie po prostu ocenić ciąg wejściowy. Pozostawia to parę długości i kolumnę na stosie. Grupujemy je, uruchamiamy na nim RLD, aby uzyskać pełne kolumny, transponujemy, aby do nich dołączyć, a następnie przekształcamy ciągłość--
na-
.Wypróbuj online tutaj
źródło
JavaScript (ES6), 114
Używając ciągów szablonów , należy zliczyć 5 wysuwów linii, które są znaczące.
źródło
rs , 252 znaki
Chociaż może się to nie liczyć, ponieważ godzinę temu dodałem operatora konwergencji jako zdzierstwo Retiny Martina Büttnera ... Tak naprawdę nie jestem tu, by konkurować. Po prostu fajnie jest tworzyć rozwiązanie oparte na wyrażeniach regularnych.
Mam drugą linię od odpowiedzi Martina na siatkówkę dla Programowania języków przez lata .
Wyjaśnienie
To robi dużo magii. Aby uzyskać więcej informacji, zobacz odpowiedź, którą zamieściłem powyżej.
Zasadniczo z danymi wejściowymi
4N4P9N7P1N1P2N2P
będzie to wynik:Kolejny:
Zastępuje to liczby poprzedzające nieprzejściowy symbol (N) znakami równości. Wynik z poprzedniego wejścia:
To:
zastępuje pierwszą liczbę poprzedzającą mijający symbol (P) pierwszym myślnikiem. Wynik:
Następne dwie linie kontynuują ten sam wzór:
Pierwsza linia zastępuje resztę linii wzorcem odstępu. Drugi obsługuje liczbę nieparzystą; zastępuje ostatni myślnik, po którym następuje pojedyncza liczba całkowita (taka jak
-5
) znakiem myślnika (-
). Teraz dane wyjściowe to:Teraz sprawy zaczynają się układać. Następna linia:
po prostu usuwa
#N
i#P
.ustaw podkreślenia na górze i na dole, aby uzyskać:
Na koniec usuwamy
A
:źródło
Haskell, 165 bajtów
Przykładowy przebieg (
f
zwraca ciąg, więc dla lepszego wyświetlania wydrukuj go):Jak to działa:
p
zwraca środkową linię poprzez rekursywną analizę łańcucha wejściowego i konkatenację podanej liczby symboli znalezionych przez funkcję wyszukiwaniak
. Główna funkcjaf
łączy pięcioelementową listę z nowymi liniami, składającymi się z górnej linii (każdy znak środkowej linii zastąpiony przez_
), nowej linii, środkowej linii, pustej linii i dolnej linii (tak samo jak górna).źródło
Python 3,
169168 bajtów. (167 z Python 2)Dość nie golfista:
Wypróbuj online tutaj .
źródło
p+=['='*v,('- '*v)[:v]][_[-1]=='P']
na końcu poprzedniego wiersza poprzedzającego średnika oszczędza jeden bajt.print
.Python 2, 136 bajtów
Co zaskakujące, importowanie
re
wydaje się tutaj naprawdę opłacalne.źródło
PHP, 187 bajtów
Kod może pozostać w jednej linii; jest on wyświetlany tutaj w wielu wierszach, aby był bardziej czytelny (białe znaki i znaki nowej linii użyte do formatowania nie zostały policzone).
Dwa bajty można zapisać, nie drukując końcowego znaku nowej linii. Pięć kolejnych bajtów można zapisać, używając prawdziwych znaków nowej linii w
echo()
:Sześć dodatkowych bajtów można zapisać, pomijając inicjalizację
$o
($o='';
), ale spowoduje to wyświetlenie powiadomienia. Powiadomienie można ukryć, uruchamiając skrypt za pomocą wiersza polecenia:To prowadzi do 174 bajtów.
źródło
Rubin,
137135 bajtówNie najkrótszy, jaki mogłem wymyślić, ale blisko najładniejszego. Częściowo zapożyczone z odpowiedzi Optymalizatora.
Nie golfowany:
źródło
(a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '
.C, 155 bajtów
Bardziej czytelny:
Zewnętrzna pętla liczy linie od 5 do 0.
Pętla środkowa iteruje części zakodowanego ciągu:
Wewnętrzna pętla dekoduje część, na przykład,
7P
i iteruje potrzebną liczbę razy (np. 7).Każda iteracja drukuje jedną
char
. Wartośćchar
jest opisana przez kodl%5?l^2?32:c^78?++x&1?45:32:61:95
:_
)=
)x
o 1 (zainicjowano do 2 osscanf
)-
), w przeciwnym razie wydrukuj 32 (spacja)źródło
Scala, 163 bajty
Pierwsza próba, może być jeszcze trochę golfa.
źródło
Ruby, 94 bajty
Pożycza
gsub'--','- '
pomysł z odpowiedzi 14mRh4X0r . Myślę, że ta odpowiedź jest bardziej interesująca, chociaż jest krótsza.Testowanie:
Produkuje:
źródło
pozwól mi dołączyć moją wersję Matlaba
MATLAB (267 b)
wkład
Łańcuch sformatowany w ascii z odstępem (ponieważ w matlabie nie ma końca łańcucha „\ 0”
przykład V = „12N13P”
wydajność
reprezentacja wzoru drogi
funkcjonować
funkcja musi zostać wywołana z ogona-1 (pusty znak jest usuwany)
przykład : p (V, numel (V) -1)
Symulacja
spróbuj tutaj online
źródło
R, 132 bajty
Nie bardzo się z tego cieszyłem, ale było trochę fajnie :) Próbowałem pozbyć się wielu
gsub
s, ale moje wysiłki poszły na marne. Podejrzewam, że jest na to znacznie lepszy sposób.scan
pobiera łańcuchy ze STDIN i chwyta 4-ty. Uwaga że puste linie wymagają spacji (lub czegoś) w nich, aby skan mógł nadal pobierać dane wejściowe.=
sN
s, the-
iwith
P
s.NP
aPN
rbind
) z pierwszym znakiem każdego łańcuchacat
.Testowe uruchomienie
źródło