Como todos sabemos, a série Zelda é uma das melhores séries de jogos já feitas. Em homenagem a isso, vamos tocar algumas músicas na ocarina.
Desafio:
Escreva um programa que, dada uma música, produza a pontuação stdout para essa música em particular.
Entrada:
A música da qual você terá que produzir a partitura será apresentada por uma combinação única de três caracteres, como mostrado abaixo:
zel - Zelda's Lullaby
sas - Saria's Song
eps - Epona's Song
sos - Sun's Song
sot - Song of Time
sst - Song of Storms
Músicas bônus, -7% cada:
mof - Minuet of Forest
bof - Bolero of Fire
sow - Serenade of Water
nos - Nocturne of Shadow
ros - Requiem of Spirit
pol - Prelude of Light
Música bônus 2, -8%:
scs - Scarecrow's song
Como todos sabemos, a música do Espantalho é uma música que você se compõe. Essa música precisa ter oito notas. Crie uma pontuação que você compõe, diferente de todas as outras.
Se você decidir incluir todas as músicas, isso totalizará um bônus de -50% na sua pontuação de bytes.
Saída:
As notas na saída são simbolizadas pelos seguintes caracteres:
^
<
>
V
A
Crie uma pontuação no seguinte formato:
-^-^-^-^-^-^-^-^-
-<-<-<-<-<-<-<-<-
->->->->->->->->-
-V-V-V-V-V-V-V-V-
-A-A-A-A-A-A-A-A-
Apenas uma nota por coluna é permitida. Por uma questão de simplicidade, adicionei outra linha às quatro linhas originais.
Cada nota corresponde a uma linha diferente:
^: ----------------
<: ----------------
>: ----------------
V: ----------------
A: ----------------
A saída deve ser gravada em stdout. Novas linhas à direita são permitidas.
Exemplos:
Entrada (Canção de ninar de Zelda):
zel
Saída:
---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------
Entrada (Bolero de Fogo):
bof
Saída:
-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------
Nota cábula:
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 jogamos o código ocarina golf, o programa mais curto em bytes vence!
Referências de músicas:
http://www.thonky.com/ocarina-of-time/ocarina-songs
http://www.zeldadungeon.net/Zelda05-ocarina-of-time-ocarina-songs.php
v
ficaria melhor.Respostas:
Pitão, 56,5 (113 bytes - 6 × 7% - 8%)
Ele contém caracteres não imprimíveis, então aqui está um
xxd
hexdump reversível :Você também pode experimentá-lo online .
Explicação
Eu guardo as músicas em números de base 6, recodificadas para a base 1391423 e depois a base 256 para economizar espaço. Eu tive que escolher a base 6, já que algumas músicas começam
^
, e os números não podem realmente começar com um 0 após a decodificação.fonte
Função , 4322 - 50% = 2161
Não estou realmente tentando jogar golfe aqui. Indo mais pelo ângulo da beleza. Eu acho que o programa principal parece realmente limpo, uma caixa retangular perfeita escondida à direita.
Como sempre, você pode obter uma melhor renderização executando
$('pre').css('line-height',1)
no console do navegador.Continuando na tradição de atribuir nomes de funções ao Funciton que consistem em um único caractere Unicode estranho, raramente usado, pensei no que poderia representar melhor esse desafio, e me ocorreu que Link e Zelda (ou, se você quiser, Legend of Zelda ) fornece LZ , então o dígrafo em minúsculas ʫ (U + 02AB, ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ ᴅɪɢʀᴀᴘʜ) parece apropriado.
Explicação
Conforme explicado no artigo da esolangs, o programa Funciton recebe a entrada codificada como o que eu chamaria de "UTF-21", mas como um único número inteiro humongo. Se eu quisesse usar esse número como chave para um hashmap (dicionário, matriz associativa), precisaria de uma função hash que atenda a dois critérios: um, é simples de implementar no Funciton e dois, todos os 13 esperados seqüências de entrada fornecem um valor de hash diferente. A função hash mais simples que eu conseguia pensar era
input % m
com algum valorm
. Portanto, tenteim
= 13, 14, 15 etc. até chegar ao menor número inteiro para o qual todos os valores de hash são exclusivos. Acontece que esse número é 25.Os valores de hash são:
Codificamos cada música fazendo com que um bit represente a presença ou ausência de uma nota. Por exemplo, a canção de ninar de Zelda seria codificada da seguinte maneira:
exceto que os bits estão na ordem oposta; a célula superior esquerda está no bit menos significativo. Isso significa que cada música tem 40 bits.
Assim, criamos uma tabela de hash (moderadamente esparsa) pegando um número de 40 × 25 = 1000 bits e colocando o padrão de bits para cada música no lugar certo, de acordo com seu valor de hash. O número monstruoso no programa é exatamente essa tabela de hash.
Aqui está o que cada um dos números restantes significa:
45
=0x2D
é o Unicode para-
.1257283645609482190214660190
: Esta é a string^<>VA
em UTF-21. Em retrospectiva, eu poderia ter usado 7 bits por caractere aqui, diminuindo o número, mas o UTF-21 é tão profundamente tradicional no Funciton que simplesmente não me ocorreu.2097151
=0x1FFFFF
= (1 << 21) - 1. Usado para obter o primeiro caractere da string acima.20971565
: Esta é a string-\n
, que é anexada ao final de cada linha.\n
é 10. Esse último número é (10 << 21) + 45.O programa agora segue o seguinte:
ʫ
com os 3 parâmetros a seguir:^<>VA
.ʫ
,-
, seguida por outra-
se for zero ou o primeiro caractere de c, caso contrário. Desloque B para a direita um para remover um bit e diminua a .-\n
e retire o primeiro caractere de c e inicie outro loop com a = 8.fonte
Python 2, 143,5 (287 bytes - 50%)
A grade é gerada com traços; depois indexados e substituídos por notas.
fonte
j
substituindo cada vírgula com um espaço e chamandosplit
sem argumentosrange
. Infelizmente você não pode simplesmente multiplicar a lista interna por 5, porque eles são todos o mesmo objeto e mudar um altera os outros: / Nós vencemos o perl (por enquanto)!"<^><^>"
=>"<^>"*2
?scs="<"*8
Eu não gosto da sua música do espantalho.Perl 5, 125 (
320260250 Bytes -6x7% em músicas bônus -8% em músicas de espantalho)Bem, finalmente, uma oportunidade de experimentar essa sintaxe de hash Perlish.
Teste
fonte
qw()
sintaxe em vez das vírgulas de gordura (%h=qw(zel <^><^> sas >'V><' ...)
para salvar alguns bytes@L
pode ser escrito de forma mais sucinta como@L=('-')x17
. Além disso, o hash principal pode ser deixado anônimo como@B={qw(zel <^><^> ... scs <^V>>V^<)}->{$_}=~/./g
.Perl, 75 (150 bytes - 50%)
Contando o shebang como 2, a entrada é obtida de stdin.
Uso da amostra
fonte
Haskell, 344 - 50% = 172 bytes
o
faz o trabalho.Pensei que poderia vencer o Python usando essas codificações (demorei muito tempo ._.), Mas não. Eles ainda não salvam muitos bytes ainda. Alguma sugestão?
Sim, isso é um sinal de menos na frente da codificação para
"ros"
. Isso porque sua 'folha' termina com o caractere que significa0
na minha base 5, porque esse truque negativo não funcionaria para as 'músicas fáceis' codificadas dobrando o que está codificados
. A menos que você usequot
, talvez, mas então você não pode lidarp (-1)
especialmente, poisquot (-5) = 0
a negatividade desaparecerá. Tanto faz.fonte
PHP: 130 bytes (260
270279bytes - 6 × 7% - 8%)Obrigado a Ismael Miguel e Blackhole por algumas ótimas idéias para economizar mais bytes!
Após o
print"-
, esta é uma inserção literal de um retorno de carro. Pode traduzir para dois bytes no Windows.Todas as músicas bônus, incluindo a música do Espantalho, estão incluídas.
Cada música é representada em sete bytes de código. Eu gosto da nova pontuação, porque com a pontuação antiga eu teria ganho apenas um ponto de bônus escasso no geral!
As edições recentes fazem com que o PHP gere muitos avisos; portanto, para manter as coisas organizadas, essas são desviadas
/dev/null
.Salve como
zelda.php
e execute na linha de comando:fonte
main.php
"?()
andar($i-$c)
por aíecho($i-$c)?'--':'-'.$z[$c-0];
. Além disso, sua corda dentro da suasplit
pode ser usada sem'
. E'/^'.$argv[1].'/'
pode ser escrito como"/^$argv[1]/"
Python 3 - 138,5 (
292280277 bytes - 50%)Raspou alguns bytes do líder atual do Python enquanto fazia o método de impressão conforme o uso, em vez do método de substituição.
Experimente on-line
Corre:
Saída:
fonte
['--',c+'-'][s[x]==c]
em vez do condicionalRuby, rev. 1, 192 - 50% = 96
Golfe inclui:
remoção de espaço em branco entre grupos de letras na sequência mágica (e revisão do denominador no final da linha para
/4
.) Remoção de outros espaços em branco desnecessários.conversão das seqüências de escape em caracteres únicos (a troca de pilhas não os exibirá, então eu coloquei
?
como espaço reservado)redefinição de
g
como uma única sequência contendo cinco execuções de 17-
seguidas por novas linhas, em vez de uma matriz de cinco seqüências de 17-
Ruby, rev. 0, 223 - 50% = 111,5 (não destruído)
O código de entrada é reduzido para 2 letras. Se começar com um
s
, os
será excluído, se iniciar com uma letra depoiss
(somente aplicável àzel
última letra será excluída e se iniciar com uma letra antess
da exclusão da letra do meio.A seqüência mágica (que na versão não destruída contém espaços para maior clareza) contém os códigos de 2 letras seguidos pelos dados da música. Ele é pesquisado usando o operador match,
=~
que retorna a posição na string.Há exatamente uma música, cada uma com 5, 7 e 8 notas (mais scs que também possui 8 notas). Estas, juntamente com uma música arbitrária de 6 notas,
ros
são agrupadas no início da sequência mágica, de modo que o valorn
dado por a posição na corda pode ser usada para calcular o número de notas para tocar.cs
é espremido antesbf
e, com o truncamento quando o númeron
é arredondado para baixo, apenas obtemos o cálculo correto para ambos. Após o quarto cluster, todas as músicas têm 6 notas; portanto, sen
for grande, o número de notas será reduzido para o padrão 6.Uma matriz de
-
é configurada para saída e as notas são substituídas uma a uma. Os dados musicais necessários são extraídos da variável$'
que contém a parte da sequência mágica original à direita da partida. Dessa maneira, dados irrelevantes são ignorados.As notas são codificadas 3 de cada vez na sequência mágica, logo após o código da música relevante de duas letras. Eles são extraídos com divisão por
5**(i%3)
e um caractereg
é atualizado de acordo. No final do programag
é impresso.fonte
Python 2, 141,5 bytes -50% (283 bytes)
Armazena cada nota como um byte, pois cada linha possui 8 notas. Recupera a representação binária e substitui pelos caracteres corretos.
fonte
Lua, 249 bytes - 50% = 124,5
Muito simples, apenas lê as músicas codificadas como números base-6.
fonte