fundo
Aqui está um desafio relacionado ao Halloween.
Como você deve ter visto no meu último desafio , gosto bastante do que chamo de animações de arte ascii, que não é apenas desenhar um padrão, mas sim um padrão que progride. Essa idéia veio à minha mente depois que me pediram, há alguns anos, para animar uma apresentação (bastante chata), fazendo morcegos ascii aleatórios voarem pela tela no Halloween. Escusado será dizer que eu estava devidamente obrigado (eu estava sendo pago por isso), mas isso me fez pensar que há mais na vida do que morcegos aleatórios. Inspirado por isso, gostaria de propor este desafio.
Desafio
Faça um morcego voar ao redor da lua.
Aqui está um morcego:
^o^
Aqui está a lua:
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Você deve mostrar todas as etapas do voo dos morcegos (consulte a saída).
Entrada
Nenhum
Saída
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm^o^
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm^o^
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm^o^
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm^o^
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
^o^mmm
mmm
mmmmmmm
mmmmmmmmm
^o^mmmmmmm
mmm
mmm
mmmmmmm
^o^mmmmmmmmm
mmmmmmm
mmm
mmm
^o^mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Regras
- Nenhuma leitura de arquivos ou sites externos
- Você pode enviar um programa completo ou uma função
- Espaços extras e / ou novas linhas são ótimos para mim
- Falhas padrão banidas como de costume
- O morcego deve terminar de volta ao topo da lua
- Sinta-se à vontade para limpar a tela entre os quadros, se desejar, porém isso não é um requisito. A saída mostrada acima é boa
- Como se trata de código de golfe, o vencedor será a resposta com a menor contagem de bytes, embora qualquer resposta seja bem-vinda
Amostra
Implementação de referência em Python 2 totalmente não-destruído (620 bytes, mas apenas para provar que isso pode ser feito. Pode jogar mais tarde).
b='^o^'
m=[' ',
' mmm ',
' mmmmmmm ',
' mmmmmmmmm ',
' mmmmmmm ',
' mmm ',
' ']
p=[(9,12),(12,15),(14,17),(15,18),(14,17),(12,15),(9,12),(6,9),(4,7),(3,6),(4,7),(6,9),(9,12)]
d=0
for z in range(7):
x=map(str,m[z])
c="".join(x[:p[z][0]]) + b + "".join(x[p[z][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
for z in range(6)[::-1]:
x=map(str,m[z])
c="".join(x[:p[z+6][0]]) + b + "".join(x[p[z+6][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
Resultado
Embora @ Jonathan, obviamente, vença em contagem de bytes com Jelly, vou marcar a resposta Brainfuck de @Oyarsa como a resposta aceita apenas porque acho que qualquer pessoa que possa realmente fazer algo assim em um idioma tão louco merece +15 representantes, independentemente de quantos bytes são necessários. Isso não é porque eu tenha algum problema com os idiomas do golfe. Veja minha resposta a uma pergunta sobre isso no meta, se você tiver alguma dúvida. Muito obrigado e respeito a todos que contribuíram em qualquer idioma.
Respostas:
Brainfuck, 690 bytes
Esta é minha primeira vez jogando golfe, então tenho certeza de que ainda há muito espaço para melhorias
Experimente online
Ungolfed alguns para legibilidade:
Eu queria usar o fato de que, adicionando uma nova linha ao início, cada estágio pode ser lido nas duas direções para obter dois estágios diferentes, mas não consegui encontrar uma boa maneira de fazer isso sem gerar os seis estágios e meio completos de uma vez só.
fonte
05AB1E ,
696260 bytesEconomizou 2 bytes graças a Adnan .
Experimente online!
Explicação
3ð×…^o^)U
armazena a lista[" ","^o^"]
em X para uso posterior.13FNV
faz um loop nos 13 estágios [0 .. 12] e armazena o índice de iteração atual em Y .0379730v
circula as linhas de cada estágio,onde N é o índice da linha e y é o número atual de m .
Começamos adicionando
floor(5/(y+1))-(y==0)
espaços a cada linha comð5y>;ï-y_+×
.Em seguida, determinamos se deve haver um bastão ou 3 espaços antes dos m's .
Se
(-N-Y)%12 == 0
for verdade, adicionamos um morcego, mais 3 espaços.Esta expressão (
N(Y-12%_Xè
) colocará morcegos em etapas0,6-12
.Então colocamos y 's com
'my×
.Agora, determinamos se deve haver um bastão ou três espaços após os m's .
O código
NY-12%_y&Xè
colocará um bastão, se((N-Y)%12 == 0) and y!=0
for verdadeiro, mais 3 espaços.Isso colocará os morcegos nos palcos
1-5
.Finalmente, junte-se a linha inteira em uma string e imprimir com uma nova linha:
J,
.fonte
3ð×…^o^)
em vez de" ^o^"2ä
deve salvar dois bytes.3ð×
.JavaScript (ES6),
109144140138 bytesVersão animada
Mostrar snippet de código
fonte
HTML + JS,
153149 bytesEditar: salvou um monte de bytes graças a @RickHitchcock. A versão chata que apenas retorna as 13 seqüências multilinhas em uma matriz é
132131 bytes:fonte
setInterval
, que é sempre o mesmo no meu navegador, mas pode variar para outros navegadores.innerHTML
vez detextContent
. E outro byte, alterandorepeat(+c)
pararepeat(c)
.1000
pode se tornar1e3
.)Geléia ,
76 6958 bytesTryItOnline
Quão?
fonte
Python 2,
146 144138 bytes-2 bytes graças a @Willem (use a variável
c
vez de repetir amap
)repl.it
'6643466'
é o número de espaços antes da lua (com 6 na primeira e na última linhas vazias, já que o morcego vai para lá).'0379730'
é o número de'm'
s na lua em cada linha.O
zip
descompacta esses personagens ema
eb
e faz a lua no céu,m
, com 3 espaços à direita em cada linha.A última linha percorre as posições do morcego dentro da lua e é efetivamente:
mas a tupla de posições é codificada como ordinais de caracteres imprimíveis, com 23 adicionados (já que 9 não é imprimível). Isso sai como
" -;L[hrbQ@2' "
ec=ord(b)-23
é usado para extrair os valores.fonte
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Autovim ,
8581 bytesNenhuma animação, provavelmente ainda jogável ... Ainda assim, nada mal para o garoto novo do quarteirão! (autovim)
Para executá-lo:
Explicação
Em resumo, desenhamos a lua, copiamos e colamos 12 vezes e usamos duas macros: uma para acrescentar o morcego nas primeiras 7 luas e a outra para acrescentar as últimas 6.
fonte
PHP, 167 bytes
Eu fiz um pequeno programa em PHP:
Aqui está uma versão mais detalhada:
Este é o meu primeiro codegolf, se você tiver alguma sugestão, fico feliz em ouvir :)
fonte
Python 2, 112 bytes
Imprima a imagem. Cada linha tem três partes
m
's para a luaEssas peças são concatenadas e centralizadas em uma caixa de tamanho 15 para espaçamento. Para evitar que os morcegos mudem de centro, um morcego ausente tem três espaços, o mesmo comprimento. Para morcegos em cima ou abaixo da lua, o slot da barra esquerda é omitido e o slot direito é ocupado.
Existem 91 linhas: uma imagem de 7 linhas para cada uma das 13 fotos. Estes são contados via divmod: como
k
conta de0
até91
,(k/7, k%7)
vaiTomando o primeiro valor
k/7
para ser a imagem e o segundo valorr=k%7
como o número da linha na figura, isso conta primeiro pela figura e depois pelo número da linha em cada figura, ambos indexados em 0.O número de
m
's na lua muda com o número da linhar=k%7
como[0,3,7,9,7,3,0]
. Em vez de indexar isso, uma fórmula era mais curta. Um grau conveniente de liberdade é que os valores0
podem ter qualquer valor negativo, pois isso ainda fornece a cadeia vazia quando multiplicada porm
. Brincar com uma parábola e dividir o chão deu uma fórmular*(6-r)*8/5-5
.Agora, analisamos a escolha de desenhar um morcego ou um espaço vazio em ambos os lados. A matriz
b=[' ','^o^']
contém as opções.O taco na linha 0 aparece na figura 0 (na parte superior), na linha 1 na figura 1 (à direita) e na linha 6 na figura 6 (na parte superior). Portanto, é fácil verificar se aparece como o número da linha e da imagem como sendo igual,
k/7==r
,. Mas também precisamos da figura 12 para se parecer com a figura 0, então pegamos o número da figura módulo 12 primeiro.À esquerda é semelhante. O morcego aparece à esquerda em linhas
r=5,4,3,2,1
nas imagens7,8,9,10,11
. Portanto, verificamos se o número da linha e da imagem é igual a 12. Também asseguramos não desenhar nada em vez de três espaços nas linhas0
e6
- o slot do bastão certo irá desenhar o bastão e não devemos estragar sua centralização.fonte
C #,
615582337 bytesEsta é a minha primeira tentativa (ainda muito legível) de uma delas, por isso ficarei feliz em receber sugestões para cortar algumas centenas de bytes! No topo da minha lista, no momento, há uma maneira mais curta de criar a matriz da lua.
Ungolfed (inclui loop!)
Editar:
Retirou 21 bytes removendo espaços à direita na declaração da matriz. Em vez de uma grade com 15 caracteres de largura, cada linha é larga o suficiente para caber o bastão. Foram removidos outros 12 para a sequência desnecessária [] args em
Main()
declaração.Edição 2:
Reescreva a maior parte da lógica, eliminando 245 bytes! Inclui alterações sugeridas nos comentários. Obrigado!
A partir dos comentários, transformou isso em uma função em
M()
vez doMain()
método anterior - agora, isso precisa ser chamado externamente.fonte
new string[]
dem
e apenas colocandostring[]m={...}
.var
s em lugares comostring[]w=(string[])m.Clone();
-var w=(strin[])m.Clone();
Python 2,
299300290270 bytesJogou até 270, ganhando um pouco mais de experiência no golfe.
Implementação de referência desenvolvida por
321320330 bytes. Não é bonito ou elegante. Apenas usa seqüência de força bruta e fatiamento de lista. Foi divertido diminuir a contagem de bytes, mas acho que a abordagem estava completamente errada para um concorrente sério.Não espero que esta resposta seja levada a sério, por isso não há votos negativos. Eu disse na pergunta que tentaria jogar golfe na implementação de referência e é exatamente isso. Apenas postado por diversão.
Experimente online!
fonte
Ruby,
164156 bytesPrograma muito simples. Pode ser trabalhado em mais. Por favor, deixe dicas nos comentários.
fonte
base64
andzlib
libraries in the shortest way possible, and add them to the byte count?puts
andsay
? I'm not familiar with Ruby.///, 205 bytes
Try it online!
Only if I didn't need tons of trailing spaces...
fonte
Mumps, 223 Bytes
This is using InterSystems Cache Mumps -- it allows braces around loops which make it handy for nested loops in a single line.
Could probably be golfed more, and I may play with that when I have more time. Add another 9 bytes, and it'll be animated [[ due to the addition of the 'H 1 W # ' --> that halts for a second and clears the screen:
Here's an ungolfed / explained version (of the animation version), with the correct 'do' statements and dot loops:
I tried to do the "compress then Base-64 encode" jazz just to see what would happen, but the encoded string ended up a little longer than the program itself! That, and Cache's system calls for the compression and base64 encoding are quite long... for example, here's the system call to decode base64: $System.Encryption.Base64Decode(STRING)
That method would 'bloat' the program to over 300 characters, I think...
fonte