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!
Respuestas:
APL, 105 caracteres / bytes * - 20-50 = 35 puntaje
*: 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:
Salida:
APL, estilo diferente
Fuera de competencia.
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)
fuente
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.
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)
fuente
echo
las opciones de; 2 caracteres usando en\e
lugar de\033
; 3 caracteres usando en:
lugar detrue
; 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
.((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.e='printf \e'
es 2 char más corto quee='echo -ne \e'
!$e[C
Python, 312 bytes - 50 (viento) = 262
Salida de muestra (un bucle de 50 cuadros):
Playpack real es significativamente más rápido de lo que permiten los gifs.
fuente
R=__import__("random").randint
lugar de lafrom random...
línea.HTML / JS, 170 caracteres - 20 = 150 puntos
(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!
fuente
<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íawith
! Me siento más sucio que pasarle una cuerda asetInterval
: pcanvas
no 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)onload
. Debo decir que me gusta la forma en que Florent evita el duplicadoMath.random()
canvas
automáticamente en Chrome! Mi respuesta fue desarrollada / probada en este navegador.JS + jQuery (172-20-50 = 102)
Copie / pegue esa línea en la consola del navegador (generalmente presione la tecla F12):
¡Lluvia de corazones rojos animados para el día de San Valentín!
fuente
Mathematica
134-20 = 114
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).
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,
Desde directamente arriba
Las gotas de lluvia más cercanas están recortadas, pero lo pasaré por alto.
fuente
HTML / JavaScript,
156123 (143 - 20)Versión anotada:
fuente
Smalltalk (Smalltalk / X)
con viento aleatorio ;-)
salida a la vista:
fuente
Procesamiento, 94-20 = 74
(Nueva línea agregada para facilitar la lectura).
Haga clic aquí para una demostración en línea.
fuente
Golpetazo
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:
fuente
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.while echo -e '\e[0;34m / / / / /';do echo / / / / /;done
y bajarlo a -13 con bonificaciones :)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:
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 caracteresimport os,time,random
y los usarandom.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.fuente
l=[i[:]for i in[[' ']*100]*50]
, según stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178l=[[' ']*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.132 + 27 - 20 - 50 = 89
Javascript (132)
CSS (27)
Demostración: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/
fuente
Procesamiento, 62-20 = 42
Genera píxeles azules sobre un fondo blanco. Demostración en un lenguaje muy similar aquí: https://www.khanacademy.org/cs/rain2/6172053633761280
fuente
Processing.js, 86-20 = 66
... pero también se desvanece lentamente (el suelo absorbe la lluvia, naturalmente). ¿Puntos por eso?
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
r
forrandom
(¡alias entre idiomas!).¿Alguna otra idea para minificar?
Versión legible:
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:
fuente
Tcl / Tk, 139-20 = 119
Reutilizando mi propia respuesta http://codegolf.stackexchange.com/a/143018/29325
Debe ejecutarse en el shell interactivo
¡Desafortunadamente, la conversión
expr int(rand()*
en unproc
hace que el script tenga un byte más!Para detenerse, uno solo necesita hacer clic en el inefable botón "X".
fuente