Es un día lluvioso

42

Contexto

Es el dia de san valentin. El único que amaste te dejó ayer por este tipo que siempre encontró "estúpido y poco interesante" . De camino a casa, has estado atrapado en el tráfico, escuchando viejas canciones en la radio, la lluvia golpeando el parabrisas te está sacudiendo. Después de un tiempo en su automóvil, se encuentra solo en su pequeño departamento sin poder pensar en otra cosa que no sea ella. No hay luz y miras por la ventana, dejando que la oscuridad te rodee. No hay nadie con quien hablar, tus amigos se han ido hace mucho tiempo después de advertirte sobre esta nueva chica que te atormenta. Usted inicia su computadora, ya que es lo único que puede hacer, abrir su navegador y publicar un nuevo rompecabezas de programación para apilar el intercambio, en un intento de cambiar de opinión.

Reto

Escriba un programa en el idioma que elija simulando la lluvia que cae sobre el suelo. La salida puede estar compuesta de caracteres ASCII o renderizados en 2D / 3D. La cámara está fija: estás arriba mirando directamente al suelo. Su programa debe incluir algún tipo de animación, como actualizar la consola o la página cada vez que genera un nuevo "marco". Tiene que ser realista, sé que es un poco subjetivo, pero digamos que no puedes llenar todo el terreno en una sola gran caída.

El resultado no tiene que ser una imagen, pero si está utilizando un lenguaje críptico, es mejor proporcionar un .gif para ilustrar cómo se ve en acción (pero, por supuesto, no afectará su puntaje si no lo hace).

Reglas

  • Tu puntaje es el total de bytes utilizados
  • -20 puntos si usas colores
  • -50 si logras generar algún tipo de viento
  • La puntuación más baja gana

Ejemplo

Un ejemplo muy básico de lo que se debe representar:

Espero que te vaya mejor y disfrutes este desafío.

Lo siento por mi inglés, siéntase libre de editar mi publicación si desea corregir algunos errores

Tabla de líderes

Si su nombre no aparece en la lista, es porque se ha considerado que su intento no cumple con las reglas.

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

¡Felicitaciones a Tobia!


fuente
51
Sinceramente espero que el primer párrafo no sea una historia real.
Kendall Frey
1
@DavidCarraher sí, como si estuvieras en el cielo mirando al suelo.
8
No creo que esto deba ser código de golf ya que hay demasiada clemencia en los posibles resultados
Cruncher
44
El primer párrafo junto con la posición de la cámara para esta representación es bastante macabro.
Tobia
3
"estúpido y poco interesante"
Profesor Allman

Respuestas:

26

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

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

*: La mayoría de las implementaciones de APL admiten alguna forma de juego de caracteres de un solo byte (heredado), que asigna símbolos APL a los valores superiores de 128 bytes. Por lo tanto, para jugar al golf, un programa que solo usa caracteres ASCII y símbolos APL puede puntuarse como caracteres = bytes.

Lo probé en el último apl.js de Nick en Node.js en un terminal OS X. Pero no he usado nada específico para su dialecto, por lo que debería funcionar en cualquier APL moderna que pueda ejecutarse en un terminal ANSI y que sea compatible con d-funs {...}, asignación de filamentos (a b)←...y conmutación , como Dyalog para Linux o para Raspberry PI ( con ⎕IO←0)

La línea 1 es un carácter de escape literal (que es 1 byte). Puede ingresarlo usando Ctrl-V Escun terminal de Linux o en Vim, o supuestamente algo como Alt-027en Windows. Además, no pude encontrar una forma confiable de descubrir el tamaño del terminal, por lo que es posible que desee editar el número de filas y columnas al final de la última línea.

Defiendo la bonificación de 50 por el hecho de que cada gota de lluvia pasa por las siguientes formas: ⍟∘.que dan la impresión de un ligero viento hacia abajo, dado que la escena se está mirando desde arriba. De hecho, al mirar el gif a continuación, debe tener la impresión de que cada gota se mueve suavemente hacia abajo y hacia la izquierda, antes de desaparecer en el suelo.

Versión sin golf:

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

Salida:

ingrese la descripción de la imagen aquí


APL, estilo diferente

Fuera de competencia.

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

