Wytyczne
Zadanie
Biorąc pod uwagę dwie nuty, wprowadzone jako ciągi znaków lub listy / tablice, obliczyć, ile są półtonów oddzielnie (w tym same nuty), wyprowadzając jako liczbę.
Objaśnienie półtonu:
Półton to jeden krok w górę lub w dół klawiatury. Przykładem jest C do C #. Jak widać poniżej, notatka C znajduje się na białej nucie, a C # to czarna nuta tylko jedna nad nią. Półtony to przeskoki od czarnej nuty do następnej białej nuty, w górę lub w dół, z wyjątkiem:
- Od B do C.
- C do B.
- E do F
- F do E
Przykłady
'A, C' -> 4
'G, G#' -> 2
'F#, B' -> 6
'Bb, Bb' -> 13
Zasady
- Największa odległość między dwiema nutami wynosi 13 półtonów.
- Druga wprowadzona nuta zawsze będzie znajdować się powyżej pierwszej wprowadzonej nuty.
- Możesz przyjmować dane wejściowe jako ciąg znaków lub tablicę / listę. Jeśli wziąć ją jako ciąg, Obligacje zostaną oddzielone przecinkami (np
String -> 'A, F'
,Array -> ['A', 'F']
). - Możesz założyć, że zawsze otrzymasz dwie ważne notatki.
- Ostre będą oznaczone jako,
#
a mieszkania będą oznaczone jakob
- Twój kod musi obsługiwać ekwiwalenty enharmoniczne (np. Musi obsługiwać zarówno F #, jak i Gb)
- Twój kod nie musi obsługiwać notatek o nazwach, ale można je nazwać bez ostrych lub płaskich znaków (tzn. Nie musisz obsługiwać E # ani Cb). Punkty bonusowe, jeśli Twój kod to obsługuje.
- Twój kod nie musi obsługiwać podwójnych narzędzi ani podwójnych mieszkań.
- Możesz założyć, że jeśli otrzymasz te same nuty lub ten sam ton (np. „Gb, Gb” lub „A #, Bb”), druga nie będzie dokładnie o jedną oktawę powyżej pierwszej.
- To jest kod golfowy, więc wygrywa odpowiedź z najmniejszą ilością bajtów.
G -> G#
ponieważ oba są uwzględnione.Cb
lubE#
? A co z podwójnymi ostrymi narzędziami?(X, Y]
sposób, że C do C # to 1 półton, a C do C to 12 półtonów.Odpowiedzi:
Python 2 , 66 bajtów
Wypróbuj online!
Python 2 , 68 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 78 bajtów
Zapisano 1 bajt dzięki @Neil
Robi notatki w składni curry
(a)(b)
.Przypadki testowe
Pokaż fragment kodu
Funkcja skrótu
Celem funkcji skrótu jest konwersja notatki na wskaźnik w tabeli odnośników zawierającej przesunięcia półtonów (C = 0, C # = 1, ..., B = 11), przechowywane w systemie szesnastkowym.
Najpierw dołączyć „3” do noty przetwarza wynikowy ciąg w bazie-36, co prowadzi do liczby całkowitej N . Ponieważ „#” jest niepoprawnym znakiem, jest po prostu ignorowany, podobnie jak każda następująca po nim postać.
Następnie obliczamy:
Poniżej znajduje się podsumowanie wyników.
O mieszkaniach i ostrych narzędziach
Poniżej znajduje się dowód, że ta funkcja skrótu zapewnia, że nuta, po której następuje „#”, daje ten sam wynik, co następna nuta, po której następuje „b” . W tym akapicie używamy przedrostka @ dla ilości podstawowych 36.
Na przykład Db zostanie przekonwertowany na @ db3, a C # zostanie przekonwertowany na @c (patrz poprzedni akapit). Chcemy udowodnić, że:
Lub w ogólnym przypadku, gdy Y = X + 1 :
@ b3 ma 399 po przecinku. W związku z tym:
1296 jest zgodny z 1 modułem 37 , więc można to uprościć jako:
Szczególnym przypadkiem jest przejście z G # na Ab , ponieważ spodziewalibyśmy się Hb , aby zachować zgodność z powyższymi formułami. Jednak ten działa również, ponieważ:
źródło
Perl,
3932 bajtówObejmuje
+1
dlap
Podaj nuty początkowe i końcowe jako dwie linie na STDIN
Tylko kod:
źródło
Japt , 27 bajtów
Przetestuj online! Pobiera dane wejściowe jako tablicę dwóch ciągów.
Działa również w przypadku dowolnej ilości narzędzi ostrych lub płaskich na dowolnej nucie bazowej!
Wyjaśnienie
źródło
Perl 5 +
-p
, 66 bajtówWypróbuj online!
Pobiera wartości oddzielone przecinkami. Działa również dla Cb, B #, E #, Fb i wielu # / b.
Wyjaśnienie:
Wyjaśnienie dotyczące eval:
źródło
Rubinowy , 56 bajtów
Wypróbuj online!
Litery są parsowane zgodnie z ich czasami kodu ASCII
5/3
w następujący sposób (daje to wymaganą liczbę półtonów plus przesunięcie 108)Ostatni znak (
#
,b
lub kolejny list) jest analizowany jako kod ASCII podzielona przez 32 następującoOdejmuje się to od kodu literowego.
Następnie wynik końcowy jest zwracany jako
13-(difference in semitones)%12
źródło
Stax ,
2524 bajtówUruchom i debuguj online
Odpowiada to reprezentacji ascii tego samego programu.
Skutecznie oblicza indeks klawiatury dla każdej nuty za pomocą formuły, a następnie oblicza wynikowy interwał.
2 - code / 32
gdziecode
jest kod ascii ostatniego znaku.źródło
["F#","B"]
powinno być 6.Partia,
136135 bajtówObjaśnienie: substytucje w
c
podprogramie zastąpić#
w imię notatki z+1
ib
z-1
. Ponieważ jest to bez rozróżniania wielkości liter,Bb
staje się-1-1
. Zmienne dlaC
...A
(również bez rozróżniania wielkości liter) są więc wybierane tak, aby była odpowiednią liczbą półtonów odB=-1
. Wynikowy ciąg znaków jest następnie oceniany, a sztuczka @ xnor polegająca na odjęciu wyniku od wartości daje pożądany efekt odjęcia od siebie wartości nut. Edycja: W końcu używam sztuczki @ Arnauld odejmowania modulo od 13, aby uzyskać pożądaną odpowiedź, oszczędzając 1 bajt.źródło
Python 3 , 95 bajtów
Wypróbuj online!
-14 bajtów dzięki user71546
źródło
ord(q[0])-65
wymianą"ABCDEFG".find(q[0])
;)(g(b)+~g(a))%12+2
zastąpieniem1+((g(b)-g(a))%12or 12)
Galaretka , 28 bajtów
Monadyczny link akceptujący listę dwóch list znaków i zwracający liczbę całkowitą.
Wypróbuj online! lub zobacz wszystkie możliwe przypadki .
W jaki sposób?
Wykonuje dziwaczną arytmetykę na rzędnych znaków wejściowych, aby zmapować nuty na liczby całkowite od zera do dwunastu, a następnie wykonuje dekompresję podstawową jako proxy dla modulo przez dwanaście, gdzie zero jest następnie zastępowane przez 12, a następnie dodaje jeden.
Również przy 28 bajtach ...
(Nie tak bezpośredni) port odpowiedzi Python 2 na xnor ...
Wypróbuj wszystkie możliwe przypadki
źródło
CJam , 67 bajtów
Tłumacz online: http://cjam.aditsu.net/
źródło