Szybkie odświeżanie muzyki:
Klawiatura fortepianowa składa się z 88 nut. W każdej oktawie jest 12 nut C, C♯/D♭, D, D♯/E♭, E, F, F♯/G♭, G, G♯/A♭, A, A♯/B♭
i B
. Za każdym razem, gdy naciśniesz „C”, wzór powtarza się o oktawę wyżej.
Nuta jest jednoznacznie identyfikowana przez 1) literę, w tym wszelkie ostre i płaskie, oraz 2) oktawę, która jest liczbą od 0 do 8. Pierwsze trzy nuty klawiatury to A0, A♯/B♭
i B0
. Potem pojawia się pełna skala chromatyczna na oktawie 1. C1, C♯1/D♭1, D1, D♯1/E♭1, E1, F1, F♯1/G♭1, G1, G♯1/A♭1, A1, A♯1/B♭1
i B1
. Potem pojawia się pełna skala chromatyczna na oktawach 2, 3, 4, 5, 6 i 7. Następnie ostatnia nuta to C8
.
Każda nuta odpowiada częstotliwości w zakresie 20–4100 Hz. Z A0
rozpoczęciem dokładnie 27.500 herców, z których każda odpowiada nuta jest wcześniejsze czasy note dwunasty pierwiastek z dwóch, lub około 1.059463. Bardziej ogólna formuła to:
gdzie n jest numerem nuty, przy czym A0 to 1. (Więcej informacji tutaj )
Wyzwanie
Napisz program lub funkcję, która pobiera ciąg reprezentujący notatkę i wypisuje lub zwraca częstotliwość tej notatki. Użyjemy znaku funta #
dla ostrego symbolu (lub hashtagu dla was młodych) i małych liter b
dla płaskiego symbolu. Wszystkie dane wejściowe będą wyglądały jak (uppercase letter) + (optional sharp or flat) + (number)
bez białych znaków. Jeśli dane wejściowe znajdują się poza zakresem klawiatury (niższe niż A0 lub wyższe niż C8) lub występują nieprawidłowe, brakujące lub dodatkowe znaki, jest to nieprawidłowe wejście i nie trzeba go obsługiwać. Możesz również bezpiecznie założyć, że nie otrzymasz żadnych dziwnych danych wejściowych, takich jak E # lub Cb.
Precyzja
Ponieważ nieskończona precyzja nie jest tak naprawdę możliwa, powiemy, że wszystko w granicach jednego centa prawdziwej wartości jest dopuszczalne. Bez wchodzenia w szczegóły, cent jest 1200-tym pierwiastkiem z dwóch lub 1.0005777895. Użyjmy konkretnego przykładu, aby był bardziej przejrzysty. Powiedzmy, że twój wkład to A4. Dokładna wartość tej noty wynosi 440 Hz. Kiedy cent jest płaski 440 / 1.0005777895 = 439.7459
. Gdy więc cent jest ostry 440 * 1.0005777895 = 440.2542
, każda liczba większa niż 439,7459, ale mniejsza niż 440,2542, jest wystarczająco precyzyjna, aby liczyć.
Przypadki testowe
A0 --> 27.500
C4 --> 261.626
F#3 --> 184.997
Bb6 --> 1864.66
A#6 --> 1864.66
A4 --> 440
D9 --> Too high, invalid input.
G0 --> Too low, invalid input.
Fb5 --> Invalid input.
E --> Missing octave, invalid input
b2 --> Lowercase, invalid input
H#4 --> H is not a real note, invalid input.
Pamiętaj, że nie musisz obsługiwać nieprawidłowych danych wejściowych. Jeśli twój program udaje, że są rzeczywistymi danymi wejściowymi i wypisuje wartość, jest to do przyjęcia. Jeśli Twój program ulegnie awarii, jest to również dopuszczalne. Wszystko może się zdarzyć, gdy je dostaniesz. Pełna lista wejść i wyjść znajduje się na tej stronie
Jak zwykle jest to gra w golfa, więc obowiązują standardowe luki i wygrywa najkrótsza odpowiedź w bajtach.
H
?H
co oznacza, że B jest AFAIK używanym tylko w krajach niemieckojęzycznych. (gdzie przy okazjiB
oznacza Bb.) To, co Brytyjczycy i Irlandczycy nazywają B, nazywa się Si lub Ti w Hiszpanii i we Włoszech, jak w Do Re Mi Fa Sol La Si.H
jest używany w Niemczech, Czechach, Słowacji, Polsce, na Węgrzech, w Serbii, Danii, Norwegii, Finlandii, Estonii i Austrii, zgodnie z Wikipedią . (Mogę to również potwierdzić dla Finlandii.)Odpowiedzi:
Japt,
41373534 bajtówNareszcie mam szansę
¾
dobrze wykorzystać! :-)Wypróbuj online!
Jak to działa
Przypadki testowe
Wszystkie ważne przypadki testowe przechodzą pomyślnie. To te nieprawidłowe, w których robi się dziwnie ...
źródło
Pyth,
464443423935 bajtówWypróbuj online. Zestaw testowy.
Kod używa teraz algorytmu podobnego do odpowiedzi Japt ETHproductions , więc mu to podziękuj .
Wyjaśnienie
Stara wersja (42 bajty, 39 w / pakowany ciąg)
Wyjaśnienie
Pokaż fragment kodu
źródło
Mathematica, 77 bajtów
Objaśnienie :
Główną ideą tej funkcji jest konwersja ciągu nuty na jego względną wysokość, a następnie obliczenie jego częstotliwości.
Metodą, której używam, jest eksportowanie dźwięku do midi i importowanie surowych danych, ale podejrzewam, że istnieje bardziej elegancki sposób.
Przypadki testowe :
źródło
MATL ,
56535049 48 bajtówWykorzystuje bieżącą wersję (10.1.0) , która jest wcześniejsza niż to wyzwanie.
Wypróbuj online !
Wyjaśnienie
źródło
JavaScript ES7,
737069 bajtówUżywa tej samej techniki, co moja odpowiedź Japt .
źródło
Ruby,
6965Niegolfowany w programie testowym
Wydajność
źródło
ES7, 82 bajty
Zwraca 130,8127826502993 na wejściu „B # 2” zgodnie z oczekiwaniami.
Edycja: Zapisano 3 bajty dzięki @ user81655.
źródło
2*3**3*2
ma 108 w konsoli przeglądarki Firefox, z którą się zgadza2*(3**3)*2
. Zauważ też, że ta strona mówi również, że?:
ma wyższy priorytet niż,=
ale w rzeczywistości ma taki sam priorytet (rozważa=b?c=d:e=f
).**
więc nigdy nie byłem w stanie go przetestować. Myślę, że?:
ma wyższy priorytet niż=
dlatego, że w twoim przykładziea
jest ustawiony na wynik trójki, a nieb
wykonanie trójki. Pozostałe dwa zadania są zawarte w trójce, więc są szczególnym przypadkiem.e=f
trójskładnik?a=b?c=d:e=f?g:h
. Gdyby miały taki sam priorytet, a pierwsza trójka zakończyła się=
późnieje
, spowodowałoby to nieprawidłowy błąd przypisania po lewej stronie.?:
miał wyższy priorytet niż w=
każdym razie. Wyrażenie musi być grupowane tak, jakby byłoa=(b?c=d:(e=(f?g:h)))
. Nie możesz tego zrobić, jeśli nie mają takiego samego pierwszeństwa.C, 123 bajty
Stosowanie:
Obliczona wartość jest zawsze o około 0,8 centa mniejsza niż dokładna wartość, ponieważ wycinam jak najwięcej cyfr z liczb zmiennoprzecinkowych.
Przegląd kodu:
źródło
R,
157150141136 bajtówZ wcięciami i znakami nowej linii:
Stosowanie:
źródło
Python,
9795 bajtówOparty na starym podejściu Pietu1998 (i innych) polegającym na szukaniu indeksu nuty w łańcuchu
'C@D@EF@G@A@B'
dla jakiegoś pustego znaku lub innego. Używam iterowalnego rozpakowywania, aby analizować ciąg nut bez warunków warunkowych. Zrobiłem trochę algebry na końcu, aby uprościć wyrażenie konwersji. Nie wiem, czy uda mi się to skrócić bez zmiany podejścia.źródło
b==['#']
można go skrócić'#'in b
inot b
dob>[]
.Wolfram Language (Mathematica), 69 bajtów
Korzystanie z pakietu muzycznego , za pomocą którego po prostu wprowadzenie nuty jako wyrażenia ocenia się na jej częstotliwość, w następujący sposób:
Aby zapisać bajtów poprzez unikanie zaimportować pakiet ze
<<Music
używam w pełni kwalifikowane nazwy:Music`Eflat3
. Jednak, nadal mam do zastąpieniab
zflat
i#
zesharp
dopasować format wejściowy na pytanie, co zrobić z prostegoStringReplace
.źródło