Jest rok 930, a Kościół gregoriański ma problem. Mają tysiące stron śpiewanej muzyki, ale problem polega na tym, że całe nuty zostały po prostu wrzucone na stos, zamiast mieć prawdziwy system organizacji:
Zdjęcie użytkownika gamerprinter z Gildii Kartografów .
Kościół musi uporządkować wszystkie nuty, więc wynajęli średniowiecznego inżyniera oprogramowania, aby napisał program, który je dla nich zorganizuje. Jesteś inżynierem oprogramowania, który został zatrudniony. Jednak proces kompilacji w czasach średniowiecza wymaga zapisania programu na papierze przez zespół powolnych skrybów biblijnych. Aby skrócić czas potrzebny zespołowi skrybów na skompilowanie kodu, musisz zminimalizować program.
Kościół chce, aby muzyka śpiewana była zorganizowana na podstawie skali muzycznej, w której jest napisana. Cała muzyka śpiewana przez Kościół jest napisana w skalach doryckich . Biorąc pod uwagę nuty określonego utworu muzycznego, twój program wyświetli skalę Doriana, w której się znajduje. Tutaj wyjaśnię dokładnie, czym jest skala Doriana. Jeśli już wiesz, możesz pominąć tę sekcję.
W każdej melodii jest 12 możliwych nut. Oto ich kolejność:
C C# D D# E F F# G G# A A# B
Półtonowi (przedstawiony za pomocą S
) jest zwiększany o jeden krok w prawo, owijając się wokół (a więc półtonowi się z B wróci do C). Tonu (przedstawiony za pomocą T
) ma dwa półtony. Na przykład półton w górę od F # byłby G. Tonem w górę od F # byłby G #.
Aby utworzyć skalę Doriana, zaczynamy od dowolnej nuty na liście, a następnie przechodzimy w górę według następującego wzoru, wymieniając nuty, które napotykamy:
T, S, T, T, T, S
Przykład. Zaczynam od A. Nuty mojej skali Doriana stają się:
A
B (up a tone)
C (up a semitone)
D (up a tone)
E (up a tone)
F# (up a tone)
G (up a semitone)
Skala ma notatki A, B, C, D, E, F # i G. Ponieważ zacząłem od A będziemy nazywają to Dorian skalę w . Istnieje zatem 12 różnych skal Doriana, z których każda nosi nazwę notatki, od której zaczęły. Każdy z nich używa tego samego wzoru tonów i półtonów, zaczynając od innej pozycji. Jeśli moje wyjaśnienie nie jest spójne, możesz również skonsultować się z Wikipedią .
Dane wejściowe programu można podać z dowolnego elementu odpowiedniego dla programu (np. STDIN, argument wiersza poleceń raw_input()
). Nie może być wstępnie zainicjalizowany w zmiennej. Daną wejściową będzie lista nut oddzielonych przecinkami, reprezentujących melodię utworu. Mogą się powtarzać notatki. Na wejściu zawsze będzie wystarczająco dużo różnych nut, aby móc zdecydowanie wydedukować skalę utworu. Przykładowe dane wejściowe:
B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
Wyjście programu powinno być ciągiem Dorian scale in X
, gdzie X jest początkową nutą skali. Dane wyjściowe przykładowego wejścia:
Dorian scale in B
Porównując to ze skalą Doriana w B ( B C# D E F# G# A
), widzimy, że wszystkie nuty melodii mieszczą się w tej skali. Uwaga C # nie jest w tym przypadku używana. Istnieją jednak wystarczające uwagi, aby jednoznacznie zidentyfikować B Dorian jako właściwy klucz. Żadna inna skala Doriana nie pasuje, ponieważ niezależnie od innej skali, której próbujemy, zawsze jest co najmniej jedna nuta melodii, która nie należy do skali.
To jest kod golfowy, więc wygrywa pozycja z najmniejszą liczbą znaków. Zapytaj w komentarzach, jeśli masz pytania.
Odpowiedzi:
CJam - 61
Wypróbuj na http://cjam.aditsu.net/
źródło
C
171146Analiza łańcuchów w C nie jest taka łatwa, więc wybrałem podejście matematyczne.
Korzystam z Koła Piątych. Jeśli ułożymy nuty w następującej kolejności na podstawie zliczenia 7 półtonów naraz (znanej jako „piąta”), stwierdzimy, że wszystkie nuty dozwolone w dowolnej skali tworzą kolejny blok 7 nut i wszystkie zabronione nuty tworzą kolejny blok 5 nut.
(to koło, zawija się
F
na końcu).Położenie nuty naturalnej w powyższej sekwencji można obliczyć jako
(ASCII code) * 2 % 7
. Następnie, jeśli następny znak jest nieparzysty (dotyczy#
przecinka, spacji lub bajtu zerowego), dodajemy 7, aby był ostry. Przechowujemy mapę bitową wykorzystanych notatek.Liczba
243
(binarna11111000
) odpowiada nutom zabronionym w skali A # Dorian. Pomnożyłem to przez(1<<12)+1=4097
liczbę magiczną1016056
. Przesunięcie w prawo ma na celu sprawdzenie (przez ANDing), czy melodia zawiera niedozwolone nuty dla każdej z 12 skal z kolei. Jeśli melodia nie zawiera niedozwolonych nut, skala jest drukowana.Aby uzyskać wynik, musimy wydrukować nazwę skali zakodowaną w odwrotnej kolejności, aby cykl piąty powyżej, pamiętajmy, że cofamy się, ponieważ zmieniamy prawa.) Sekwencja ASCII
ADGCFBEADGCF
jest generowana przez65+i*3%7
. W przypadku pierwszych pięciu z nich należy również wydrukować ostry.Nieskluczony kod
Nieprawidłowe zachowanie wejściowe: jeśli dostarczona zostanie niewystarczająca ilość notatek, aby jednoznacznie określić skalę, wyświetli ona wszystkie możliwe skale. Jeśli dostarczona zostanie niemożliwa kombinacja nut, nic nie wyda. Notatki muszą być rozdzielane przecinkiem (lub innym znakiem spacji z parzystym kodem ASCII <= 64.) Nie można używać spacji, ponieważ wszystko po pierwszej spacji byłoby traktowane jako inny argument. Kody ASCII> 64 będą interpretowane jako notatki w opisany sposób.
źródło
Haskell - 152
Nie golfił
źródło
Python 2 - 177 znaków
Nie jest to takie krótkie, ale dla Pythona radością jest pisanie wielu zagnieżdżonych pętli dla jednej linii, nawet gdy nie gra w golfa. Niestety musiałem umieścić instrukcję wejściową w osobnym wierszu, aby nie wykonała się więcej niż raz.
Nie używam Pythona 3, ale uważam, że jest to rzadki przypadek, gdy instrukcja print nie potrzebuje więcej znaków. Ponieważ
print
jest tam funkcja, byłbym w stanie zrównoważyć potrzebę nawiasów za pomocą*
operatora rozpakowywania listy w celu zastąpienia ostatniego[0]
.źródło
input
naraw_input
i zapisać 4 znaki w Pythonie 3.Rubin - 132
Dane wejściowe z argumentów wiersza poleceń.
na przykład
ruby dorianscale.rb B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
Spróbuj na: ideone
źródło
Haskell - 140
Skorzystaj z właściwości Circle of Fifths wprowadzonej przez @steveverrill. Jeśli pozwolimy
circle0 = words "C G D A E B F# C# G# D# A# F"
icircle = circle0 ++ circle0
, możemy skonstruować wszystkie skale, biorąc kolejne 7 notatekcircle
.W każdej skonstruowanej w ten sposób
scale !! 3
skali czwartym elementem jest nazwa skali.Kod
Nie golfił
źródło
Scala,
130128127Korzystanie z metody koła piątego. Dane wejściowe z argumentów wiersza poleceń tj
źródło