Zadanie
Napisz program, który określi, że zabrzmiała nuta, a także ile centów nie zostało dostrojone, struny dostrojonej do określonej częstotliwości i wciśniętej w danym punkcie.
Dla uproszczenia załóżmy, że częstotliwość wytwarzanego dźwięku i długość struny po prawej stronie od miejsca jej wciśnięcia są odwrotnie proporcjonalne.
Uwaga: to zadanie dotyczy wyłącznie tonu podstawowego, a nie podtonów / innych harmonicznych.
Wejście
Twój program otrzymuje dwie części danych:
Ciąg o dowolnej długości, reprezentujący dany ciąg. Łańcuch zostanie oznaczony znakiem X, w którym łańcuch będzie przytrzymywany.
[-----] is a string divided in six sections (five divisions). [--X--] is a string pressed at the exact center of the string. [X----] is a string pressed at 1/6 the length of the string. (Length used is 5/6) [-X--] is a string pressed at 2/5 of the length of the string. (Length used is 3/5)
Załóżmy, że nuta brzmi przy użyciu części struny po prawej stronie
X
.- Liczba (niekoniecznie liczba całkowita), oznaczająca częstotliwość, z jaką strojony jest ciąg. Dokładność tej liczby będzie wynosić co najwyżej cztery cyfry po przecinku.
Można założyć, że przekazywane częstotliwości będą znajdować się pomiędzy 10 Hz
i 40000 Hz
.
Dane wejściowe mogą być przekazywane w wybranym formacie. W odpowiedzi proszę określić, w jaki sposób dane wejściowe są akceptowane w twoim programie.
Wynik
Twój program musi wyprowadzać zarówno najbliższą nutę * w dwunastotonowym systemie strojenia o równym temperamencie, jak i liczbę centów od najbliższej nuty, jaką byłby dźwięk oznaczony przez strunę (zaokrąglony do najbliższego centa).
+n
centów należy używać do oznaczania n
centów ostrych / powyżej nuty, a -n
centów płaskich / poniżej nuty.
Notatka powinna być wyprowadzona w naukowym zapisie wysokości tonu. Załóżmy, że A4 jest dostrojony 440Hz
. Użyj b i # dla płaskich / ostrych nut. Uwaga: Można użyć ostre lub płaskie. W przypadku nuty o 466.16Hz
albo A#
albo Bb
może być wyprowadzany dla nuty.
Format wydruku zależy od Ciebie, o ile wydruk zawiera tylko dwa uprzednio określone informacje (tzn. Drukowanie każdego możliwego wydruku jest niedozwolone).
* najbliższa nuta oznacza nutę najbliższą dźwiękowi oznaczonemu przez wejście, mierzoną liczbą centów (a więc nutą, która znajduje się w 50 cents
dźwięku). Jeśli dźwięk jest 50 cents
oddalony od dwóch różnych nut (po zaokrągleniu), może zostać wyprowadzona jedna z dwóch nut.
Przykłady
Twój program powinien działać we wszystkich przypadkach, a nie tylko w poniższych przykładach.
Output Input Frequency Input String
A4, +0 cents 220 [-----X-----]
A5, +0 cents 220 [--------X--]
D5, -2 cents 440 [--X--------]
B4, -49 cents 440 [X----------]
A#4, +19 cents* 314.1592 [X-]
Eb9, +8 cents* 400 [-----------------------X]
Eb11,+8 cents* 100 [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------X]
D#1, +49 cents* 10 [--X]
A0, -11 cents 11.7103 [---X--]
* Można było wyprowadzić ostry lub płaski.
Potencjalnie pomocne linki
- Uwagi i częstotliwości
- Strona Wikipedii na temat naukowej notacji podziałowej
- Strona Wikipedii na temat centów
To jest golf-golf tak najkrótsza odpowiedź wygrywa.
[--X--]
sznurek jest wciśnięty w środku podziału, w którymx
jest umieszczony, podczas gdy ostatni[-X--]
byłby na 3/8 (nie 2/5), jeśli podążałby za tą logiką. Czy rozumiem coś złego?[-X--]
ciąg jest podzielony w 4 miejscach (a zatem na 5 części) i wciśnięty w drugim z tych podziałów. W ten sposób jest wciśnięty2/5
, a zastosowana długość to3/5
.-
zasadniczo przedstawia pozycję dywizji, dziękuję za wyjaśnienie!Odpowiedzi:
BBC Basic, 161 #
Wynik nie uwzględnia komentarzy. Jeszcze nie grałem w golfa.
Wynik
Działa poprawnie na wszystkich przypadkach testowych z wyjątkiem dwóch długich. Dla
Eb9
Wydaje się, że jest jedna kreska brakuje z testu: Istnieje 22-
i jednąX
, która dzieli ciąg na 24 równych części. Według moich ręcznych obliczeń jest to 9600 Hz, czyli 37 centów powyżej D9. Dokładnie to wyprowadza mój program. Jeśli dodam kolejną kreskę, dostanę Eb9 + 8 centów. Niestety BBC Basic nie może obsługiwać ciągów o długości przekraczającej 255 znaków, więcEb11
sprawa wyświetla błąd.źródło
C 179
Odbiera sam obraz ascii na linii, a częstotliwość na osobnej linii.
Kilka postaci można upuścić, zmniejszając dokładność magicznych liczb
17.3123
i57.376
.Program bez gry w golfa wygląda następująco:
źródło
scanf
ciąg formatu. Nie miałem pojęcia, że możesz to zrobić. Sprawdzę kod wyjściowy później (myślałem o zrobieniu tego w C i chociaż coś podobnego przyszło mi do głowy, nie mogłem znaleźć sposobu, aby zrobić to wszystko konkurencyjnie.) Zakładam, żed+9
to dlatego, że jesteś zaindeksowany uwaga A, więc trzeba dostosować liczbę oktaw do indeksu w uwadze C: Zastanawiam się, czy jest na to jakiś sposób.JavaScript (199)
Nazwij to np. Jako
t('[X-]',314.1592)
Naprawiony. (Ponieważ mieszkam w Europie, użyłem B zamiast Bb i H zamiast B =)
źródło
t('[---X--]',11.7103)
(ostatni przykład) daje-10
zamiast-11
p="C0C#0D0D#0E0F0F#0G0G#0A0B0H".split(0)
oszczędza dodatkowe 2 znaki.round(x) = x+.5|0
której poprawne są tylko liczby dodatnie, naprawię to później. @ipi dzięki!Python 3: 175
Nie golfowany:
źródło