Como todos sabemos, la serie Zelda es una de las mejores series de juegos jamás hechas. En honor a eso, toquemos algunas canciones en la ocarina.
Reto:
Escriba un programa que, dada una canción, genere la partitura para stdout para esa canción en particular.
Entrada:
La canción de la que tendrá que emitir el puntaje será dada por una combinación única de tres caracteres como se ve a continuación:
zel - Zelda's Lullaby
sas - Saria's Song
eps - Epona's Song
sos - Sun's Song
sot - Song of Time
sst - Song of Storms
Canciones extra, -7% cada una:
mof - Minuet of Forest
bof - Bolero of Fire
sow - Serenade of Water
nos - Nocturne of Shadow
ros - Requiem of Spirit
pol - Prelude of Light
Bonus song 2, -8%:
scs - Scarecrow's song
Como todos sabemos, la canción del Espantapájaros es una canción que compones tú mismo. Esta canción necesita tener ocho notas. Produzca un puntaje que componga usted mismo que sea diferente de todos los otros puntajes.
Si decide incluir todas las canciones, totalizará un bono de -50% a su puntuación de bytes.
Salida:
Las notas en la salida están simbolizadas por los siguientes caracteres:
^
<
>
V
A
Salida de una puntuación en el siguiente formato:
-^-^-^-^-^-^-^-^-
-<-<-<-<-<-<-<-<-
->->->->->->->->-
-V-V-V-V-V-V-V-V-
-A-A-A-A-A-A-A-A-
Solo se permite una nota por columna. Por simplicidad, he agregado otra fila a las cuatro filas originales.
Cada nota corresponde a una fila diferente:
^: ----------------
<: ----------------
>: ----------------
V: ----------------
A: ----------------
La salida se escribirá en stdout. Se permiten nuevas líneas al final.
Ejemplos:
Entrada (Canción de cuna de Zelda):
zel
Salida:
---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------
Entrada (Bolero de fuego):
bof
Salida:
-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------
Nota hoja de trucos:
zel
<^><^>
sas
V><V><
eps
^<>^<>
sos
>V^>V^
sot
>AV>AV
sst
AV^AV^
mof
A^<><>
bof
VAVA>V>V
sow
AV>><
nos
<>>A<>V
ros
AVA>VA
pol
^>^><^
Como jugamos al golf de código ocarina , ¡gana el programa más corto en bytes!
Referencias de canciones:
http://www.thonky.com/ocarina-of-time/ocarina-songs
http://www.zeldadungeon.net/Zelda05-ocarina-of-time-ocarina-songs.php
v
verían mejor.Respuestas:
Pyth, 56.5 (113 bytes - 6 × 7% - 8%)
Contiene caracteres no imprimibles, así que aquí hay un
xxd
hexdump reversible :También puedes probarlo en línea .
Explicación
Almaceno las canciones en números de base 6, vuelvo a codificar en base 1391423 y luego en base 256 para ahorrar espacio. Tuve que elegir la base 6 ya que algunas de las canciones comienzan con
^
, y los números realmente no pueden comenzar con un 0 después de la decodificación.fuente
Funciton , 4322 - 50% = 2161
Realmente no estoy tratando de jugar golf aquí. Yendo más por el ángulo de belleza. Creo que el programa principal se ve muy bien, una caja rectangular perfecta escondida a la derecha.
Como siempre, puede obtener una mejor representación al ejecutar
$('pre').css('line-height',1)
en la consola de su navegador.Continuando con la tradición de dar nombres a las funciones de Funciton que consisten en un solo personaje Unicode extraño, rara vez utilizado, pensé en lo que podría representar mejor este desafío, y se me ocurrió que Link y Zelda (o, si lo desea, Legend of Zelda ) le da LZ , por lo que el dígrafo en minúscula ʫ (U + 02AB, ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ ᴅɪɢʀᴀᴘʜ) parece apropiado.
Explicación
Como se explica en el artículo de esolangs, el programa Funciton recibe la entrada codificada como lo que yo llamaría "UTF-21", pero como un entero entero enorme. Si quisiera usar este número como clave para un hashmap (diccionario, matriz asociativa), necesitaría una función hash que satisfaga dos criterios: uno, es lo suficientemente simple de implementar en Funciton, y dos, los 13 esperados Las cadenas de entrada dan un valor hash diferente. La función hash más simple que se me ocurrió fue
input % m
por algún valorm
. Por lo tanto, intentém
= 13, 14, 15, etc. hasta que llegué al número entero más pequeño para el cual todos los valores hash son únicos. Resulta que este número es 25.Los valores hash son:
Codificamos cada canción haciendo que un bit represente la presencia o ausencia de una nota. Por ejemplo, la canción de cuna de Zelda se codificaría de la siguiente manera:
excepto que los bits están en el orden opuesto; la celda superior izquierda está en el bit menos significativo. Esto significa que cada canción tiene 40 bits de longitud.
Por lo tanto, creamos una tabla hash (moderadamente escasa) tomando un número de 40 × 25 = 1000 bits y colocando el patrón de bits para cada canción en el lugar correcto de acuerdo con su valor hash. El número monstruoso en el programa es exactamente esta tabla hash.
Esto es lo que significa cada uno de los números restantes:
45
=0x2D
es el Unicode para-
.1257283645609482190214660190
: Esta es la cadena^<>VA
en UTF-21. En retrospectiva, podría haber usado 7 bits por personaje aquí, acortando el número, pero UTF-21 es tan tradicional en Funciton que simplemente no se me ocurrió.2097151
=0x1FFFFF
= (1 << 21) - 1. Se utiliza para obtener el primer carácter de la cadena anterior.20971565
: Esta es la cadena-\n
, que se agrega al final de cada línea.\n
ser 10. Es el último número (10 << 21) + 45.El programa ahora procede de la siguiente manera:
ʫ
con los siguientes 3 parámetros:^<>VA
.ʫ
,-
, seguido de otro-
si es cero o el primer carácter de c de lo contrario. Desplazar a la derecha B por uno para eliminar un bit y disminuir a .-\n
, luego corta el primer carácter de c y comienza otro ciclo con a = 8.fuente
Python 2, 143.5 (287 bytes - 50%)
La cuadrícula se genera con guiones; luego indexado y reemplazado con notas.
fuente
j
reemplazando cada coma con un espacio y llamandosplit
sin argumentosrange
. Lamentablemente, no puedes simplemente multiplicar la lista interna por 5 porque todos son el mismo objeto y cambiar uno cambia los otros: / ¡Pero vencimos a Perl (por ahora)!"<^><^>"
=>"<^>"*2
?scs="<"*8
No me gusta tu canción de Scarecrow.Perl 5, 125 (
320260250 Bytes -6x7 canciones% de bonificación -8% canción espantapájaros)Yay, finalmente, una oportunidad para experimentar con esa sintaxis de hash Perlish.
Prueba
fuente
qw()
sintaxis en lugar de las comas gruesas (%h=qw(zel <^><^> sas >'V><' ...)
para guardar algunos bytes@L
se puede escribir de manera más sucinta como@L=('-')x17
. Además, el hash principal se puede dejar anónimo como@B={qw(zel <^><^> ... scs <^V>>V^<)}->{$_}=~/./g
.Perl, 75 (150 bytes - 50%)
Contando el shebang como 2, la entrada se toma de stdin.
Uso de la muestra
fuente
Haskell, 344 - 50% = 172 bytes
o
hace el trabajo.Pensé que podría vencer a Python usando estas codificaciones (me tomó mucho tiempo ._.), Pero no. Realmente no guardan muchos bytes todavía. ¿Alguna sugerencia?
Sí, eso es un signo negativo delante de la codificación de
"ros"
. Eso es porque su 'hoja' termina con el carácter que significa0
en mi base-5, porque este truco negativo no funcionaría para las 'canciones fáciles' codificadas al duplicar lo que está codificados
. A menos que usequot
tal vez, pero luego no puede manejarlop (-1)
especialmente, yaquot (-5) = 0
que la negatividad se desvanecería. Lo que sea.fuente
PHP: 130 bytes (260
270279bytes - 6 × 7% - 8%)¡Gracias a Ismael Miguel y Blackhole por algunas ideas geniales para ahorrar más bytes!
Después de
print"-
esto, esta es una inserción literal de un retorno de carro. Puede traducirse a dos bytes en Windows.Se incluyen todas las canciones de bonificación, incluida la canción del Espantapájaros.
Cada canción está representada en siete bytes de código. ¡Me gusta el nuevo puntaje porque con el viejo puntaje habría ganado solo un magro punto de bonificación en general!
Las ediciones recientes hacen que PHP genere muchas advertencias, por lo que para mantener las cosas bonitas y ordenadas, se desvían a ellas
/dev/null
.Guardar como
zelda.php
y ejecutar en la línea de comando:fuente
main.php
"?()
torno($i-$c)
enecho($i-$c)?'--':'-'.$z[$c-0];
. Además, su cadena dentro de susplit
se puede usar sin'
. Y'/^'.$argv[1].'/'
puede ser escrito como"/^$argv[1]/"
Python 3 - 138.5 (
292280277 bytes - 50%)Limité algunos bytes del líder actual de Python mientras hacía el método de imprimir sobre la marcha en lugar del método de reemplazo.
Probar en línea
Correr:
Salida:
fuente
['--',c+'-'][s[x]==c]
lugar del condicionalRubí, rev. 1, 192 - 50% = 96
El golf incluye:
eliminación de espacios en blanco entre grupos de letras en la cadena mágica (y revisión del denominador al final de la línea para
/4
). Eliminación de algún otro espacio en blanco innecesario.conversión de las secuencias de escape en caracteres individuales (el intercambio de pila no las mostrará, por lo que he puesto
?
como marcador de posición)redefinición de
g
como una sola cadena que contiene cinco corridas de 17-
seguidas de nuevas líneas, en lugar de una matriz de cinco cadenas de 17-
Ruby, rev 0, 223 - 50% = 111.5 (sin golf)
El código de entrada se reduce a 2 letras. Si comienza con un
s
,s
se elimina, si comienza con una letra despuéss
(solo se aplica azel
la última letra eliminada, y si comienza con una letra antes de ques
se elimine la letra del medio).La cadena mágica (que en la versión sin golf contiene espacios para mayor claridad) contiene los códigos de 2 letras seguidos de los datos de la música. Se busca utilizando el operador de coincidencia
=~
que devuelve la posición en la cadena.Hay exactamente una canción de 5, 7 y 8 notas (más scs que también tiene 8 notas). Estas, junto con una canción arbitraria de 6 notas,
ros
se agrupan al comienzo de la cuerda mágica para que el valor den
dado por la posición en la cuerda se puede usar para calcular la cantidad de notas que se tocarán.cs
se aprieta antesbf
, y con el truncamiento cuando el númeron
se redondea hacia abajo, nos salimos con el cálculo correcto para ambos. Después del cuarto grupo, todas las canciones tienen 6 notas, por lo que sin
es grande, el número de notas se reduce a un valor predeterminado de 6.Se
-
configura una matriz de salida y las notas se sustituyen una por una. Los datos de música requeridos se extraen de la variable$'
que contiene la parte de la cadena mágica original a la derecha del partido. De esta manera, los datos irrelevantes se ignoran.Las notas se codifican 3 a la vez en la cadena mágica, justo después del código de la canción de 2 letras correspondiente. Se extraen con división por
5**(i%3)
yg
se actualiza un carácter en consecuencia. Al final del programag
se imprime.fuente
Python 2, 141.5 Bytes -50% (283 Bytes)
Almacena cada nota como un byte ya que cada línea tiene 8 notas de largo. Recupera la representación binaria y luego la reemplaza con los caracteres correctos.
fuente
Lua, 249 bytes - 50% = 124.5
Bastante simple, solo lee canciones codificadas como números de base 6.
fuente