Twoim zadaniem jest pobranie sekwencji znaków (muzyki) jako danych wejściowych (w funkcji lub programie) i wydrukowanie (lub zwrócenie) muzyki tak, jak wyglądałaby w pozytywce.
Otrzymasz tylko znaki ABCDEFG.()
jako dane wejściowe, a dane wejściowe nigdy nie będą puste. Możesz również otrzymać litery małymi literami, jeśli chcesz.
To jest pusta pozytywka o długości 3:
.......
.......
.......
Jak widać, wiersze mają 7 znaków, a ponieważ długość pozytywki wynosi 3, mamy 3 wiersze. Są tylko .
tutaj, ponieważ pozytywka jest pusta. Dodajmy do tego trochę muzyki!
Najpierw tworzymy pozytywkę. W tym przykładzie wejście będzie CDAG.DAG
.
Długość CDAG.DAG
wynosi 8, więc potrzebujemy pozytywki o długości 8:
.......
.......
.......
.......
.......
.......
.......
.......
Następnie odczytujemy dane wejściowe, po jednym znaku na raz, i umieszczamy znak w O
odpowiednim miejscu.
Pierwszą postacią jest C
, a położenie każdej nuty jest równoważne z tym (dodałem spacje dla przejrzystości):
A B C D E F G
. . . . . . .
. . . . . . .
(and so on)
Jeśli znakiem wejściowym jest a .
, to po prostu wypisujemy pusty wiersz.......
Tak, C
byłoby 3rd znak wzdłuż. Umieśćmy go w pozytywce na górze:
..O....
.......
.......
.......
.......
.......
.......
.......
Powtórzymy ten proces dla wszystkich pozostałych znaków (tekst w nawiasach ma tylko pokazać notatkę, której nie powinieneś wyprowadzać):
..O.... (C)
...O... (D)
O...... (A)
......O (G)
....... (.)
...O... (D)
O...... (A)
......O (G)
Ze względu na to, jak muzyka pudełka pracy, jeśli używamy znak inny niż O
, .
oraz <insert newline here>
, takich jak miejsca, w naszej mocy, to nie będzie odgrywać właściwą muzykę!
To jest akord:
(ACE)
Akord ten poucza nas grać nuty A
, C
a E
w tym samym czasie. Nigdy nie będzie pauzy (tj. A .
) w akordzie.
Oto jak byłoby napisane:
O.O.O...
I tak to może wyglądać w muzyce: B(ACE)D
Nigdy nie otrzymasz akordu z akordu, tzn. To nie będzie ważne: (AB(CD)EF)
ani to A(B())
:, a akord nie będzie pusty, tzn. Nie będzie prawidłowy:A()B
Nigdy nie otrzymasz nieprawidłowego wejścia.
Przykłady:
B(ACE)D
.O.....
O.O.O..
...O...
B
.O.....
GGABC
......O
......O
O......
.O.....
..O....
...
.......
.......
.......
A..F.C(DA).
O......
.......
.......
.....O.
.......
..O....
O..O...
.......
.(ABCDEF)
.......
OOOOOO.
Dozwolone jest końcowe / białe spacje na wydruku.
Ponieważ jest to kod-golf , wygrywa najkrótszy kod!
()
dwa razy (np .AB(CD)E(FG)
:)?Odpowiedzi:
Pip , 29 bajtów
28 bajtów kodu, +1 dla
-l
flagi.Pobiera dane pisane małymi literami jako argument wiersza polecenia. Wypróbuj online!
Wyjaśnienie
Oto przykład transformacji danych wejściowych:
źródło
Python 2 ,
9594 bajtów-1 bajt dzięki Value Ink
Wypróbuj online! lub Wypróbuj wszystkie przypadki testowe
Wyjaśnienie
'@'<i
jest sprawdzenie, czyi
jest to litera, zastępując.
jąO
na właściwej pozycji.'*'>i
jest sprawdzenie, czyi
jest nawias, jeśli tox=i>'('
będzie można umieścić0
nax
zapobieganie Drukowanie / kasowanieo
, kiedyi==')'
będzie umieścić1
nax
ponowne jej włączanie Drukowanie / kasowanieo
.Kiedy
i=='.'
nic się nie zmieni i'.......'
zostanie wydrukowane.Kolejność znaków jest podana przez ich kod ASCII, gdzie
'('<')'<'*'<'.'<'@'<'A'
źródło
['.']*7
. Być może jest to pozostałość po użyciu krotki, która wymagałaby przecinka. Mogę się również mylić, ale wydaje się, że wyświetla tablicę['O', '.', '.', '.', '.', '.', '.']
w wierszu i nie jestem pewien, czy jest to dozwolone?Partia, 209 bajtów
Działa poprzez kumulację liter i wyprowadzenie linii, jeśli ostatnim widocznym symbolem nie był a
(
.źródło
Röda ,
977876 bajtówWypróbuj online!
Jest to anonimowa funkcja, która odczytuje dane wejściowe ze strumienia. Używaj go tak:
main { f={...}; push("ABCD") | f() }
. Wykorzystuje regex z odpowiedzi ETHproductions.Nie golfowany:
Poprzednia odpowiedź:
Wypróbuj online!
Działa poprzez dzielenie podanego ciągu w miejscach, w których ciąg zawiera tylko dopasowane nawiasy. Następnie dla każdego akordu iteruje się przez możliwe nuty i drukuje,
O
jeśli nuta jest członkiem akordu i w.
inny sposób.źródło
JavaScript (ES6),
868576 bajtówZaoszczędź 9 bajtów dzięki @Neil
Wyjaśnienie
Najpierw dopasowujemy, co utworzy każdy wiersz wyniku: akordy i znaki, które nie są częścią akordu. Następnie dla każdej linii bierzemy ciąg
ABCDEFG\n
i zamieniamy w nim każdy znak nie będącyO
nowym wierszem na, jeśli linia go zawiera, i na.
inny.źródło
s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG\n`.replace(r,c=>x.match(c)?"O":"."))
.\)
być.
?JavaScript (ES6),
118116114 bajtówPrzypadki testowe
Pokaż fragment kodu
źródło
Rubinowy,
787571 bajtówZwraca tablicę ciągów.
Niegolfowane + wyjaśnienie
źródło
x.gsub(...){l=?.*7;$&.bytes{...};l+$/}
(zamieńscan
zgsub
, usuńmap
i pomiń pierwszy,|x|
ponieważ możesz użyć,$&
aby uzyskać dostęp do ostatniego dopasowania wyrażenia regularnego), aby zapisać 3 bajty i zamiast tego zwrócić ciąg wielu wierszy. ($/
Domyślnie mapowane jest również do nowej linii).PHP, 171 bajtów
Awaria :
Wypróbuj tutaj!
źródło
Siatkówka , 120 bajtów
Jestem pewien, że jest miejsce na grę w golfa, ale teraz działa, więc spróbuję zagrać w golfa później.
Wypróbuj online!
Jak to działa
Zasadniczo program działa poprzez zmianę każdego znaku na liczbę, a następnie przypisanie
O
do tej pozycji w wierszu. Odwzorowuje sięABCDEFG.
na01234569
.Aby wygenerować linie pojedynczej nuty, wystarczy wstawić
O
po odpowiedniej liczbie.
s, a następnie uzupełnić linię do 7 znaków.Jednak akordy są nieco trudniejsze do wykonania. Zastosowano podobny proces, ale liczby należy przeliczyć na przyrosty, tzn. Pierwsza nuta akordu (cokolwiek), druga to pozycje X po pierwszej, trzecia to pozycje Y po tym itd.
Kod
Zacznij od uporządkowania wszystkich znaków w akordach.
Wykonaj transliterację (mapowanie) z liter na cyfry.
Zamień wszystkie cyfry w nawiasach na jednoargumentową reprezentację (używając
x
s), a następnie spację.Zastąp wszystkie nawiasy zamykające
m
następującymi znakami nowej linii.m
Będzie wykorzystana jako znacznik rodzajów dla nadchodzącego pętli:Jest to etap wymiany, który zapętla się, dopóki nie będzie można go wymienić. Bierze dwie ostatnie sekwencje
x
s przedm
i odejmuje pierwszą od drugiej, przesuwając dom
tyłu. Znacznikm
jest potrzebny, ponieważ musi wykonać tę operację od prawej do lewej.Usuń pierwszą
x
w każdej sekwencji oprócz pierwszej.T
ransliterate zastępującx
z.
, z przestrzeniąO
i usuwaniem
i(
.W tym momencie wszystkie linie dla akordów zostały utworzone. Teraz należy utworzyć linie pojedynczej nuty.
Zamień każdą cyfrę na tyle
.
s, a następnie naO
i nową linię.Wypełnij każdą linię do długości 7, dodając
.
s po prawej stronie. Działa to poprzez dodanie 6.
s na końcu każdej linii (każda linia będzie miała co najmniej 1 inny znak), a następnie zastąpienie każdego znaku po pierwszych 7 w każdej linii niczym. (Od.
map do 9,O
zostaną one wycięte na tych liniach)źródło
Perl,
877145 + 2 (-nl
flaga) = 47 bajtówZa pomocą:
Wypróbuj na Ideone.
źródło
Perl 5-78 + 1 (flaga) + 2 (cudzysłowy) = 81 bajtów
Można uruchomić tak:
źródło
Rubinowy, 68 bajtów
Chodzi o to, aby zmodyfikować ciąg za
.......
każdym razem, gdy znajdziemy literę, a następnie wyprowadzamy ją i resetujemy, ale tylko wtedy, gdy znajdujemy się poza nawiasami.(
wyłącza wyjście.)
i.
oba włączają / wyłączają wyjście, ale to drugie jest nieistotne, ponieważ nigdy nie zostanie znalezione w nawiasie.Niegolfowany w programie testowym
źródło
Python 3, 94 bajty
Anonimowa funkcja
źródło
Haskell , 101 bajtów
Wypróbuj online! Zastosowanie:
p "AB.(CA)D"
. Zwraca listę ciągów.Wyjaśnienie:
Funkcja
p
powraca nad ciągiem. Jeśli stwierdzi nawias otwierający'('
następnie(x,_:t)<-span(')'<)r
dzieli ciąg odpoczynekr
do ciągówx
przed wystąpieniem wspornika zamknięcia')'
it
po nim. W przeciwnym razie bieżący znakx
zostanie przekształcony w ciąg[x]
. W obu przypadkach funkcja?
jest wywoływana z bieżącym ciągiem nut i pozostałym ciągiem.?
odwzorowuje funkcję#
na ciąg"ABCDEFG"
, gdzie#
zastępuje wszystkie znaki, które nie znajdują się w bieżącym ciągu notatek'.'
. Powstała linia pozytywki jest dołączana do rekurencyjnego wywołaniap
na liście pozostałychr
.źródło
Retina 0.8.2 , 52 bajty
Wypróbuj online! Wprowadza dane pisane małymi literami. Wyjaśnienie:
Podziel muzykę na akordy lub nuty i zacznij budować wyjście, dodając listę ekwiwalentów nut.
Dla każdej nuty każdego akordu zmień wyjście na
O
i usuń nutę z akordu.Usuń całą obcą muzykę i zmień wszystkie niedopasowane nuty na puste.
źródło
PHP, 93 bajty
Uruchom jako potok z
-nR
lub spróbuj online .awaria
źródło