La trompeta es un instrumento de aerófono con válvula, generalmente colocado B♭
. El sonido se hace cuando el jugador hace vibrar sus labios para desplazar el aire dentro del instrumento. Esa vibración se adquiere al ajustar la boca de una manera específica, llamada embocadura. Diferentes embocaduras, con labios más apretados o más flojos, producen diferentes tonos.
Además, cada válvula en la trompeta también cambia el tono del instrumento. Cuando se presiona, una válvula cierra un camino dentro del tubo del instrumento, haciendo que el aire fluya a través de un camino más largo, bajando así el tono del sonido original. Para los propósitos de este desafío, consideraremos la B♭
trompeta estándar, en la cual la primera válvula baja el paso en un paso completo, la segunda baja el paso en medio paso, y el tercero baja el paso en uno y un medio paso.
El reto
Su desafío es crear un programa o función que, con dos entradas embouchure
y valves
, determina el tono de la nota que se está reproduciendo.
Para los propósitos de este desafío, las notas seguirán la secuencia:
B♭, B, C, C♯, D, E♭, E, F, F♯, G, G♯, A.
Reglas
- Las E / S pueden tomarse / administrarse de cualquier manera razonable .
- Se aplican lagunas estándar .
- Se le permite usar
b
y en#
lugar de♭
y♯
si lo desea. - La entrada para
valves
se puede tomar como una lista de válvulas deprimidas (1, 3
) o una lista booleana (1, 0, 1
). - Este es el código de golf , por lo que gana el código más corto en cada idioma.
Casos de prueba:
Valves
en estos casos de prueba se da como una lista booleana, donde 0 significa deprimido y 1 significa presionado.
Embouchure: Valves: Output:
B♭ 0 0 0 B♭
B♭ 0 1 0 A
B♭ 1 0 1 F
C♯ 0 0 1 B♭
C♯ 1 1 1 G
E♭ 1 0 0 C♯
G 0 1 1 E♭
G♯ 1 0 0 F♯
G♯ 0 0 1 F
G 1 0 0 F
F♯ 1 0 0 E
D 1 0 1 A
A 1 1 1 E♭
E 1 1 0 C♯
E 0 0 1 C♯
Descargo de responsabilidad: todavía no soy un gran músico, así que me disculpo por cualquier carnicería que haya hecho en los casos de prueba. Se aprecian las correcciones.
F# 100
ser E no F?C#
trompeta sin presionar ninguna válvula. Solo notas específicas (B♭-F-B♭-D-F-A♭-B♭...
), la serie de armónicos deB♭
. Aún así, incluso si no refleja un instrumento real, el desafío está perfectamente bien definido.Respuestas:
Pitón
32,12511981 bytesPruébalo en línea!
Ahorré muchos bytes gracias a Jonathan Allan.
Mi solución original (en Python 3 ):
Pruébalo en línea!
Guardado 6 bytes gracias a @HyperNeutrino.
Explicación
Primero, hago una serie de notas, pero doblé su longitud para no tener que preocuparme por pasar de un lado
Bb
a otroA
.Luego, tomo la entrada en el siguiente formato (por ejemplo):
Luego encuentro el índice de la nota inicial usando
n.index(e,9)
(9
está ahí para asegurarme de que empiezo bien en el medio de la lista (duplicada). Calculo el desplazamiento deseado con la expresión:Dónde
f
está la primera válvula,s
es la segunda válvula yt
es la tercera.Finalmente, simplemente imprime la nota encontrada en la lista restando el desplazamiento del índice inicial.
fuente
"<some string>".split()
se divide por espacios en blanco por defectostr
yint
lanzando y permitiendo la entrada evaluada) e invirtiendo las notas y compensando hacia adelante (evitando,9
laindex
llamada. ¡ Pruébelo en línea!'Bb', 1, 1, 1
llevarlo al índice-6
que seríaE
, según sea necesario): es lo que TFeld tiene Ya hecho .Wolfram Language (Mathematica) , 100 bytes (y 134 para una trompeta de trabajo)
Pruébalo en línea!
Bastante sencillo.
Una mejor salida por el costo de 34 bytes.
fuente
Gelatina ,
3736 bytesUn enlace diádico que acepta las válvulas como una lista de
1
s o0
s como una lista que representa[second, first, third]
a la izquierda y la embocadura como una lista de caracteres a la derecha que devuelve una lista de caracteres.Pruébalo en línea!
¿Cómo?
fuente
Rubí , 71 bytes
Pruébalo en línea!
70 caracteres pero 80 bytes
Pruébalo en línea!
fuente
Javascript 96 bytes
Siguiendo la idea de @vasilescur, esta es la implementación en js
fuente
b
y#
están permitidos) pero necesitas usarb
y en#
lugar de pisos y objetos punzantes.Lote, 188 bytes
Usos
#
yb
: esto significa queEb
yBb
son nombres de variables legales;#
se maneja haciendo un reemplazo de cadena a+1
. El resultado del reemplazo de la cadena se evalúa automáticamente y las válvulas se tienen en cuenta antes de buscar el resultado en una lista.fuente
Stax , 32 bytes
Ejecútelo y depúrelo en línea
Toma un nombre de nota y una lista de válvulas deprimidas. Construye una matriz de nombres de notas, luego calcula el intervalo total de la válvula y obtiene la nota en ese desplazamiento en la matriz.
Ejecute este
fuente
Pitón 2 ,
8479 bytesPruébalo en línea!
fuente
C (gcc) ,
92 8682 bytesPruébalo en línea!
Adaptado de la implementación de @ Vazt .
fuente
Perl6 / Rakudo 73 caracteres
Técnicamente, esto es 83 bytes porque puse los caracteres Unicode, pero intercambiarlos por los equivalentes ASCII daría 73 bytes.
Como
{code block}
con parámetros como$^a
este es un lambda, con una firma($a, $b, $c, $d)
.Llámalo:
Menos golfizado:
Aquí doblamos una cadena
'...' x 2
usando elx
operador infijo, luego buscamos la embocadura seguida de n notas usando el operador smartmatch'...' ~~ /.../
: la expresión regular depende de\w\W?
que sea una palabra char y luego tal vez una palabra no char.Buscamos n instancias de esa vía
(\w\W?)**{$_}
, donde ya hemos calculado n =$_
de params$b
a$d
. Esto produce una coincidencia de la nota de embocadura con la nota resultante, de la cual solo queremos la última, por lo que la combinamos con otra~~ /\w\W?$/
.El cálculo de
$_
primero es necesario para permitir$^b
creación implícita de parámetros en el bloque.76 caracteres
Una alternativa que utiliza una matriz en lugar de coincidencias de cadenas es 3 caracteres más:
Encontrar la embocadura en la lista se logra con
@arr.first: $^a, :k
, que devuelve el índice (clave) del elemento encontrado con:k
.Establecer la matriz en
$_
(como un objeto) nos permite usarla.first
y usarla.[ ]
sin gastar demasiados caracteres.fuente
C (gcc) , 155 bytes
Pruébalo en línea!
Enfoque simple
La entrada de la válvula es 0,1.
La entrada de embocadura debe estar en minúscula. Curiosamente, TiO no se encuentra
strcmpi()
sin incluirstring.h
, mientras que mingw-gcc lo permite con la-Wimplicit-function-declaration
advertencia estándar .fuente