Contexto
É dia dos namorados. O único que você já amou deixou você ontem para esse cara que ela sempre achou "estúpido e desinteressante" . No caminho para casa, você ficou preso no trânsito, ouvindo músicas antigas no rádio, a chuva batendo no pára-brisa está balançando você. Depois de um tempo em seu carro, você se vê sozinho em seu pequeno apartamento, incapaz de pensar em outra coisa além dela. Não há luz e você olha através da janela, deixando a escuridão o cercar. Não há com quem conversar, seus amigos já se foram há muito tempo depois de avisá-lo sobre essa nova garota assombrando sua mente. Você inicia o computador, pois é a única coisa que pode fazer, abre o navegador e publica um novo quebra-cabeça de programação para o stackexchange, na tentativa de mudar de idéia.
Desafio
Escreva um programa no idioma de sua escolha simulando a chuva que cai no chão. A saída pode ser composta por caracteres ASCII ou renderizados em 2D / 3D. A câmera está fixa: você está olhando diretamente para o chão. Seu programa deve incluir algum tipo de animação, como atualizar o console ou a página toda vez que você gerar um novo "quadro". Tem que ser realista, eu sei que é um pouco subjetivo, mas digamos que você não pode simplesmente preencher todo o terreno em apenas uma grande gota.
A saída não precisa ser uma imagem, mas se você estiver usando uma linguagem enigmática, é melhor fornecer um .gif para ilustrar como fica em ação (mas, é claro, isso não afetará sua pontuação, se você não o fizer).
Regras
- Sua pontuação é o total de bytes usados
- -20 pontos se você usar cores
- -50 se conseguir render algum tipo de vento
- Menor pontuação ganha
Exemplo
Um exemplo muito básico do que deve ser renderizado:
Espero que você faça melhor e aproveite esse desafio.
Desculpe meu inglês, sinta-se à vontade para editar minha postagem, se você quiser corrigir alguns erros
Entre os melhores
Se o seu nome não estiver listado, é porque sua tentativa foi considerada não adequada às regras.
Tobia - APL - 35
j6m8 - Processing.js - 38
The Guy with The Hat - Processing - 42
ace - Processing - 74
kelunik - JS/CSS - 89
Riot - Bash - 91
Michael - JS/jQuery - 105
Florent - HTML/JS - 123
David Carraher - Mathematica - 134
Doorknob - HTML/JS - 150
undergroundmonorail - Python - 175
Parabéns a Tobia!
Respostas:
APL, 105 caracteres / bytes * - 20 - 50 = 35 pontos
*: A maioria das implementações de APL suporta alguma forma de conjunto de caracteres de byte único (legado), que mapeia os símbolos da APL para os valores superiores de 128 bytes. Portanto, para fins de golfe, um programa que usa apenas caracteres ASCII e símbolos APL pode ser pontuado como chars = bytes.
Eu testei no apl.js mais recente do Nick no Node.js em um terminal do OS X. Mas eu não usei nada específico para o dialeto dele, portanto, ele deve funcionar em qualquer APL moderno que possa ser executado em um terminal ANSI e ofereça suporte a d-funs
{...}
, atribuição de vertente(a b)←...
e deslocamento⍨
, como Dyalog para Linux ou Raspberry PI ( com⎕IO←0
)A
␛
linha 1 é um caractere de escape literal (que é de 1 byte). Você pode inseri-lo usando Ctrl-V Escum terminal Linux ou no Vim, ou supostamente algo como Alt-027no Windows. Além disso, não consegui encontrar uma maneira confiável de descobrir o tamanho do terminal; portanto, convém editar o número de linhas e colunas no final da última linha.Defendo o bônus de 50 pelo fato de que cada gota de chuva passa pelas seguintes formas:
⍟∘.
que dão a impressão de um leve vento descendente, dado que a cena está sendo vista de cima. De fato, olhando para o gif abaixo, você deve ter a impressão de que cada gota se move suavemente para baixo e para a esquerda, antes de desaparecer no chão.Versão não destruída:
Saída:
APL, estilo diferente
Fora de competição.
Aqui, meu objetivo era dar a impressão de gotas de chuva caindo inclinadas e se acumulando no chão, enquanto tentavam manter o número de quedas visíveis (caindo ou salpicadas) constantes, em média. O truque era criar um número de novas gotas caindo
/
a cada ciclo e fazer com que as gotas "varressem" quaisquer gotas espalhadas pelas quais elas viajassem.O resultado é estranhamente remanescente do código Matrix.
Saída
(o empurrão a cada 5s é o loop gif)
fonte
Bash: 111 bytes - 20 = 91 pontos!
Uma garoa suave e contemplativa em seu terminal. Ajuste os números 819 e 41 para diferentes alturas e larguras, respectivamente.
Um bônus agradável é a maneira como o cursor bate na área de chuva.
Edit: encurtando de 140 bytes para 129 bytes, graças às sugestões de @ manatwork. 2ª edição: redução de 129 bytes para 111 bytes, graças às sugestões de @ manatwork e @ Tobia, além de inspiração adicional - consulte os comentários.
(Nota: a captura de tela mostra a versão anterior do código com menos golfe, que é funcionalmente idêntica)
fonte
echo
as opções; 2 caracteres usando em\e
vez de\033
; 3 caracteres usando em:
vez detrue
; 5 caracteres por meio da avaliação da aritmética (((…))
):e='echo -ne \e';while :;do for i in {0..19};do for i in {0..40};do ((RANDOM<9))&&$e"[1;36m".||$e[1C;done;$e' ';done;$e[20A;done
.((RANDOM<9))
funciona da mesma forma. Além disso, você pode tentar reduzir seu código combinando os dois para{0..19}
e{0..40}
em um único para{0..819}
, usando algo como$((i%41))
dentro dele.e='printf \e'
é 2 caracteres mais curto quee='echo -ne \e'
!$e[C
Python, 312 bytes - 50 (vento) = 262
Saída de amostra (um loop de 50 quadros):
O playpack real é significativamente mais rápido do que os gifs permitem.
fonte
R=__import__("random").randint
vez dafrom random...
linha.HTML / JS, 170 caracteres - 20 = 150 pontos
(nota de rodapé: jogou golfe passando uma string para
setInterval
,with
nomes de variáveis de ID automáticos ... parece tão errado! estremece )Apenas desenha retângulos azuis aleatórios.
HTML / JS, 309 caracteres - 20 - 50 = 239 pontos
Agora com vento!
fonte
<canvas id=c /><script>d=400;with(c)width=height=d,t=getContext('2d');t.fillStyle='blue';setInterval("t.fillRect(Math.random()*d,Math.random()*d,5,5)",50)</script>
AAAHHH! Eu useiwith
! Sinto-me mais sujo do que passar uma string parasetInterval
: pcanvas
não pode fechar automaticamente, mas fora isso funciona perfeitamente! (Além disso, o uso automático de nomes de variáveis de ID também parece sujo: D)onload
. Devo dizer que eu gosto @ maneira de evitar a duplicação de FlorentMath.random()
canvas
automaticamente no Chrome! Minha resposta foi desenvolvida / testada neste navegador.JS + jQuery (172-20-50 = 102)
Copie / cole essa linha no console do navegador (geralmente pressione a tecla F12):
Corações vermelhos animados chovem no dia dos namorados!
fonte
Mathematica
134 - 20 = 114
2D
3D
A forma da gota de chuva é feita através de um gráfico de revolução em torno do eixo z.
Inicialmente, a chuva é gerada para uma região que se estende bem acima da região de exibição. A aparência da chuva caindo é obtida deslocando o ponto de vista para cima ao longo do eixo z. (É mais eficiente do que recalcular a posição de cada gota de chuva.)
Com vento
Há uma sobrecarga considerável para fazer a chuva cair com o vento. Mas eu estou incluindo aqui de qualquer maneira.
O piso azul praticamente mantém {x, y} a região confinada à área de interesse. Existem algumas falhas, mas, bem,
De diretamente acima
As gotas de chuva mais próximas são cortadas, mas eu vou esquecer isso.
fonte
HTML / JavaScript,
156123 (143-20)Versão anotada:
fonte
Smalltalk (Smalltalk / X)
com vento aleatório ;-)
saída em vista:
fonte
Processando, 94 - 20 = 74
(Nova linha adicionada para facilitar a leitura.)
Clique aqui para uma demonstração online.
fonte
Bater
Não tenho certeza se este deve ser um código de golfe, porque não há um requisito estrito sobre como deve ser a "chuva".
EDIT: Se você quiser que a câmera esteja apontando para baixo, use o seguinte:
fonte
while echo \ / / / / /;do echo / / / / /;done
(ou mais alguns com uma função recursiva, mas isso rapidamente explodirá a pilha). @undergroundmonorail Vento forte, diagonal em relação à câmera.while echo -e '\e[0;34m / / / / /';do echo / / / / /;done
e reduzi -lo a -13 com bônus :) #Python 2.7: 195 - 20 = 175
Tenho certeza de que há mais coisas a serem feitas aqui, mas é isso que tenho por enquanto:
Vou postar um gif da saída quando me lembrar de como fazer isso.
Isso funciona no linux. Substituir
'clear'
por'cls'
faz funcionar no Windows, mas as cores ANSI não funcionam e eu perco o bônus.Eu tenho uma matriz 2D de seqüências de caracteres de um caractere, inicializada em
. A cada 0,05 segundos, um deles é escolhido aleatoriamente em
.
e a tela é redesenhada.from random import*
salva dois caracteresimport os,time,random
e usarandom.randint()
duas vezes, embora não esteja convencido de que seja a melhor maneira de escolher uma célula. Eu queria usar,random.choice()
mas não conseguia pensar em uma maneira de contornar cadeias imutáveis que não desperdiçariam mais caracteres do que economizavam.fonte
l=[i[:]for i in[[' ']*100]*50]
, conforme stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178l=[[' ']*100]*50
, mas isso cria apenas 50 referências à mesma lista de 100 elementos, então procurei a maneira mais curta possível para contornar isso e encontrei a resposta do estouro de pilha vinculada acima.132 + 27 - 20 - 50 = 89
Javascript (132)
CSS (27)
Demonstração: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/
fonte
Processando, 62 - 20 = 42
Gera pixels azuis em um fundo branco. Demonstração em um idioma muito semelhante aqui: https://www.khanacademy.org/cs/rain2/6172053633761280
fonte
Processing.js, 86 - 20 = 66
... mas também desaparece lentamente (o chão absorve a chuva, naturalmente). Pontos por isso?
Os recursos de bônus incluem variação entre esverdeado e azulado (é claramente chuva suja da 'cidade').
Além disso, fiquei muito satisfeito por poder usar um hack de JavaScript aqui; Observe que, porque isso está processando. js , você pode incluir coisas como a declaração sem tipo de g = 99 ou o alias de
r
forrandom
( alias em vários idiomas!).Alguma outra idéia para minificar?
Versão legível:
A coisa toda pode ser vista aqui .
... mais outra versão sem desbotamento: 58 - 20 = 38
Se você não gosta de desbotar e não se importa com sujeira cinza:
fonte
Tcl / Tk, 139 - 20 = 119
Reutilizando minha própria resposta http://codegolf.stackexchange.com/a/143018/29325
Deve ser executado no shell interativo
Infelizmente, converter
expr int(rand()*
em umproc
faz com que o script tenha mais um byte!Para parar, basta clicar no botão "X" inefável.
fonte