Descrição do Desafio
Você tem que mostrar uma simulação de chuva no terminal.
No exemplo abaixo, ele adiciona 100 gotas de chuva aleatoriamente (use a função aleatória padrão oferecida pelo seu idioma) coordenadas, aguardando 0,2 segundos e redesenhando novamente até o tempo determinado expirar. Qualquer caractere pode ser usado para representar a gota de chuva.
Parâmetros
- Tempo de espera entre o redesenho em segundos.
- Hora em que a chuva será visível. Este é apenas um número inteiro que representa o número de iterações. [Então, o tempo líquido pelo qual a chuva ficará visível é esse número inteiro multiplicado pelo tempo de espera]
- Mensagem a ser exibida quando a chuva terminar. (Isso deve ser centralizado)
- Número de gotas de chuva a serem exibidas na tela.
Regras
- Um único byte deve ser usado para representar uma gota de chuva e pode ser qualquer coisa, até mesmo cães e gatos.
- Ele não precisa responder ao tamanho do terminal, o que significa que você não precisa lidar com o bug para tamanhos variados de terminais. Você pode especificar a largura e a altura do terminal por conta própria.
- Aplicam-se regras padrão de golfe.
Amostra de código e saída
Esta é uma versão não-escrita escrita em 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()
Saída -
Respostas:
MATL , 52 bytes
As entradas são, nesta ordem: pausa entre atualizações, número de descargas, mensagem, número de repetições. O monitor possui caracteres de tamanho 80 × 25 (codificado).
GIF ou não aconteceu! (Exemplo com entradas
0.2
,100
,'THE END'
,30
)Ou tente no MATL Online .
Explicação
fonte
why
:)JavaScript (ES6),
268261 bytesPelo menos no meu navegador, a saída foi projetada para caber na área de snippet de pilha sem ter que ir para "Página inteira"; portanto, se você pedir mais de 702 gotas de chuva, ela travará.
Editar: salvou 7 bytes usando um nó de texto como minha área de saída.
fonte
setInterval
. Além disso, por que você usa emtextContent
vez deinnerHTML
?R,
19619218bytesApenas uma versão simulada que escrevi com base na descrição. Espero que seja um pouco o que o OP estava procurando.
Economizei alguns bytes graças a @plannapus.
Os argumentos:
w
: Tempo de espera entre os quadrost
: Número total de quadrosm
: Mensagem personalizadan
: Número de gotas de chuvaExemplo
Por que parece que está chovendo para cima?
Editar: devo mencionar que este é o meu console R-studio personalizado de 23x100 caracteres. As dimensões são codificadas na função, mas, em princípio, pode-se usar
getOption("width")
para torná-la flexível ao tamanho do console.Ungolfed e explicou
fonte
rep()
automaticamente pavimenta otimes
argumento, portanto não há necessidade disso. Economizou mais 7 bytes!runif
vez desample
preencher aleatoriamente a matriz. Assim: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
Versão não destruída:
fonte
R, 163 caracteres
Com recuos e novas linhas:
É adaptado para um tamanho de terminal de 24 linhas por 80 colunas.
w
é o tempo de espera,t
o número de quadros,n
o número de gotas de chuva em
a mensagem final.Difere da resposta de @ billywob no uso diferente de
sample
: se o tamanho da saída for omitido,sample
permite uma permutação do vetor de entrada (aqui, um vetor contendo o número necessário de gotas de chuva e o número correspondente de espaços, graças ao argumentotimes
de funçãorep
é vetorizada). Como o tamanho do vetor corresponde exatamente ao tamanho da tela, não há necessidade de adicionar novas linhas ou forçá-lo a formar uma matriz.fonte
NodeJS:
691158148 bytesEditar
Conforme solicitado, recursos adicionais removidos e golf'd.
As regras especificam desconsiderar o tamanho, mas esta versão inclui uma falha nos primeiros quadros. São 129 bytes.
Resposta anterior
Talvez não seja o melhor jogador de golfe, mas fiquei um pouco empolgado. Possui direção opcional do vento e fator de chuva.
node rain.js 0 0.3
Veja aqui trabalhando aqui
fonte
Noodel , não- concorrente 44 bytes
Eu tinha um texto centralizado na minha lista de coisas para fazer desde que criei o idioma ... Mas eu era preguiçoso e não o adicionei até depois desse desafio. Então, aqui não estou competindo, mas me diverti com o desafio :)
O tamanho do console é codificado para 25x50, o que não parece bom no editor on-line, mas sim no snippet.
Tente:)
Como funciona
fonte
Ruby + GNU Core Utils, 169 bytes
Os parâmetros para a função são tempo de espera, número de iterações, mensagem e número de gotas de chuva, nessa ordem. Novas linhas de legibilidade.
Utilitários principais eram necessários para
tput
eclear
.fonte
Python 2.7,
254251 bytesEsta é minha própria tentativa sem usar ncurses.
Obrigado a @ErikTheOutgolfer por me corrigir e salvar bytes.
fonte
for
loop em uma linha (como você inseriu40)];for i in u(
). Você também precisa de um caractere ESC,'[2J'
eu acho. Além disso, havia um espaço extra nou(n): r[y
. Eu não sei como você contou 249 embora. Todos os problemas encontrados foram corrigidos aqui .<esc>
denota um byte ESC 0x1B literal. Contagem de bytes é 242 , não 246.SmileBASIC, 114 bytes
O tamanho do console é sempre 50 * 30.
fonte
Perl 5, 156 bytes
Código de 154 bytes + 2 para
-pl
.Usa um tamanho fixo de 160x50.
Veja online!
Perl 5, 203 bytes
Código de 201 bytes + 2 para
-pl
.Usa
tput
para determinar o tamanho do terminal.fonte