Su tarea es tomar una secuencia de caracteres (la música) como entrada (en una función o programa) e imprimir (o devolver) la música como se vería en una caja de música.
Solo recibirá los caracteres ABCDEFG.()
como entrada, y la entrada nunca estará vacía. También puede recibir las letras en minúsculas, si lo desea.
Esta es una caja de música vacía, de longitud 3:
.......
.......
.......
Como puede ver, las líneas tienen 7 caracteres de longitud, y dado que la longitud de la caja de música es 3, tenemos 3 líneas. Solo hay .
s aquí, ya que la caja de música está vacía. ¡Pongamos algo de música!
Primero, creamos la caja de música. En este ejemplo, la entrada será CDAG.DAG
.
La longitud de CDAG.DAG
es 8, por lo que necesitamos una caja de música de longitud 8:
.......
.......
.......
.......
.......
.......
.......
.......
Luego, leemos la entrada, un carácter a la vez, y colocamos un O
en su respectiva posición.
El primer carácter es C
, y la ubicación de cada nota es equivalente a esto (agregué espacios para mayor claridad):
A B C D E F G
. . . . . . .
. . . . . . .
(and so on)
Si el carácter de entrada es un .
, entonces solo imprimimos una línea vacía.......
Entonces, el C
sería el tercer personaje a lo largo. Pongámoslo en nuestra caja de música en la parte superior:
..O....
.......
.......
.......
.......
.......
.......
.......
Repetiremos este proceso para todos los demás caracteres (el texto entre paréntesis es solo para mostrarle la nota, no debe mostrar eso):
..O.... (C)
...O... (D)
O...... (A)
......O (G)
....... (.)
...O... (D)
O...... (A)
......O (G)
Debido a cómo funcionan las cajas de música, si usamos un carácter distinto de O
, .
y <insert newline here>
, como un espacio, en nuestra salida, ¡entonces no reproducirá la música correcta!
Este es un acorde:
(ACE)
Este acorde nos está instruyendo a tocar las notas A
, C
y E
al mismo tiempo. Nunca habrá una pausa (es decir, a .
) en un acorde.
Así es como se escribiría:
O.O.O...
Y así es como podría aparecer en la música: B(ACE)D
Nunca recibirá un acorde en un acorde, es decir, esto no será válido: (AB(CD)EF)
o esto: A(B())
y el acorde no estará vacío, es decir, esto no será válido:A()B
Nunca recibirá una entrada no válida.
Ejemplos:
B(ACE)D
.O.....
O.O.O..
...O...
B
.O.....
GGABC
......O
......O
O......
.O.....
..O....
...
.......
.......
.......
A..F.C(DA).
O......
.......
.......
.....O.
.......
..O....
O..O...
.......
.(ABCDEF)
.......
OOOOOO.
Se permite el espacio en blanco final / inicial en la salida.
Como se trata de código de golf , ¡el código más corto gana!
()
dos veces (por ejemploAB(CD)E(FG)
:)?Respuestas:
Pip , 29 bytes
28 bytes de código, +1 para
-l
bandera.Toma la entrada en minúsculas como argumento de línea de comando. Pruébalo en línea!
Explicación
Aquí hay una muestra de cómo se transforma una entrada:
fuente
Python 2 ,
9594 bytes-1 byte gracias a Value Ink
Pruébalo en línea! o Pruebe todos los casos de prueba
Explicación
'@'<i
es verificar sii
es una letra, reemplazando el.
byO
en la posición correcta.'*'>i
es comprobar sii
es un paréntesis, si se tratax=i>'('
pondrá0
enx
impedir la impresión / limpieza deo
, cuandoi==')'
, pondrá1
enx
volver a habilitar la impresión / limpieza deo
.Cuando
i=='.'
nada se cambiará y'.......'
se imprimirá.El orden de caracteres está dado por su código ASCII, donde
'('<')'<'*'<'.'<'@'<'A'
fuente
['.']*7
. Tal vez sea un remanente de cuando usabas una tupla, lo que requeriría una coma. Además, podría estar equivocado, pero esto parece generar una matriz['O', '.', '.', '.', '.', '.', '.']
por línea, y no estoy seguro de si eso está permitido.Lote, 209 bytes
Funciona acumulando letras y generando la línea si el último símbolo visto no era a
(
.fuente
Röda ,
977876 bytesPruébalo en línea!
Es una función anónima que lee la entrada de la secuencia. Utilizar de esta manera:
main { f={...}; push("ABCD") | f() }
. Utiliza la expresión regular de la respuesta de ETHproductions.Sin golf:
Respuesta anterior:
Pruébalo en línea!
Funciona dividiendo la cadena dada en lugares donde la cadena siguiente solo contiene paréntesis coincidentes. Luego, para cada acorde, itera a través de posibles notas e imprime
O
si la nota es un miembro del acorde y de lo.
contrario.fuente
JavaScript (ES6),
868576 bytesGuardado 9 bytes gracias a @Neil
Explicación
Primero, hacemos coincidir lo que formará cada línea de la salida: acordes y caracteres que no son parte de un acorde. Luego, para cada línea, tomamos la cadena
ABCDEFG\n
y reemplazamos cada carácter que no sea de nueva línea con unO
si la línea lo contiene, y.
otro.fuente
s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG\n`.replace(r,c=>x.match(c)?"O":"."))
.\)
ser.
?JavaScript (ES6),
118116114 bytesCasos de prueba
Mostrar fragmento de código
fuente
Ruby,
787571 bytesDevuelve una matriz de cadenas.
Ungolfed + explicación
fuente
x.gsub(...){l=?.*7;$&.bytes{...};l+$/}
(de intercambioscan
congsub
, quitarmap
, y pasa la primera|x|
ya que se puede utilizar$&
para acceder al último partido de expresiones regulares) para guardar 3 bytes y devolver una cadena de múltiples líneas en su lugar. (También se$/
asigna a una nueva línea de forma predeterminada.)PHP, 171 bytes
Descompostura :
Pruébalo aquí!
fuente
Retina , 120 bytes
Estoy seguro de que hay espacio para jugar al golf, pero funciona ahora, así que intentaré jugarlo más tarde.
Pruébalo en línea!
Cómo funciona
Básicamente, el programa funciona cambiando cada carácter a un número y luego asignando
O
a esa posición en una línea. Se asignaABCDEFG.
a01234569
.Para generar las líneas de nota única, todo lo que debe hacerse es poner un
O
después del número correspondiente de.
s, luego rellenar la línea con 7 caracteres de longitud.Sin embargo, los acordes son un poco más difíciles de hacer. Se utiliza un proceso similar, pero los números tienen que traducirse a incrementos, es decir, la primera nota en el acorde es (lo que sea), el segundo son las posiciones X después del primero, el tercero es las posiciones Y después de eso, etc.
Código
Comience ordenando todos los caracteres dentro de los acordes.
Realice la transliteración (mapeo) de letras a números.
Reemplace todos los dígitos entre paréntesis con una representación unaria (usando
x
s), seguida de un espacio.Reemplace todos los corchetes de cierre con
m
seguido de una nueva línea. Sem
utilizará como un marcador de tipo para el próximo ciclo:Esta es una etapa de reemplazo que se repite hasta que ya no se puede reemplazar. Toma las dos últimas secuencias de
x
s antes de anm
, y resta la primera de la segunda, moviendo la partem
posterior. El marcadorm
es necesario porque tiene que realizar esta operación de derecha a izquierda.Elimina el primero
x
de cada secuencia excepto el primero.T
ransliterate reemplazandox
con.
, espacio conO
, y eliminandom
y(
.En este punto, se han creado todas las líneas para los acordes. Ahora se deben crear las líneas de nota única.
Reemplace cada dígito con esa
.
s, seguido de unaO
y una nueva línea.Rellene cada línea a la longitud 7 agregando
.
s a la derecha. Esto funciona agregando 6.
s al final de cada línea (cada línea tendrá al menos 1 otro carácter), y luego reemplaza cada carácter después de los primeros 7 en cada línea con nada. (Desde los.
mapas hasta el 9,O
se cortarán en esas líneas)fuente
Perl,
877145 + 2 (-nl
bandera) = 47 bytesUtilizando:
Pruébalo en Ideone.
fuente
Perl 5 - 78 + 1 (bandera) + 2 (Cotizaciones de entrada) = 81 Bytes
Se puede ejecutar así:
fuente
Ruby, 68 bytes
La idea es modificar la cadena
.......
cada vez que encontramos una letra, luego generarla y restablecerla, pero solo cuando estamos fuera de los corchetes.(
apaga la salida.)
y.
ambos activan / dejan la salida activada, pero este último es intrascendente ya que nunca se encontrará dentro de un soporte.Sin golf en el programa de prueba
fuente
Python 3, 94 bytes
Una función anónima
fuente
Haskell , 101 bytes
Pruébalo en línea! Uso:
p "AB.(CA)D"
. Devuelve una lista de cadenas.Explicación:
La función se
p
repite sobre la cadena. Si encuentra un corchete de apertura'('
,(x,_:t)<-span(')'<)r
divide la cadena de descansor
en las cadenasx
antes de que ocurra el corchete de cierre')'
yt
después. De lo contrario, el carácter actualx
se convierte en una cadena[x]
. En ambos casos, la función?
se llama con la cadena de notas actual y la cadena de resto.?
asigna la función#
sobre la cadena"ABCDEFG"
, donde#
reemplaza todos los caracteres que no están en la cadena actual de notas con'.'
. La línea de cuadro de música resultante se antepone a la llamada recursiva dep
la lista de descansor
.fuente
Retina 0.8.2 , 52 bytes
Pruébalo en línea! Toma entrada en minúsculas. Explicación:
Divida la música en acordes o notas, y comience a construir la salida agregando la lista de equivalentes de notas.
Para cada nota en cada acorde, cambie la salida a an
O
y elimine la nota del acorde.Elimina toda la música ahora extraña, y cambia todas las notas no coincidentes para vaciarlas.
fuente
PHP, 93 bytes
Ejecutar como tubería
-nR
o probarlo en línea .Descompostura
fuente