É um dia chuvoso


42

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!


51
Espero sinceramente que o primeiro parágrafo não seja uma história verdadeira.
Kendall Frey

1
@DavidCarraher sim, como se você estivesse no céu olhando para o chão.

8
Eu não acho que isso deve ser código-golfe como há muita clemência sobre os potenciais saídas
Cruncher

4
O primeiro parágrafo, juntamente com a posição da câmera para esta renderização, é bastante macabro.
Tobia 14/02

Respostas:


26

APL, 105 caracteres / bytes * - 20 - 50 = 35 pontos

e←{⍞←∊'␛['⍵}
e¨'36m' '?25l' '2J'
{⍵←3⌊⍵+3×0=?t⍴50
⍵{(⍵c)←⍕¨⍵+1
e⍵';'c'H',' .∘⍟'[⍺]}¨⍳t
∇0⌈⍵-1}0⍴⍨t←24 80

*: 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:

e←{⍞←∊"␛["⍵}                  # utility to print escape sequence
e¨'36m' '?25l' '2J'            # set cyan, hide the cursor and clear screen
{                              # repeat (⍵=current board of raindrops)
  ⍵←3⌊⍵+3×0=?t⍴50              #   add some new drops (=3) in random places
  ⍵{                           #   print the drops (⍺=drop value, ⍵=coords)
    (r c)←⍕¨⍵+1                #     convert the coordinates to string
    e r';'c'H',' .∘⍟'[⍺]       #     print or clear the drop
  }¨⍳t                         #   ..
  ∇0⌈⍵-1                       #   remove 1 from every drop and repeat
}0⍴⍨t←24 80                    # ..starting with an empty board

Saída:

insira a descrição da imagem aqui


APL, estilo diferente

Fora de competição.

m←×/t←1+(ζη)←2×(βγ)←24 80
e←{⍞←∊(⎕UCS 27)'['⍵}
s←{⍵[β-1-⍳β;1+⍳γ]}
p←{⍺{e'H'⍺,⍨{⍺,';',⍵}/⍕¨⍵}¨(,s⍵)/,1+⍳βγ}
e¨'2J' '36m' '?25l'
{'/'p⍵←(200<m÷?t⍴m)∨0⍪⍵[⍳ζ;1+⍳η],0
' 'p(~⍵)∧0,⍵[1+⍳ζ;⍳η]⍪0
'.∘°'[?(+/,sδ)/3]pδ←⍵∧~d←.2<m÷⍨?t⍴m
∇⍵∧d}t⍴0

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)

insira a descrição da imagem aqui


Isso é legal, mas não acho que o caracter ESC esteja sendo impresso corretamente. i.stack.imgur.com/vLERQ.png Tentei colar o código com gedit também, não funcionou.
Riking

Você acertou sua pontuação. A pergunta diz "bytes", não "caracteres".
jazzpi

1
@ Vikings eu editei essa parte. Se você tentar novamente, deve funcionar.
Tobia

@Tobia Mostre-me uma foto sua sentada no IBM 5100 e comprarei o argumento chars = bytes.
primo


42

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.

