Descripción del desafío
Tienes que mostrar una simulación de lluvia en la terminal.
En el ejemplo que se muestra a continuación, se agregan 100 gotas de lluvia al azar (use la función aleatoria predeterminada que ofrece su idioma) coordenadas, esperando 0.2 segundos y luego volviendo a dibujar hasta que expire el tiempo dado. Cualquier personaje puede usarse para representar la gota de lluvia.
Parámetros
- Tiempo de espera entre redibujos en segundos.
- Hora en que la lluvia será visible. Esto es solo un número entero que representa el número de iteraciones. [Entonces, el tiempo neto por el cual la lluvia será visible es este número entero multiplicado por el tiempo de espera]
- Mensaje que se mostrará cuando termine la lluvia. (Esto tiene que estar centrado)
- Número de gotas de lluvia que se mostrarán en la pantalla.
Reglas
- Se debe usar un solo byte para representar una gota de lluvia, y puede ser cualquier cosa, incluso gatos y perros.
- No tiene que responder al tamaño del terminal, lo que significa que no tiene que manejar el error para tamaños de terminal variados. Puede especificar el ancho y la altura del terminal por su cuenta.
- Se aplican las normas estándar de golf.
Muestra de código y salida
Esta es una versión sin golf escrita en Python 2.7 usando ncurses.
import curses
import random
import time
myscreen = curses.initscr()
curses.curs_set(0) # no cursor please
HEIGHT, WIDTH = myscreen.getmaxyx()
RAIN = '/' # this is what my rain drop looks like
TIME = 10
def make_it_rain(window, tot_time, msg, wait_time, num_drops):
"""
window :: curses window
time :: Total time for which it rains
msg :: Message displayed when it stops raining
wait_time :: Time between redrawing scene
num_drops :: Number of rain drops in the scene
"""
for _ in range(tot_time):
for i in range(num_drops):
x,y=random.randint(1, HEIGHT-2),random.randint(1,WIDTH-2)
window.addstr(x,y,RAIN)
window.refresh()
time.sleep(wait_time)
window.erase()
window.refresh()
window.addstr(HEIGHT/2, int(WIDTH/2.7), msg)
if __name__ == '__main__':
make_it_rain(myscreen, TIME, 'IT HAS STOPPED RAINING!', 0.2, 100)
myscreen.getch()
curses.endwin()
Salida -
Respuestas:
MATL , 52 bytes
Las entradas son, en este orden: pausa entre actualizaciones, número de caídas, mensaje, número de repeticiones. El monitor tiene un tamaño de 80 × 25 caracteres (codificado).
GIF o no sucedió! (Ejemplo con entradas
0.2
,100
,'THE END'
,30
)O pruébalo en MATL Online .
Explicación
fuente
why
:)JavaScript (ES6),
268261 bytesAl menos en mi navegador, la salida está diseñada para caber en el área del Fragmento de pila sin tener que ir a "Página completa", por lo que si solicita más de 702 gotas de lluvia, se bloqueará.
Editar: guardado 7 bytes usando un nodo de texto como mi área de salida.
fuente
setInterval
. Además, ¿por qué lo usas entextContent
lugar deinnerHTML
?R,
196192185bytesSolo una versión simulada que escribí basada en la descripción. Con suerte, es algo que OP estaba buscando.
Guardado algunos bytes gracias a @plannapus.
Los argumentos:
w
: Tiempo de espera entre cuadrost
: Número total de fotogramasm
: Mensaje personalizadon
: Número de gotas de lluviaEjemplo
¿Por qué parece que llueve hacia arriba?
Editar: Debo mencionar que esta es mi consola R-studio personalizada de 23x100 caracteres. Las dimensiones están codificadas en la función, pero en principio se podría utilizar
getOption("width")
para que sea flexible al tamaño de la consola.Desengañado y explicado
fuente
rep()
automáticamente deltimes
argumento, por lo que tampoco es necesario. ¡Salvó otros 7 bytes!runif
lugar desample
rellenar aleatoriamente la matriz. De este modo:f=function(w,t,m,n,x,y){for(i in 1:t){r=matrix(" ",x,y);r[runif(n)*x*y]="/";cat("\f",rbind(r,"\n"),sep="");Sys.sleep(w)};cat("\f",g<-rep("\n",y/2),rep(" ",(x-nchar(m))/2),m,g,sep="")}
C 160 bytes
Versión sin golf:
fuente
R, 163 caracteres
Con sangrías y nuevas líneas:
Está adaptado a un tamaño de terminal de 24 líneas por 80 columnas.
w
es el tiempo de espera,t
el número de cuadros,n
el número de gotas de lluvia ym
el mensaje final.Se diferencia de la respuesta de @ billywob en el uso diferente de
sample
: si se omite el tamaño de salida,sample
da una permutación del vector de entrada (aquí un vector que contiene el número necesario de gotas de lluvia y el número correspondiente de espacios, gracias al hecho de que el argumentotimes
de La funciónrep
está vectorizada). Como el tamaño del vector corresponde exactamente al tamaño de la pantalla, no es necesario agregar nuevas líneas ni forzarlo a una matriz.fuente
Nodo JS:
691158148 BytesEditar
Según lo solicitado, características adicionales eliminadas y golf'd.
Las reglas especifican el desprecio por el tamaño, pero esta versión incluye una falla en los primeros fotogramas. Tiene 129 bytes.
Respuesta anterior
Quizás no sea el mejor golf, pero me dejé llevar un poco. Tiene dirección del viento y factor de lluvia opcionales.
node rain.js 0 0.3
Ver webm trabajando aquí
fuente
Noodel , 44 bytes no competitivos
Tenía un texto centrado en mi lista de cosas que hacer desde que hice el idioma ... Pero, era vago y no agregué hasta después de este desafío. Entonces, aquí no estoy compitiendo, pero me divertí con el desafío :)
El tamaño de la consola está codificado a 25x50, lo que no se ve bien en el editor en línea, pero sí para el fragmento.
Intentalo:)
Cómo funciona
fuente
Ruby + GNU Core Utils, 169 bytes
Los parámetros de la función son el tiempo de espera, el número de iteraciones, el mensaje y el número de gotas de lluvia, en ese orden. Nuevas líneas de legibilidad.
Se necesitaban Core Utils para
tput
yclear
.fuente
Python 2.7,
254251 bytesEste es mi propio intento sin usar ncurses.
Gracias a @ErikTheOutgolfer por corregir y guardarme bytes.
fuente
for
bucle en una línea (como lo ha hecho40)];for i in u(
). También necesitas un ESC ESC'[2J'
creo. Además, había un espacio extra enu(n): r[y
. Sin embargo, no sé cómo contabas 249. Todos los problemas que encontré se solucionaron aquí .<esc>
denota un byte ESC 0x1B literal. El recuento de bytes es 242 , no 246.SmileBASIC, 114 bytes
El tamaño de la consola es siempre 50 * 30.
fuente
Perl 5, 156 bytes
154 bytes código + 2 para
-pl
.Utiliza un tamaño fijo de 160x50.
¡Véalo en línea!
Perl 5, 203 bytes
Código de 201 bytes + 2 para
-pl
.Usos
tput
para determinar el tamaño de la terminal.fuente