Compito
Scrivi un programma per determinare la nota suonata, insieme a quanti centesimi non accordati, di una corda accordata su una data frequenza e premuta in un determinato punto.
Per semplicità, supponiamo che la frequenza del suono prodotto e la lunghezza della corda alla destra del punto in cui viene premuto siano inversamente proporzionali.
Nota: questo compito si occupa esclusivamente del tono fondamentale e non di sfumature / altre armoniche.
Ingresso
Al tuo programma vengono forniti due dati:
Una stringa di lunghezza arbitraria, che rappresenta la stringa in questione. Questa stringa verrà contrassegnata con una X in cui la stringa deve essere tenuta premuta.
[-----] 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)
Supponiamo che la nota venga suonata usando la parte della stringa alla destra di
X
.- Un numero (non necessariamente un numero intero), che indica la frequenza con cui viene sintonizzata la stringa. La precisione di questo numero sarà al massimo di quattro cifre oltre il decimale.
Si può presumere che le frequenze passate si trovino tra 10 Hz
e 40000 Hz
.
L'input può essere passato in un formato a scelta. Si prega di specificare come l'ingresso è accettato nel programma nella risposta.
Produzione
Il tuo programma deve emettere sia la nota più vicina * nel sistema di accordatura a temperamento uguale a dodici toni, sia il numero di centesimi di distanza dalla nota più vicina che il suono indicato dalla stringa sarebbe (arrotondato al centesimo più vicino).
+n
centesimi dovrebbero essere usati per indicare i n
centesimi nitidi / sopra la nota e -n
centesimi per piatto / sotto la nota.
La nota dovrebbe essere emessa in notazione scientifica. Supponiamo che A4 sia sintonizzato su 440Hz
. Usare b e # per note piatte / acute. Nota: è possibile utilizzare taglienti o piatti. Per la nota a 466.16Hz
, o A#
o Bb
può essere emesso per la nota.
Il formato dell'output dipende da te, purché l'output contenga solo le due informazioni precedentemente specificate (ovvero non è consentito stampare ogni singolo output possibile).
* la nota più vicina si riferisce alla nota più vicina al suono indicato dall'ingresso, misurata nel numero di centesimi (quindi, la nota che si trova all'interno 50 cents
del suono). Se il suono è 50 cents
lontano da due note diverse (dopo l'arrotondamento), è possibile che venga emessa una delle due note.
Esempi
Il tuo programma dovrebbe funzionare per tutti i casi, non solo per i seguenti esempi.
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--]
* È possibile che sia stata emessa nitidezza o distorsione.
Link potenzialmente utili
- Note e Frequenze
- Pagina di Wikipedia sulla notazione scientifica del passo
- Pagina di Wikipedia sui centesimi
Questo è code-golf, quindi vince la risposta più breve.
[-X--]
, la stringa viene divisa in 4 punti (e quindi in 5 parti), e premuta nella seconda di queste divisioni. Pertanto, viene premuto 2/5
e la lunghezza utilizzata è 3/5
.
-
pratica rappresenta la posizione delle divisioni, grazie per aver spiegato!
[--X--]
la stringa viene premuta nel mezzo della divisione in cuix
è collocato, mentre l'ultimo[-X--]
sarebbe a 3/8 (non 2/5) seguendo questa logica. O capisco qualcosa di sbagliato?