Aquí mi objetivo era dar la impresión de que las gotas de lluvia caían con una inclinación y se acumulaban en el suelo, mientras trataba de mantener el número de gotas visibles (caídas o salpicadas) constantes en promedio. El truco consistía en crear una serie de nuevas gotas de caída /en cada ciclo y hacer que las gotas de caída "borren" las salpicadas que atraviesen.

El resultado es extrañamente una reminiscencia del código Matrix.

Salida
(el tirón cada 5 s es el bucle de gif)

ingrese la descripción de la imagen aquí

Tobia
fuente
Esto es bueno, pero no creo que el carácter ESC se imprima correctamente. i.stack.imgur.com/vLERQ.png También intenté pegar el código con gedit, no funcionó.
Riking
Te equivocaste en tu puntaje. La pregunta dice "bytes", no "caracteres".
jazzpi
1
@Riking Edité esa parte. Si lo intentas de nuevo, debería funcionar.
Tobia
@Tobia Muéstrame una foto tuya sentado en tu IBM 5100, y compraré el argumento chars = bytes.
primo
42

Bash: 111 bytes - 20 = 91 puntos!

Una llovizna contemplativa y suave en su terminal. Ajuste los números 819 y 41 para diferentes alturas y anchos 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 pantalla

Una ventaja agradable es la forma en que el cursor golpea el área de la lluvia.

Editar: acortamiento de 140 bytes a 129 bytes gracias a las sugerencias de @ manatwork. 2da edición: acortamiento de 129 bytes a 111 bytes gracias a las sugerencias de @manatwork y @ Tobia, además de inspiración adicional - ver comentarios.

(Nota: la captura de pantalla muestra la versión anterior menos codificada del código, que es funcionalmente idéntica)

Alboroto
fuente
1
Puede ahorrar: 2 caracteres uniendo echolas opciones de; 2 caracteres usando en \elugar de \033; 3 caracteres usando en :lugar de true; 5 caracteres mediante el uso de evaluación 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
No necesita el sigilo dentro de la evaluación aritmética. Y debe haber una nueva línea al final de su código. Debe tener solo 127 caracteres.
manatwork
1
Creo que lo que significa @manatwork es que no necesita usar el signo de dólar dentro de paréntesis dobles: ((RANDOM<9))funciona igual de bien. Además, podría intentar reducir su código combinando los dos para {0..19}y {0..40}en un solo para {0..819}, usando algo como $((i%41))dentro de él.
Tobia
1
¡Que alguien me detenga! e='printf \e'es 2 char más corto que e='echo -ne \e'!
Tobia
1
Y recorte otro personaje usando$e[C
Tobia
39

Python, 312 bytes - 50 (viento) = 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

Salida de muestra (un bucle de 50 cuadros):

Playpack real es significativamente más rápido de lo que permiten los gifs.

primo
fuente
3
@ChristianCareaga podría, pero creo que el blanco se ve mejor.
primo
8
El único problema en mis ojos: estás viendo la lluvia desde un lado, mientras que las reglas establecen una cámara fija mirando hacia abajo.
Johannes H.
77
@JohannesH. O, es un día muy, muy ventoso.
primo
20
¡Me gustan los relámpagos ocasionales! : P
El chico con el sombrero
3
Un personaje se salva usando en R=__import__("random").randintlugar de la from random...línea.
SimonT
35

HTML / JS, 170 caracteres - 20 = 150 puntos

<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 al margen: golfed aún más al pasar una cadena a setInterval, with, nombres de las variables de identificación automática ... se siente tan mal! estremecimientos )

Simplemente dibuja rectángulos azules al azar.

HTML / JS, 309 caracteres - 20 - 50 = 239 puntos

Ahora con viento!

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

Pomo de la puerta
fuente
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! Yo solía with! Me siento más sucio que pasarle una cuerda a setInterval: p
Niet the Dark Absol
@NiettheDarkAbsol Gracias;) Parece que (al menos en Chrome) canvasno se puede cerrar automáticamente, ¡pero aparte de eso funciona perfectamente! (Además, el uso de nombres de variables de identificación automática también se siente muy sucio: D)
Pomo de la puerta
Algunos navegadores parecen más indulgentes en esa área ... Pero evita tener que usarlos onload. Debo decir que me gusta la forma en que Florent evita el duplicadoMath.random()
Niet the Dark Absol
¡@Doorknob se cierra canvasautomáticamente en Chrome! Mi respuesta fue desarrollada / probada en este navegador.
Florent
1
Vota a favor de la segunda, con las gotas hundiéndose en el suelo / charco.
GreenAsJade
34

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