e='printf \e';while :;do for i in {0..819};do((RANDOM<9))&&$e[1\;36m.||$e[1C;((i%41<1))&&$e'
';done;$e[20A;done

Captura de tela

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)


1
Você pode poupar: 2 caracteres juntando echoas opções; 2 caracteres usando em \evez de \033; 3 caracteres usando em :vez de true; 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.
manatwork

1
Você não precisa do sigilo dentro da avaliação aritmética. E deve haver uma nova linha no final do seu código. Deve ter apenas 127 caracteres.
manatwork

1
Acredito no que o @manatwork significa é que você não precisa usar o cifrão entre parênteses duplos: ((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.
Tobia

1
Alguém me para !! e='printf \e'é 2 caracteres mais curto que e='echo -ne \e'!
Tobia

1
E aparar outro caractere usando$e[C
Tobia

39

Python, 312 bytes - 50 (vento) = 262

from pygame import*
R=__import__('random').randint
t,u=640,480;init();d=display;s=d.set_mode((t,u))
w=[255]*3;r=range(t)
a=[[R(0,t),R(0,u),R(3,6)]for i in r]
while time.wait(9):
 d.flip();event.get();s.fill(R(0,99)<1and w)
 for i in r:x,y,z=a[i];draw.line(s,w,(x,y),(x+z,y+2*z));a[i][0]=(x+z)%t;a[i][1]=(y+z*2)%u

Saída de amostra (um loop de 50 quadros):

O playpack real é significativamente mais rápido do que os gifs permitem.


3
@ChristianCareaga eu pude, mas acho que o branco parece melhor.
primo

8
Único problema aos meus olhos: você está vendo a chuva de lado, enquanto as regras indicam uma câmera fixa olhando diretamente para baixo.
Johannes H.

7
@JohannesH. Ou é um dia muito, muito ventoso.
primo

20
Eu gosto de ocasionais relâmpagos! : P
O cara com o chapéu

3
Um caractere é salvo usando em R=__import__("random").randintvez da from random...linha.
SimonT

35

HTML / JS, 170 caracteres - 20 = 150 pontos

<canvas id=c></canvas><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>

(nota de rodapé: jogou golfe passando uma string para setInterval, withnomes 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!

<canvas id=c></canvas><script>s=400;r=Math.random;with(c)width=height=s,t=getContext('2d');t.fillStyle='blue';o=[];setInterval("t.clearRect(0,0,s,s);for(i=0;++i<o.length;)d=o[i],t.fillRect(d[0],d[1],d[2],d[2]),d[0]+=1,d[1]+=2,d[2]-=1,d[2]<0?o.splice(i,1):0;if(r()<.6)o.push([r()*400,r()*400,20])",50)</script>


163 bytes: <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 usei with! Sinto-me mais sujo do que passar uma string para setInterval: p
Niet the Dark Absol

@NiettheDarkAbsol Obrigado;) Parece que (pelo menos no Chrome) canvasnã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)
Maçaneta da porta

Alguns navegadores parecem mais tolerantes nessa área ... Mas evita ter que usar onload. Devo dizer que eu gosto @ maneira de evitar a duplicação de FlorentMath.random()
Niet the Dark Absol

@Doorknob fecha canvasautomaticamente no Chrome! Minha resposta foi desenvolvida / testada neste navegador.
Florent

1
Voto a favor para o segundo, com os pingos afundando no chão / poça.
GreenAsJade 16/02

34

JS + jQuery (172-20-50 = 102)

Copie / cole essa linha no console do navegador (geralmente pressione a tecla F12):

r=Math.random;w=$(window);setInterval("$('<b>♥</b>').css({color:'red',position:'fixed',top:r()*w.height(),left:r()*w.width()}).appendTo('body').animate({fontSize:0},3e3)",9)

Corações vermelhos animados chovem no dia dos namorados!

insira a descrição da imagem aqui


1
bem, não é realista. Os corações vêm da parte superior da tela e aderem a posições aleatórias da página. Isso realmente não corresponde à condição do ponto de vista.

10
AUGGGGHH! Como faço para parar ?!
O cara com o chapéu

1
@ user2509848 Mas existe outra maneira?
O cara com o chapéu

3
@TheGuywithTheHat, recarregar a página
Michael M.

19
Brilhante! Eu acho que isso captura o cerne da questão.
227146 Andrewb

26

Mathematica

134 - 20 = 114

2D

n = 99; m = Array[0 &, {n, n}]; r := RandomInteger[{1, n}, {2}]
Table[ArrayPlot[m = ReplacePart[m, r ->  1], ColorRules -> {1 -> Blue}], {k, 250}];
Export["d.gif", d]

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.)

chuva

r = RandomInteger; z = Table[{r@30, r@30, r@160}, {100}];
w = RevolutionPlot3D[{.7 Sin[x] Cos[x], 0,   1.4 Sin[x] }, {x, 0, -Pi/2}, 
PerformanceGoal -> "Speed"][[1]];
c = Map[Translate[w, #] &, z]; 
p = Table[Graphics3D[c, PlotRange -> {k, k + 50}], {k, 1, 100}]
Export["p.gif", p]

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,

r = RandomInteger;
z = Table[{r@120, r@30, r@180}, {800}];
w = RevolutionPlot3D[{.7 Sin[x] Cos[x], 0,   1.4 Sin[x] }, {x, 
     0, -Pi/2}, PerformanceGoal -> "Speed"][[1]];
c = Map[Translate[w, #] &, z];
g[k_, z1_, w_, c1_] :=
 Module[{z2},
  z2 = Cases[z, {x_, _, _} /; 0 + k < x < 30 + k];
  c = Map[Translate[w, #] &, z2];
  Graphics3D[{Polygon[{{0 + k, 0, 1 + k}, {30 + k, 0, 1 + k}, {30 + k,
        30, 1 + k}, {0 + k, 30, 1 + k}}], c}, 
   PlotRange -> {k, k + 50}]]

p = Table[g[k, z, w, c], {k, 1, 100, 1}];
Export["p.gif", p]

com vento


De diretamente acima

As gotas de chuva mais próximas são cortadas, mas eu vou esquecer isso.

acima de 3D

m=40;
r=RandomInteger;
positions=Table[{r@m,r@m,r@1000},{800}];
g[lowZ_,pos_]:=
Module[{hiZ=lowZ+103},
Graphics3D[{PointSize[Small],White,Point[{{0,0,lowZ},{0,m,lowZ},{m,0,lowZ},{m,m,lowZ},{0,0,hiZ},{0,m,hiZ},{m,0,hiZ},{m,m,hiZ}}],
ImageSize-> 350,Sphere/@Cases[pos,{_,_,z1_}/;lowZ<z1<hiZ-2]},PlotRange->{lowZ,hiZ}, 
ViewPoint-> {0,0,1},ImagePadding->5]]

Mude para o lado com menos de 50 caracteres e você diminui sua pontuação. :)
Ali Caglayan

1
Eu amo este

+1 para o último, com o ângulo da câmera correta, mas você se esqueceu de que a câmara bloqueia alguns da chuva ....;)
GreenAsJade

@GreenAsJade, O recorte para o ponto de vista 3D (de cima) agora está corrigido.
DavidC

Doce, mas eu estava sendo mais frívola do que você pensava. I foi o que significa que há uma câmera física olhando para isso, por isso deve estar bloqueando alguns dos pingos de chuva:%)
GreenAsJade

10

HTML / JavaScript, 156 123 (143-20)

<body bgcolor=0 onload="t=c.getContext('2d');t.fillStyle='#07d';setInterval('n=Math.random()*4e4;t.fillRect(n%270,n/150,1,1)',1)"><canvas id=c>

Versão anotada:

<body bgcolor="#000">
<canvas id="c"></canvas>
<script>
  onload = function() {
    // Retrieve the rendering context
    t=c.getContext('2d');
    // Set rain color
    t.fillStyle='#07d';
    // Render whenever it is possible
    setInterval(function() {
      // Generate a number between 0 and 40,000
      // 40,000 ~= 270 * 150
      n=Math.random()*4e4;
      // Draw a raindrop.
      // Since x and y are not rounded, the raindrop looks blurry!
      t.fillRect(n%270,n/150,1,1)
    }, 1);
  };
</script>
</body>

7

Smalltalk (Smalltalk / X)

com vento aleatório ;-)

|BG CLR N1 H W v WIND drops gen newDrops draw remove move buffer|


BG := Color black.
CLR := Color blue lightened.
H := 100.
W := 100.
N1 := 10.
WIND := 0.
drops := OrderedCollection new.

gen := [:n | ((1 to:n) collect:[:i | Random nextIntegerBetween:1 and:W] as:Set) collect:[:x | x@0]].
newDrops := [drops addAll:(gen value:N1)].
draw := [buffer fill:BG; paint:CLR. drops do:[:d | buffer displayPoint:d]].
remove := [drops := drops reject:[:d | d y > H]].
move := [:wind | drops := drops collect:[:d| (d x + wind)\\W @ (d y + 1)]].
v := View new openAndWait.
buffer := Form extent:(v extent) depth:24 onDevice:v device.

[
    [v shown] whileTrue:[
        draw value.
        v displayForm:buffer.
        move value:WIND.
        remove value.
        newDrops value.
        WIND := (WIND+(Random nextBetween:-1 and:1)) clampBetween:-5 and:5.
        Delay waitForSeconds:0.1.
    ]
] fork.

saída em vista: insira a descrição da imagem aqui


6
Não se qualifica, pois é uma vista lateral da chuva que cai e não da chuva que atinge o chão. Ainda é um bom efeito de vento.

6

Processando, 94 - 20 = 74

void setup(){background(0);fill(0,0,255);}
void draw(){ellipse(random(0,99),random(0,99),3,3);}

(Nova linha adicionada para facilitar a leitura.)

Clique aqui para uma demonstração online.


1
O processamento é realmente bom para problemas como esses.
cjfaure

Não é possível visualizá-lo no Firefox, as configurações de segurança padrão bloqueiam o applet Java e ele não me diz como substituir. AFAIK existe uma porta Processing.js para JavaScript, se você pudesse convertê-la em JS e postar um link, ficaria agradecido.
Marczellm

@marczellm Estou usando o Firefox 27.0 no Ubuntu e funciona bem. Tem certeza de que não há avisos perguntando se deseja permitir ou bloquear o plug-in? Vou dar uma olhada em uma versão JS também.
ace_HongKongIndependence

Depois que eu digo a todos os avisos para "permitir", uma mensagem de segurança ainda o bloqueia. Obrigado pela versão JS.
marczellm

1
@marczellm adicionado a versão javascript para a resposta, desfrutar :) e apenas um palpite cego, talvez o seu java atual plug-in versão está desatualizado e tem problemas de segurança conhecidos
ace_HongKongIndependence

5

Bater

while true;do echo " / / / / /";echo "/ / / / / ";done

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:

while true;do echo " . . . . .";echo ". . . . . ";done

7
"A câmera está fixa: você está olhando diretamente para o chão". Parece estar vendo a chuva de lado?
Undergroundmonorail

2
Salve 9 caracteres: 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.
Gilles 'SO- stop be evil'

@Gilles Nesse caso, podemos fazer while echo -e '\e[0;34m / / / / /';do echo / / / / /;donee reduzi -lo a -13 com bônus :) #
undergroundmonorail

4
desse definitivamente não olhando como chuva: D
kiwy

5
Eu realmente não acho que isso deva ser considerado uma resposta. Em resumo: não é realista. Argumento detalhado: se eu interpretei a pergunta corretamente, a chuva deve cair aleatoriamente (ou pelo menos pseudo-aleatoriamente) e, por um longo período de tempo, a distribuição deve ser semelhante por unidade de área. (É assim que a chuva funciona, certo?) No entanto, nesta resposta, é garantido que não haverá chuva ao lado de nenhuma chuva; portanto, se considerarmos que a área da unidade é a área de um personagem, veremos que o distribuição é desigual.
ace_HongKongIndependence

3

Python 2.7: 195 - 20 = 175

Tenho certeza de que há mais coisas a serem feitas aqui, mas é isso que tenho por enquanto:

import os,time
from random import*
l=[i[:]for i in[[' ']*100]*50]
while 1:
 os.system('clear')
 l[randint(0,49)][randint(0,99)]='.'
 print'\033[94m\n'.join(''.join(r)for r in l)
 time.sleep(.05)

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 caracteres import os,time,randome usa random.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.


3
l=[i[:]for i in[[' ']*100]*50], conforme stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178
n.st 14/02

Uau, nunca vi isso antes. Se eu estiver lendo corretamente, a notação de fatia não faz nada, exceto garantir que seja uma lista exclusiva e não outra referência à mesma, correto? Isso é muito legal! Obrigado!
Undergroundmonorail

Eu tentei originalmente l=[[' ']*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.
n.st

2

132 + 27 - 20 - 50 = 89

Javascript (132)

r=Math.random;setInterval("$('body').append($('<i>∘</i>').css({left:r()*2e3,top:r()*2e3}).animate({left:'+=70',fontSize:0},500))",1)

CSS (27)

i{color:blue;position:fixed

Demonstração: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/


É de vista lateral, não se qualifica para o momento.

@ BenH Você está certo, perdeu esse ponto, nova versão está na minha resposta agora.
22414 kelunik

parece que nada acontece ao tentar seu código no console do firefox: /

@BenH É por isso que há uma demonstração do jsfiddle.
Kelunik

não vi isso. graças


1

Processing.js, 86 - 20 = 66

... mas também desaparece lentamente (o chão absorve a chuva, naturalmente). Pontos por isso?

g=99;r=random;void draw(){fill(0,9);rect(0,0,g,g);fill(0,g,r(g));rect(r(g),r(g),2,2);}

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 rfor random( alias em vários idiomas!).

Alguma outra idéia para minificar?

Versão legível:

g = 99;
r = random;                  // Javascript trickery
void draw() {
    fill(0, 9);
    rect(0, 0, g, g);        // Fade the background
    fill(0, r(g), r);
    rect(r(g), r(g), 2, 2);  // Add a new drop
}

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:

r=random;void draw(){fill(0,0,255);rect(r(99),r(99),2,2);}

1

Tcl / Tk, 139 - 20 = 119

Reutilizando minha própria resposta http://codegolf.stackexchange.com/a/143018/29325

Deve ser executado no shell interativo

gri [can .c -w 40 -he 40]
set x 0
wh 1 {.c cr o $x [set y [exp int(rand()*40)]] $x [set x $y] -f #[form %06x [exp int(rand()*255**3)]]
upd}

Infelizmente, converter expr int(rand()*em um procfaz com que o script tenha mais um byte!

insira a descrição da imagem aqui

Para parar, basta clicar no botão "X" inefável.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.