Zadanie
Powinieneś napisać program, który po naciśnięciu przycisku emituje inny dźwięk dla każdego klawisza.
Kluczami, których będziesz używać, są:
1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm
Nuty zaczynają się od, C
a każdy klawisz powyżej dodaje jeden półton.
Pozwólmy ci to jednak nieco ułatwić. Możesz wybrać pomiędzy 2 podobnymi zadaniami,
1) Po naciśnięciu klawisza wypisuje inną nutę, która trwa do momentu naciśnięcia innego klawisza. Ten program działa bez końca
2) Weź ciąg znaków, który zawiera tylko powyższe znaki, które będą generować każdą nutę przez dokładnie 1 sekundę (dozwolona zmiana 0,05 sekundy)
Wejście
- Naciśnięcie klawisza
- Pojedynczy ciąg zawierający tylko powyższe symbole
Wynik
- Pojedyncza nuta, która brzmi do momentu naciśnięcia innego klawisza
- Seria notatek, każda o długości 1 sekundy
Notatki
Letter | Note
-------+-------
1 | C
! | C#
2 | D
" | D#
3 | E
4 | F
$ | F#
5 | G
% | G#
6 | A
^ | A#
7 | B
8 | C
* | C#
9 | D
( | D#
0 | E
q | F
Q | F#
w | G
W | G#
e | A
E | A#
r | B
t | C <-- middle C
T | C#
y | D
Y | D#
u | E
i | F
I | F#
o | G
O | G#
p | A
P | A#
a | B
s | C
S | C#
d | D
D | D#
f | E
g | F
G | F#
h | G
H | G#
j | A
J | A#
k | B
l | C
L | C#
z | D
Z | D#
x | E
c | F
C | F#
v | G
V | G#
b | A
B | A#
n | B
m | C
Zasady
- Możesz wybrać pomiędzy zadaniami, ale powiedz, które z nich w odpowiedzi
- Otrzymujesz ± 0,05 sekundową zmianę w zadaniu 2
- Każdy symbol zwiększa ton o 1 półton.
- Poszczególne nuty pokazano powyżej
- To jest golf golfowy, więc wygrywa najkrótszy kod
Zostało to pierwotnie zabrane stąd za zgodą Caira coinheringaahinga
Odpowiedzi:
Python 3,
154140 bajtówWybrałem drugi typ zadania.
Pętla przechodzi przez każdy znak i szuka indeksu tego elementu w ciągu. Ten indeks jest liczbą półtonów w górę od niskiej C („1”). Obliczenie żądanej częstotliwości odbywa się według tego wzoru .
PS Ta biblioteka działa tylko w systemie Windows.
-13 bajtów dzięki ovs.
-1 bajt dzięki Jonathan Allan.
źródło
from winsound import*
for i in input():Beep(int(65.406*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.find(i)/12)),1000)
0.05
Tolerancja powinna pozwalają korzystać999
.JavaScript (ES6), 247 lub 230 bajtów
Postanowiłem wypróbować obie opcje.
Zaoszczędź kilka bajtów dzięki @darrylyeo za sugerowanie
with
instrukcji.Podziękowania dla @ Кирилл Малышев za wskazanie problemu z
.search()
.Opcja 1 - wprowadzanie z klawiatury,
252246247 bajtówOpiera się na elemencie wejściowym odbierającym rzeczywistą wpisaną literę zamiast kodów znaków. Fokus musi być ustawiony na polu wprowadzania.
Opcja 2 - Ciąg wejściowy,
234229230 bajtówPo prostu bierze ciąg jako parametr funkcji.
Połączony fragment kodu
Sugeruję obniżenie głośności przy włączonym to, może być głośno. Aby zatrzymać odtwarzanie, fragment wymagał dodania
o=
do każdego z nichwith(c.createOscillator())
.źródło
with
zestawieniu, abyo.
_=>{c=new AudioContext;with(c.createOscillator())connect(c.destination),I.oninput=_=>(~(i='1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.search(I.value,I.value=""))&&(frequency.value=65.4*2**(i/12),r||(start(),r=1)))}
with
instrukcję, ale łamie ostatni bit (o.r||(o.start(),o.r=1)
), ponieważo.r
do tej pory używałem faktu, który jest niezdefiniowany, ale teraz popełni błąd, ponieważr
nie został zadeklarowany. Okazuje się, że krótsze było po prostu zadeklarowanie tej zmiennej oddzielnie od jakichkolwiek obiektów, więc to zrobiłem..search()
traktuje dane wejściowe jako wyrażenie regularne. Przełączono na.indexOf()
.AHK , 130 bajtów
Wybrałem opcję 2.
Wyjaśnienie:
Przechowywanie szukanego ciągu jako zmiennej
s
było krótsze niż uniknięcie tego bałaganu bezpośrednio wSoundBeep
funkcji. Musiałem uciec od znaku procentu, ponieważ jest to znak zmiany znaczenia dla nazw zmiennych, ale reszta ciągu jest w porządku.Domyślnie zmienna
1
jest pierwszym parametrem wejściowym. Wpisanie tego do pętli analizowania bez określania separatora spowoduje, że każdy znak w łańcuchu wejściowym będzie analizowany indywidualnie.SoundBeep
przyjmuje częstotliwość w Hz i czas trwania w milisekundach i odtwarza tę nutę tak długo.Zabawne było ustalenie odpowiednich częstotliwości. Odwołując się do tabeli częstotliwości klawiszy fortepianu z Wikipedii i wzoru na tej samej stronie, znalazłem najkrótsze kodowanie, aby użyć A 1 jako nuty referencyjnej, ponieważ jego częstotliwość to ładna okrągła 55 Hz. Ponieważ chcemy zacząć od C 1 , musimy dostosować z A 1 (trzynasta nuta) do C 1 (czwarta nuta). To, plus fakt, że
InStr
jest indeksowany jednokrotnie, dlatego odejmujemy 10 od wynikuInStr
funkcji.źródło