Copie / pegue esa línea en la consola del navegador (generalmente presione la 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)

¡Lluvia de corazones rojos animados para el día de San Valentín!

ingrese la descripción de la imagen aquí

Michael M.
fuente
1
bueno, no es realista. Los corazones provienen de la parte superior de la pantalla y se adhieren a posiciones aleatorias de la página. Eso realmente no coincide con la condición del punto de vista.
10
AUGGGGHH! ¡¿Como lo detengo?!
El chico con el sombrero
1
@ user2509848 ¿Pero hay alguna otra manera?
El chico con el sombrero
3
@TheGuywithTheHat, vuelva a cargar la página
Michael M.
19
¡Brillante! Creo que esto captura el corazón de la pregunta.
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

La forma de la gota de lluvia se realiza a través de un diagrama de revolución alrededor del eje z.

Inicialmente, se genera lluvia para una región que se extiende muy por encima de la región de visualización. La aparición de la lluvia que cae se logra desplazando el punto de vista hacia arriba a lo largo del eje z. (Es más eficiente que volver a calcular la posición de cada gota de lluvia).

lluvia

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]

Con viento

Hay una sobrecarga considerable para hacer que la lluvia caiga con el viento. Pero estoy incluyendo aquí de todos modos.

El piso azul prácticamente mantiene la región de vista {x, y} confinada al área de interés. Hay algunos problemas técnicos, pero, bueno,

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]

con viento


Desde directamente arriba

Las gotas de lluvia más cercanas están recortadas, pero lo pasaré por alto.

desde arriba 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]]
DavidC
fuente
Muévelo hacia un lado en menos de 50 caracteres y reducirás tu puntaje. :)
Ali Caglayan
1
Me encanta este
+1 para el último, con el ángulo correcto de la cámara PERO olvidó que la cámara bloquea parte de la lluvia ...;)
GreenAsJade
@GreenAsJade, el recorte para el punto de vista 3D (desde arriba) ahora está arreglado.
DavidC
Dulce, pero estaba siendo más frívola de lo que pensabas.
Quería
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>

Versión 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>
Florent
fuente
7

Smalltalk (Smalltalk / X)

con viento aleatorio ;-)

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

salida a la vista: ingrese la descripción de la imagen aquí

blabla999
fuente
66
No califica ya que es una vista lateral de la lluvia que cae, y no la lluvia que cae al suelo. Sigue siendo un bonito efecto de viento.
6

Procesamiento, 94-20 = 74

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

(Nueva línea agregada para facilitar la lectura).

Haga clic aquí para una demostración en línea.

ace_HongKongIndependence
fuente
1
El procesamiento es realmente bueno para problemas como estos.
cjfaure
No se puede ver en Firefox, la configuración de seguridad predeterminada bloquea el applet de Java y no me dice cómo anularlo. AFAIK hay un puerto Processing.js a JavaScript, si pudiera convertirlo a JS y publicar un enlace, se lo agradecería.
marczellm
@marczellm Estoy usando Firefox 27.0 en Ubuntu y funciona bien. ¿Estás seguro de que no hay mensajes que te pregunten si permitir o bloquear el complemento? Echaré un vistazo a una versión JS también.
ace_HongKongIndependence
@ace Después de decirle a todos los avisos que "permitan", un mensaje de seguridad aún lo bloquea. Gracias por la versión JS.
marczellm
1
@marczellm agregó la versión de javascript en la respuesta, disfruta :) y solo una suposición ciega, tal vez tu versión actual de plugin de java esté desactualizada y tenga problemas de seguridad conocidos
ace_HongKongIndependence
5

Golpetazo

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

No estoy seguro de que esto deba ser un código de golf porque no hay un requisito estricto sobre cómo debe ser la "lluvia".

EDITAR: si desea que parezca que la cámara apunta hacia abajo, use esto:

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

