Wprowadzenie
Kod Parsons jest tylko prosty sposób na opisanie zmian wysokości w utworze muzycznym, czy notatka jest wyższa lub niższa od poprzedniej.
Nawet jeśli lubisz zapamiętywać melodie, wciąż możesz prawie pamiętać, czy nuta idzie w górę, czy w dół, dlatego kod Parsons może pomóc Ci zidentyfikować muzykę za pomocą wyszukiwarki.
Opis
Każda odmiana jest reprezentowana przez pojedynczy znak, który jest jednym z następujących:
R
jeśli nuta jest taka sama jak poprzednia (oznacza „ R epeat” )U
jeśli nuta jest wyższa niż poprzednia (oznacza „ U p” )D
jeśli nuta jest niższa niż poprzednia (oznacza „ D własne” )
Pierwsza notatka jest zapisana jako *
.
Przykład
Oto przykład kodu Parsons (początek „Oda do radości” ):
*RUURDDDDRUURDR
Możesz to sobie wyobrazić tak:
*-*
/ \
* *
/ \
*-* * *-*
\ / \
* * *-*
\ /
*-*
Odtąd nazwiemy to konturem .
Zasady rysowania takich konturów są uważane za wyjaśnione na powyższym przykładzie.
Wyzwanie
Teraz nadchodzi prawdziwe wyzwanie.
Napisz program, który na podstawie konturu jako wejścia wyprowadza odpowiadający mu kod Parsons.
Nie jesteś proszony o narysowanie konturu, ale wręcz przeciwnie.
Z konturu znajdź oryginalny kod Parsonsa.
Zasady
- Obowiązują zwykłe zasady gry w golfa kodowego
- Najkrótszy program pod względem liczby bajtów wygrywa
- Dane wejściowe to kontur, a dane wyjściowe powinny być poprawnym kodem Parsonsa
- Szczegóły dotyczące dodatkowych białych znaków dla danych wejściowych są nieistotne, rób wszystko, co dla ciebie najlepsze
- Ze względu na poprzednią regułę nie można zakodować na stałe, w taki czy inny sposób, części danych wyjściowych i / lub programu przy użyciu dodatkowych białych znaków
Notatki
- Może to być przydatne do testowania
- Odpowiedni kod Parsons dla
*
to*
- Pusty ciąg nie jest prawidłowym konturem
- Kod Parsons zawsze zaczyna się od
*
*
tego, że nic nie robi?*
? Nie. Powinien wydrukować, jak*
sądzę. Dodam tę skrzynkę narożną.*
. Zawsze.Odpowiedzi:
Pyth -
28252725 bajtów2 bajki zapisane dzięki @Jakube.
Wypróbuj online tutaj .
źródło
*
jako wejście. Wyjście jest*0
tak, jak powinno być*
. Pojawiło się złe dzikie końcowe zero.U
iD
na drodze. W przeciwnym razie dobrze zrobione.CJam, 21 bajtów
Zwiń linie (
:
) przez wektoryzację (.
) maksymalnej operacji znakoweje>
. Ponieważ w każdej kolumnie jest tylko jeden znak spacji, ten będzie wynikiem, ponieważ spacja ma mniejszy kod ASCII niż wszystkie drukowalne znaki spacji.Usuń przesunięcie i wydrukuj pierwszą gwiazdkę
(o
, a następnie zamapuj co drugi (2%
) pozostały znak naUDR
użycie indeksowania modułowego.Stare rozwiązanie (29 bajtów)
qN/
pobiera linie wejściowe.z
transponuje tę matrycę znaków.2%
upuszcza każdy nieparzysty rząd.'*f#
znajduje indeks gwiazdki w każdym wierszu.0+2ew);
pobiera wszystkie kolejne pary indeksów.::-
oblicza ich różnice i"RDU"f=
mapuje je do listów (przez modułowej indeksowania:0 → R
,2 → U
,-2 ≡ 1 → D
). Wiodący'*
wstawia gwiazdkę.EDYCJA : Zmieniłem,
2ew
aby0+2ew);
obejść CJam nie obsługującyew
(kolejne wycinki) na listach, które są zbyt krótkie. Dzięki temu kod działa dla ciągu wejściowego*
.Wypróbuj tutaj lub obejrzyj w akcji:
źródło
:-p
*
Jednak nie działa jako wejście.RuntimeException
Zamiast tego dostaję miły .[X]2ew
powinien powrócić[]
zamiast błędu. Dodam jednak obejście.Python 3,
1291089886 bajtówPrawdopodobnie istnieje kilka sposobów na grę w golfa, ale raczej podoba mi się, że wszystko sprowadziłem do jednej linii.
Edycja: teraz używa
''.translate()
Edycja: Z wieloma podziękowaniami dla wnnmaw .
Edycja: Zmieniłem format wejściowy na tablicę ciągów zamiast ciągu oddzielonego znakiem nowej linii, aby zapisać bajty. Ponadto w ostatniej edycji pomieszałem
U
iR
naprawiłem to.Dane wejściowe muszą być tablicą ciągów. W powyższym przykładzie wygląda to tak:
Nie golfowany:
źródło
lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')
osiąga 105 bajtów. Główną różnicą jest użycie krotki warunkowej zamiast tłumaczeniaRubinowy, 87 bajtów
Wymaga końcowych spacji na wejściu, aby wszystkie linie miały tę samą długość.
źródło
>:D
.Japt, 38 bajtów
40 41 45 46 48Zaoszczędź 2 bajty dzięki @ETHproductions
Gdyby było polecenie przycinania, byłoby to tylko 38 bajtów; -; dodam wyjaśnienie, kiedy skończę grać w golfa. To
:P
nie jest program, który próbuje być zabawny, to w rzeczywistości program ignorujący postacie, które nie są ważne.Wypróbuj online
źródło
x
oraz transponuję i obracam funkcje nay
iz
(dzielenie na nowe linie, użyj funkcji tablicowej,Yu ?"RUD"g1+(XrS c -47 g):P
Haskell, 89 bajtów
Przykład użycia:
Transponuj dane wejściowe i zamień znaki
/
/-
/ na\
ciągi singletonowe"U"
/"R"
/"D"
. Wszystkie pozostałe znaki są zastępowane pustymi ciągami""
, które później znikają, łącząc wszystko. Na koniec wstaw gwiazdkę*
.źródło
Mathematica, 103 bajty
Krótko mówiąc, biorąc pod uwagę, że jest to wyzwanie związane z przetwarzaniem łańcucha.
źródło
JavaScript (ES6) 90
Anonimowa funkcja. Skanuje wejściowy ciąg znaków char po char, biorąc pod uwagę pozycję w bieżącym wierszu. Spowoduje to, że buduje tablicę wyjściową subsituting
U D R
dla/ \ -
na właściwym miejscuźródło
Matlab, 62 bajty
Wymaga to, aby dane wejściowe były prostokątne (ta sama liczba znaków w każdym rzędzie). Na przykład
Wyjaśnienie
źródło