Ayer compré una armónica:
Figura 1: La armónica.
Sin embargo, mis sueños de poder tocar una armónica de blues conmovedora que conmueve a las personas y hace llorar a un hombre adulto se desvanecieron rápidamente por dos problemas:
- La armónica solo puede tocar ciertas notas;
- Soy deprimentemente malo tocando la armónica.
A pesar de mi falta de habilidad en la armónica, todavía hay algunas canciones que puedo tocar en ella. Sin embargo, no es obvio de inmediato si puedo tocar alguna pieza musical en la armónica o no. Dadas las notas de una pieza musical, escriba un programa para determinar si podría tocarlo en mi armónica o no.
Como muestra la imagen de arriba, mi armónica tiene diez agujeros. Con cada orificio, puedo exhalar o inhalar, el orificio que elijo y si inhalo o exhalo cambia el tono del sonido resultante. Cada hoyo tiene un tono diferente al exhalar e inhalar, pero hay algunas combinaciones que dan como resultado la misma nota. En general, mi armónica puede tocar 19 tonos diferentes únicos. Los tonos se presentan en notación científica musical: la letra representa la nota y el número representa en qué octava se encuentra.
Hole Breathing Note
1 Exhale C4
1 Inhale D4
2 Exhale E4
2 Inhale G4
3 Exhale G4
3 Inhale B4
4 Exhale C5
4 Inhale D5
5 Exhale E5
5 Inhale F5
6 Exhale G5
6 Inhale A5
7 Exhale C6
7 Inhale B5
8 Exhale E6
8 Inhale D6
9 Exhale G6
9 Inhale F6
10 Exhale C7
10 Inhale A6
Por ejemplo, si exhalo en el hoyo 3, obtendría una G4
nota. Si inhalara en el hoyo 2, también recibiría una G4
nota. Si exhalara en el hoyo 7, obtendría un C6
.
Cuando respiro en la armónica, además de exhalar o inhalar, también puedo elegir si respirar con dificultad o con dificultad . Respirar ligeramente hace que suene solo un agujero, mientras que la respiración hace que suene un agujero y ambos agujeros a cada lado de ese agujero. No tengo las habilidades de embocadura para soplar en dos agujeros: es uno o tres.
Por ejemplo, si exhalo por poco en el hoyo 4, solo sonaría el hoyo 4, por lo que obtendría un sonido C5. Si exhalara ampliamente en el hoyo 4, sonarían los agujeros 3, 4 y 5, y obtendría un acorde G4, C5, E5. Si inhalara ampliamente en el hoyo 4, sonarían los agujeros 3, 4 y 5, pero en su lugar tocarían los tonos de inhalación, lo que da como resultado un acorde B4, D5, F5. Tenga en cuenta que para los agujeros en cualquier extremo, si respiro profundamente en ellos, solo sonarían dos agujeros (porque no hay un agujero 0 o un agujero 11).
Sin embargo, no puedo inhalar y exhalar al mismo tiempo. Por ejemplo, podría exhalar en los agujeros 4, 5 y 6 para que las notas C5, E5 y G5 suenen al mismo tiempo, formando un acorde. Sin embargo, no puedo inhalar y exhalar al mismo tiempo, por lo que sería imposible para mí tocar el acorde C5, F5, A5 ya que de alguna manera tendría que exhalar en el hoyo 4 e inhalar en el hoyo 5 y 6. Si Esto aún no está claro, este hilo de comentarios podría ser útil.
La entrada son las notas de la música. Las notas se anotan de la misma manera que en la tabla anterior y están separadas por comas. Las notas envueltas entre corchetes representan un acorde. Por ejemplo:
C4,D4,G4,{D5,F5,A5},B5
Esto significa "C4, luego D4, luego G4, luego D5, F5 y A5 al mismo tiempo, luego B5". Su programa tomará una secuencia en este formato como entrada y salida True
si me es posible reproducir la música en mi armónica, o de False
otra manera. Para entradas y salidas de muestra, se debe mostrar el ejemplo anterior True
. La entrada {C5,F5,A5}
por otro lado saldrá False
.
Este es el código de golf, por lo que gana la entrada más corta.
Aquí hay algunos casos de prueba:
Entrada (escala principal de CA):
C4,D4,E4,F4,G4,A4,B4,C5
Salida:
False
(porque la armónica no puede tocar F4 o A4)
Entrada (las 2 barras iniciales de Let It Go ):
E6,F6,A5,E6,F6,F6,E6,A5,F6,E6
Salida:
True
Entrada:
{E6,G6,F6}
Salida:
False
Entrada:
{G4,C5,E5},{F5,A5,B5}
Salida:
True
Puede suponer que los acordes vendrán en un orden de tono más bajo a más alto.
Respuestas:
Python -
218209189 caracteresMínimo:
Para facilitar la lectura:
Dada una cadena formateada como en la descripción del problema,
t
regreseTrue
si la secuencia se puede reproducir en la armónica descrita, yFalse
si no lo es.No se verifica el orden de las notas en los acordes. A menos que se indique lo contrario, creo que esto es suficiente ya que eso no está en la declaración del problema, y pasa todas las pruebas dadas en:
fuente
] if "".join(x) not
-> Las]if"".join(x)not
palabras clave pueden estar adyacentes a las cadenas, por lo que"and"
es correcto.Javascript -
245243 caracteresMinified:
Y ampliado:
La función
p
acepta una cadena como entrada y devuelveTrue
si la secuencia de nota / acorde se puede reproducir, de loFalse
contrario. Devuelve resultados indefinidos si la entrada no es sintácticamente válida.También asume audazmente que las notas de acorde se ingresan en orden de agujero ascendente (como en el ejemplo).
El recuento de caracteres se puede reducir en 14 si se permite que la función devuelva lógica
true
yfalse
no sus equivalentes de cadena.fuente
JavaScript (ES6), 230
Solo una versión reescrita de la respuesta de @ COTO:
Agradecería cualquier consejo sobre jugar golf más abajo ya que estoy empezando a aprender ES6. :-)
fuente
Scala 178
Sin golf:
Tenga en cuenta que la entrada con formato incorrecto se maneja mal: cualquier cadena se acepta y muchas cadenas con formato incorrecto devuelven verdadero, por ejemplo:
Imprime verdadero.
fuente
Rebol - 188
Sin golf:
Ejemplo de uso (en la consola Rebol):
Si bien este código atrapará galimatías como este:
Sin embargo, permitirá cosas como esta a través de:
Porque lo analiza como "C4, D4".
Aquí hay una versión más estricta del código:
Este campo de golf tiene 228 caracteres y ahora vuelve
false
a ...fuente
JavaScript ES6,
211209190 caracteresSé que esto se puede jugar más golf. Intentaré hacerlo en unas pocas horas;
Ejecute este código en la última consola web de Firefox, obtendrá un método llamado al
C
que puede llamar comoC("{G4,C5,E5},{F5,A5,B5}")
y regresaráTrue
o enFalse
consecuencia.Estoy asumiendo una entrada sintácticamente válida.
EDITAR : Simplificó la expresión regular y la verificación de longitud.
fuente