fuente
77
"La cámara está arreglada: estás por encima mirando directamente al suelo". Esto parece estar viendo la lluvia desde un lado?
undergroundmonorail
2
Ahorre 9 caracteres: while echo \ / / / / /;do echo / / / / /;done(o algunos más con una función recursiva, pero eso hará explotar rápidamente la pila). @undergroundmonorail Viento fuerte, diagonal en relación con la cámara.
Gilles 'SO- deja de ser malvado'
@Gilles En ese caso, podemos hacerlo while echo -e '\e[0;34m / / / / /';do echo / / / / /;doney bajarlo a -13 con bonificaciones :)
undergroundmonorail
44
eso definitivamente no parece lluvia: D
Kiwy
55
Realmente no creo que esto deba considerarse como una respuesta. En resumen: no es realista. Argumento detallado: si interpreté la pregunta correctamente, la lluvia debería caer al azar (o al menos seudoaleatoriamente) y, durante un largo período de tiempo, la distribución debería ser similar por unidad de área. (Así es como funciona la lluvia, ¿verdad?) Sin embargo, en esta respuesta, se garantiza que no habrá gotas de lluvia junto a ninguna gota de lluvia, por lo que si consideramos que el área de la unidad es el área de un personaje, vemos que el La distribución es desigual.
ace_HongKongIndependence
3

Python 2.7: 195 - 20 = 175

Estoy seguro de que hay más que se puede hacer aquí, pero esto es lo que tengo por ahora:

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)

Publicaré un gif de la salida cuando recuerde cómo hacerlo.

Esto funciona en Linux. Sustitución de 'clear'la 'cls'que hace que funcione en las ventanas, pero entonces los colores ANSI no hacer el trabajo y perder el bono.

Tengo una matriz 2D de cadenas de un carácter, inicializadas en . Cada 0,05 segundos, se elige uno de ellos al azar .y la pantalla se vuelve a dibujar.

from random import*guarda dos caracteres import os,time,randomy los usa random.randint()dos veces, aunque no estoy convencido de que sea la mejor manera de elegir una celda de todos modos. Quería usar, random.choice()pero no podía pensar en una forma de evitar cadenas inmutables que no desperdiciaran más caracteres de los que guardaba.

metro subterráneo
fuente
3
l=[i[:]for i in[[' ']*100]*50], según stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178
n.st
Oh, wow, nunca había visto eso antes. Si lo estoy leyendo correctamente, la notación de corte no hace nada excepto asegurarse de que sea una lista única y no otra referencia a la misma, ¿correcto? ¡Eso es realmente genial! ¡Gracias!
undergroundmonorail
Originalmente intenté l=[[' ']*100]*50, pero eso solo crea 50 referencias a la misma lista de 100 elementos, por lo que busqué la forma más corta posible de eludir eso y encontré la respuesta de desbordamiento de pila vinculada anteriormente.
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

Demostración: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/

Kelunik
fuente
Es de vista lateral, no califica por el momento.
@BenH Tienes razón, perdiste ese punto, la nueva versión está en mi respuesta ahora.
Kelunik
parece que no pasa nada al probar su código en la consola de
@BenH Por eso hay una jsfiddle-demo.
Kelunik
No lo vi. gracias
1

Procesamiento, 62-20 = 42

void draw(){stroke(0,0,214);point(random(0,99),random(0,99));}

Genera píxeles azules sobre un fondo blanco. Demostración en un lenguaje muy similar aquí: https://www.khanacademy.org/cs/rain2/6172053633761280

El chico con el sombrero
fuente
Obligatorio +1 para extrema terquedad.
primo
1

Processing.js, 86-20 = 66

... pero también se desvanece lentamente (el suelo absorbe la lluvia, naturalmente). ¿Puntos por eso?

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);}

Las características de bonificación incluyen variaciones entre verdosas y azuladas (es claramente lluvia sucia de 'ciudad').

Además, estaba muy contento de poder usar un hack de JavaScript aquí; Tenga en cuenta que, porque esto está procesando. js , puede incluir cosas como la declaración sin tipo de g = 99, o el alias de rfor random(¡alias entre idiomas!).

¿Alguna otra idea para minificar?

Versión legible:

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
}

Todo se puede ver aquí .

... más otra versión sin desvanecimiento: 58-20 = 38

Si no te gusta la decoloración y no te importa la suciedad gris:

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

Tcl / Tk, 139-20 = 119

Reutilizando mi propia respuesta http://codegolf.stackexchange.com/a/143018/29325

Debe ejecutarse en el shell interactivo

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}

¡Desafortunadamente, la conversión expr int(rand()*en un prochace que el script tenga un byte más!

ingrese la descripción de la imagen aquí

Para detenerse, uno solo necesita hacer clic en el inefable botón "X".

sergiol
fuente