Powiązane: Muzyka: co jest w tym akordzie? , Nuty do tabulatury , Generujesz tabulatury na gitarę? , Przetłumacz pary liczb na nuty gitarowe
Biorąc pod uwagę palcowanie gitary, wydaje akord, który reprezentuje. Możesz użyć standardowego wejścia i wyjścia lub napisać funkcję, która zwraca ciąg znaków.
Palce wejściowe będą klasyfikowane jako jeden z następujących akordów, które zostaną wyrażone w następujący sposób (jeśli nutą pierwiastkową było C):
- główna triada:
C
- niewielka triada:
Cm
- (dominujący) siódmy:
C7
- mniejszy siódmy:
Cm7
Akord może być odwrócony, więc nie możesz polegać na najniższej nucie będącej rdzeniem. Nie możesz też polegać na tym, że jest to łatwe lub wspólne palcowanie w prawdziwym świecie. Mówiąc bardziej ogólnie, wynik programu musi ignorować oktawy wysokości i traktować wszystkie wysokości odpowiadające tej samej nucie (tj. A
) Jako równe.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Format wejściowy
Dane wejściowe to seria 6 wartości, które wskazują, dla każdego struny 6-strunowej gitary w standardowym strojeniu (EADGBE), na które to drażnienie będzie grane. Może to również oznaczać, że ciąg nie jest w ogóle odtwarzany. Próg „zerowy” jest również znany jako pozycja otwarta, a numery progów liczą się od tego momentu. Załóżmy, że gitara ma 21 pozycji progów, tak że najwyższa pozycja progu to liczba 20.
Na przykład wejście X 3 2 0 1 0
oznacza umieszczenie palców w następujących pozycjach u góry szyi gitary:
(6th) |---|---|---|---|---
|-X-|---|---|---|---
|---|---|---|---|---
|---|-X-|---|---|---
|---|---|-X-|---|---
(1st) |---|---|---|---|---
i brzdąkanie od 2 do 6 strun. Odpowiada tej zakładce ASCII :
e |-0-|
B |-1-|
G |-0-|
D |-2-|
A |-3-|
E |---|
Masz pewną elastyczność w wyborze rodzaju danych wejściowych: każda pozycja progu może być wyrażona jako ciąg znaków lub liczba. Ciągi gitarowe, które nie są odtwarzane, są zwykle oznaczone symbolem X
, ale możesz wybrać inną wartość wartownika, jeśli to ci ułatwi (np. -1
Jeśli używasz liczb). Szereg 6 pozycji progów może być wprowadzany jako dowolny typ listy, tablicy lub sekwencji, pojedynczy ciąg znaków oddzielony spacją lub jako standardowe wejście - po raz kolejny, według własnego wyboru.
Możesz polegać na danych wejściowych odpowiadających jednemu z 4 typów akordów wymienionych powyżej.
Wyjaśnij w swoim poście, jaką formę danych wejściowych bierze twoje rozwiązanie.
Format wyjściowy
Musisz albo zwrócić lub wydrukować na standardowe wyjście ciąg opisujący akord, dla którego ma być palcowanie. Ta struna składa się z dwóch części połączonych razem. Kwestie kapitalizacji. Końcowe białe znaki są dozwolone.
Pierwsza część wskazuje Prymę , jeden A
, A#
/ Bb
, B
, C
, C#
/ Db
, D
, D#
/ Eb
, E
, F
, F#
/ Gb
, G
lub G#
/ Ab
. (Używam #
zamiast ♯
, i b
zamiast ♭
, aby uniknąć konieczności Unicode). Prymy które mogą być wyrażone bez ostry lub mieszkania muszą być wyrażone bez nich (nigdy wyjście B#
, Fb
lub Dbb
); tych, które nie mogą być wyrażone muszą jednym ostrym lub płaskiej symbolem (tj albo C#
albo Db
, ale nigdy B##
). Innymi słowy, musisz zminimalizować liczbę przypadkowych (ostrych lub płaskich) w nazwie notatki.
Druga część wskazuje rodzaj akordu, pustego dla dużej triady, m
dla małej triady, 7
dla dominującej siódmej lub m7
dla mniejszej siódmej. Tak więc G-dur jest wyprowadzany po prostu jako G
, podczas gdy siódma D-moll może być wyprowadzana jako jedna D#m7
lub Ebm7
. Więcej przykładów można znaleźć w przypadkach testowych na końcu.
Teoria i wskazówki
Nuty
Skala chromatyczna ma 12 podziałek na oktawę. Po dostrojeniu do równego temperamentu, każdy z tych dźwięków jest jednakowo oddalony od swoich sąsiadów 1 . Tony o 12 półtonach (oktawie) są uważane za tę samą nutę. Oznacza to, że możemy traktować nuty jak liczby całkowite modulo 12, od 0 do 11. Siedem z nich otrzymuje nazwy literowe 2 od A do G. To nie wystarczy, aby nazwać wszystkie 12 wysokości, ale dodanie przypadkowych poprawek powoduje, że: dodanie ♯ ( ostry) do nuty powoduje, że jest o jeden półton wyższy, a dodanie ♭ (płaskiej) powoduje, że jest o półton niżej.
Akordy
Akord to 2 lub więcej nut granych razem. Rodzaj akordu zależy od relacji między nutami, które można określić na podstawie odległości między nimi. Akord ma nutę główną, jak wspomniano wcześniej. W tych przykładach potraktujemy nutę główną jako 0, ale jest to arbitralne, a wszystko, co liczy się w tym wyzwaniu, to odległość między nutami w arytmetyce modulo. W odpowiedzi zawsze będzie jeden unikalny typ akordu, triada lub siódmy akord . Nuta główna nie zawsze będzie miała najniższy ton; wybierz nutę główną, aby opisać akord jako jeden z czterech następujących rodzajów akordów:
- Głównym triada jest cięciwa z nut
0 4 7
. - Moll triada jest cięciwa z nut
0 3 7
. - Dominującą (lub główny / poboczny) siódmy akord ma notatki
0 4 7 10
. - Moll (lub drobne / minor) siódmy akord ma notatki
0 3 7 10
. 3)
Strojenie gitary
Standardowe strojenie na gitarze 6-strunowej zaczyna się od E na najniższej strunie, a następnie uderza nuty w odstępach 5, 5, 5, 4, a następnie 5 półtonów w górę strun. Przyjmując najniższą E jako 0, oznacza to, że uderzenie wszystkich strun gitary daje ci ponumerowane wysokości 0 5 10 15 19 24
, których moduł 12 jest równoważny 0 5 10 3 7 0
lub nuty E A D G B E
.
Sprawdzone przykłady
Jeśli twój wkład brzmi 0 2 2 0 0 0
, odpowiada to nutom E B E G B E
, więc tylko E, B i G. Tworzą one akord Em
, który można zobaczyć, numerując je z rdzeniem jako E, dając nam 0 3 7
. (Wynik byłby taki sam dla X 2 X 0 X 0
lub 12 14 14 12 12 12
.)
Jeśli twój wkład to 4 4 6 4 6 4
, numerowanie ich z rdzeniem C♯ daje 7 0 7 10 4 7
, lub 0 4 7 10
, więc odpowiedź brzmi C#7
(lub Db7
). Gdyby tak było 4 4 6 4 5 4
, numeracja dałaby 7 0 7 10 3 7
, lub 0 3 7 10
, co jest C#m7
(lub Dbm7
).
Przypadki testowe
X 3 2 0 1 0 ---> C
0 2 2 0 0 0 ---> Em
X 2 X 0 X 0 ---> Em
4 4 6 4 6 4 ---> C#7 (or Db7)
4 4 6 4 5 4 ---> C#m7 (or Dbm7)
0 2 2 1 0 0 ---> E
0 0 2 2 2 0 ---> A
X X 4 3 2 2 ---> F# (or Gb)
3 2 0 0 0 1 ---> G7
X X 0 2 1 1 ---> Dm7
3 3 5 5 5 3 ---> C
4 6 6 5 4 4 ---> G# (or Ab)
2 2 4 4 4 5 ---> B7
0 7 5 5 5 5 ---> Am7
7 6 4 4 X X ---> B
8 6 1 X 1 3 ---> Cm
8 8 10 10 9 8 --> Fm
0 19 5 16 8 7 --> Em
6 20 0 3 11 6 --> A# (or Bb)
X 14 9 1 16 X --> G#m (or Abm)
12 14 14 12 12 12 --> Em
15 14 12 12 12 15 --> G
20 X 20 20 20 20 --> Cm7
X 13 18 10 11 10 --> A#7 (or Bb7)
1 według logarytmów ich częstotliwości
2 lub, w solfège , nazwy takie jak do, re, mi . W tym wyzwaniu użyj nazw liter.
3 Można to również nazwać głównym szóstym akordem, z innym wyborem nuty korzeniowej. W tym wyzwaniu nazwij go jego mniejszym siódmym imieniem.
Odpowiedzi:
MATL ,
115114 bajtówFormat wejściowy to
[N 3 2 0 1 0]
, gdzieN
wskazuje nieużywany ciąg.Ciąg wyjściowy zawsze używa
#
, a nieb
.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe w dwóch częściach, aby uniknąć przekroczenia limitu czasu kompilatora online:
Wyjaśnienie
źródło
Plik MS-DOS .COM (179 bajtów)
Plik (tutaj wyświetlany jako HEX):
Dane wejściowe są podawane z wiersza poleceń. Nieprawidłowe wprowadzenie spowoduje nieprawidłowe działanie programu!
Kod asemblera wygląda następująco:
Widziałem już dwóch pianistów grających razem na fortepianie „na cztery ręce”.
Ten przypadek testowy po raz pierwszy czytam o gitarzystach!
Nawet przy stukaniu prawą ręką nie możesz grać na takim kablu!
źródło
Ruby, 129 bajtów
Jak poprzednia wersja, ale wykorzystuje pojedynczą pętlę, z operatorem trójskładnikowym, do sekwencjonowania między krokiem analizy i krokiem wyjściowym. Aby to zadziałało, konieczne były inne niewielkie modyfikacje.
Rubin, 136 bajtów
Funkcja Llamda przyjmuje tablicę 6 liczb jako argument i wypisuje na standardowe wyjście. Nieużywany ciąg jest reprezentowany przez wartość fałszowania (jedynymi wartościami fałszowania w ruby są
nil
ifalse
.)Wyjaśnienie
Używam reprezentacji 12 wysokości na podstawie koła piątych . Oznacza to, że po każdym dźwięku następuje dźwięk o 7 półtonów wyżej (lub o 5 półtonów niżej), co daje sekwencję
F C G D A E B F# C# G# D# A#
. Są to 2 zalety. Jednym z nich jest to, że wszystkie ostre narzędzia pojawiają się razem. Drugim jest to, że otwarte nuty 5-strunowego basu pojawiają się razem: GDAEB (gitara jest spokrewniona, ale nieco bardziej złożona, patrz poniżej).Pierwsza pętla działa 6 razy. Wyrażenie
6--~j%5
(równoważnie6-(j+1)%5
) podaje wartości Uwaga dla strun:E=5 A=4 D=3 G=2 B=6 E=5
. Do tego dodajemy liczbę progów pomnożoną przez 7 (jak widać powyżej, dodanie jednego półtonu przesuwa nas o 7 miejsc do przodu w sekwencji). Następnie bierzemy całość modulo 12 i tworzymy mapę bitową obecnych nut (my użyj,4097<<note value
aby podać 2 kolejne oktawy).Po skomponowaniu mapy bitowej jesteśmy gotowi przeszukać akord i wygenerować go.
Interesują nas następujące uwagi:
Zaczynając od sprawdzenia akordu F, sprawdzamy, czy pierwiastek i piąty są obecne: bity 0 i 1 (licząc od najmniej znaczącego: bity 1 i 2). Aby odrzucić szósty akord, musimy również sprawdzić, czy szósty jest nieobecny: bit 3 (bit 8). sprawdzamy to,
r&&11==3
a jeśli tak, to drukujemy akord.Ignorujemy główną trzecią część i polegamy całkowicie na bicie 9 (mała trzecia) i bicie 10 (mniejsza 7), aby opracować rodzaj akordu. Wyrażenie
r>>9&3
służy do wybierania właściwego typu akordu z tablicy.Pod koniec pętli, możemy przesunąć w prawo o jeden bit bitmapy
r/=2
do testowania możliwych korzenie akord w kolejności:F C G D A E B F# C# G# D# A#
.Niegolfowany w programie testowym
źródło
JavaScript (ES6),
335333 bajtówUwielbiam to wyzwanie i PPCG SE! To mój pierwszy golf - sugestie mile widziane, ponieważ jestem pewien, że można by go znacznie poprawić. (strąciłem 2 bajty, ponieważ włączyłem f = do liczby)
Funkcja
f
przyjmuje tablicę ciągów znaków, reprezentujących liczby i „X”,f(['X','3','2','0','1','0'])
i zwraca akord (naturalny lub ostry)E#m7
. Dodano nowe linie dla zachowania przejrzystości (nieuwzględnione w liczbie bajtów)Przykład użycia:
Aby uruchomić przypadki testowe:
Wersja bez golfa z wyjaśnieniem:
źródło