Introducción
El código Parsons es solo una manera simple de describir las variaciones de tono en una pieza musical, ya sea que una nota sea más alta o más baja que la anterior.
Incluso si apestas al recordar melodías, aún puedes recordar si una nota sube o baja, por lo que el código Parsons puede ayudarte a identificar una música usando un motor de búsqueda.
Descripción
Cada variación está representada por un solo carácter, que es uno de los siguientes:
R
si la nota es la misma que la anterior (significa " R epeat" )U
si la nota es más alta que la anterior (significa " U p" )D
si la nota es más baja que la anterior (significa " D propio" )
La nota inicial se escribe como *
.
Ejemplo
Aquí hay un ejemplo de código Parsons (comienzo de "Oda a la Alegría" ):
*RUURDDDDRUURDR
Realmente puedes visualizarlo , así:
*-*
/ \
* *
/ \
*-* * *-*
\ / \
* * *-*
\ /
*-*
A partir de ahora lo llamaremos contorno .
Las reglas para dibujar dichos contornos se consideran explicadas por el ejemplo anterior.
Reto
Ahora viene el verdadero desafío.
Escriba un programa que, dado un contorno como entrada, emite su código Parsons correspondiente.
No se le pide que dibuje el contorno, sino todo lo contrario.
Desde el contorno, encuentre el código original de Parsons.
Reglas
- Se aplican las reglas habituales para el golf de código.
- El programa más corto en número de bytes gana
- La entrada es un contorno y la salida debe ser un código Parsons válido.
- Los detalles sobre espacios en blanco adicionales para la entrada son irrelevantes, haga lo que sea mejor para usted
- No está permitido codificar, de una forma u otra, partes de la salida y / o el programa utilizando espacios en blanco adicionales debido a la regla anterior
Notas
- Esto puede ser útil para probar
- El código de Parsons correspondiente para
*
es*
- Una cadena vacía no es un contorno válido
- Un código de Parsons siempre comienza con
*
*
quien no hace nada?*
? No Debería imprimir*
, supongo. Agregaré este caso de la esquina.*
. Siempre.Respuestas:
Pyth -
28252725 bytes2 byes guardados gracias a @Jakube.
Pruébelo en línea aquí .
fuente
*
como entrada. La salida es*0
mientras debería ser justa*
. Apareció un cero salvaje malvado.U
yD
por cierto. De lo contrario, bien hecho.CJam, 21 bytes
Dobla las líneas (
:
) vectorizando (.
) una operación máxima de caráctere>
. Como solo hay un carácter sin espacio en cada columna, este será el resultado, ya que el espacio tiene un código ASCII más pequeño que todos los caracteres sin espacio imprimibles.Desmarque e imprima el primer asterisco
(o
, luego asigne cada otro (2%
) carácter restante paraUDR
usar la indexación modular.Solución anterior (29 bytes)
qN/
obtiene líneas de entrada.z
transpone esta matriz de caracteres.2%
cae cada fila impar.'*f#
encuentra el índice del asterisco en cada fila.0+2ew);
obtiene todos los pares de índices sucesivos.::-
calcula sus diferencias, y"RDU"f=
los asigna a las letras (a través de la indexación modular:0 → R
,2 → U
,-2 ≡ 1 → D
). El encabezado'*
antepone el asterisco.EDITAR : cambié
2ew
a0+2ew);
trabajar para evitar que CJam manejeew
(cortes sucesivos) en listas que son demasiado cortas. Esto hace que el código funcione para la cadena de entrada*
.Pruébalo aquí o míralo en acción:
fuente
:-p
*
como entrada. Me da un buenRuntimeException
lugar.[X]2ew
debería volver en[]
lugar de fallar. Sin embargo, agregaré una solución alternativa.Python 3,
1291089886 bytesProbablemente hay varias formas de jugar al golf, pero me gusta bastante que lo tengo todo en una sola línea.
Editar: ahora usando
''.translate()
Editar: Muchas gracias a wnnmaw .
Editar: cambié el formato de entrada a una matriz de cadenas en lugar de una cadena separada por una nueva línea para guardar bytes. Además, en la última edición, me confundí
U
yR
lo arreglé.La entrada debe ser una matriz de cadenas. Para el ejemplo anterior, esto se parece a:
Sin golf:
fuente
lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')
registra 105 bytes. La principal diferencia es utilizar una tupla condicional en lugar de traducirRubí, 87 bytes
Requiere espacios finales en la entrada para que todas las líneas tengan la misma longitud.
fuente
>:D
.Japt, 38 bytes
40 41 45 46 48Guardado 2 bytes gracias a @ETHproductions
Si hubiera un comando de recorte, esto sería solo 38 bytes; -; agregaré una explicación cuando termine de jugar al golf. El
:P
programa no intenta ser divertido, en realidad es el programa que ignora los personajes que no son importantes.Pruébalo en línea
fuente
x
y transponer y rotar funciones eny
yz
(dividir en líneas nuevas, usar la función de matriz, unir con líneas nuevas)Yu ?"RUD"g1+(XrS c -47 g):P
Haskell, 89 bytes
Ejemplo de uso:
Transponga la entrada y reemplace los caracteres
/
/-
/\
con cadenas simples"U"
/"R"
/"D"
. Todos los demás caracteres se reemplazan por cadenas vacías""
, que luego desaparecen al concatenar todo. Finalmente, anteponga el asterisco*
.fuente
Mathematica, 103 bytes
En resumen, considerando que este es un desafío de procesamiento de cadenas.
fuente
JavaScript (ES6) 90
Una función anónima. Escanea la cadena de entrada char por char, teniendo en cuenta la posición en la línea actual. Al hacer esto, se construye una matriz de salida subsituting
U D R
para/ \ -
en el lugar correctofuente
Matlab, 62 bytes
Esto requiere que la entrada sea rectangular (el mismo número de caracteres en cada fila). P.ej
Explicación
fuente