fundo
O verão acabou no Hemisfério Norte, e muitos de nós sentimos falta do sol, das praias, das ondas do oceano ... Esse desafio visa animá-los, lembrando-os do mar.
O desafio
Aqui está o mar:
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
O mar é constituído por 5 vezes esse padrão de onda:
**
****
*****
** **
** **
* *****
Observe que o padrão tem 16 caracteres e o mar tem 5 vezes esse padrão = 80 caracteres.
Que você pode imprimir em um terminal usando esta linha de comando:
perl -e 'print " ** \n **** \n ***** \n ** ** \n ** ** \n* *****\n"'
Ou este:
perl -e 'print " "x12, "*"x2, " "x2, "\n", " "x8, "*"x4, " "x4, "\n", " "x5, "*"x5, " "x6, "\n", " "x3, "*"x2, " "x3, "*"x2, " "x6, "\n", " "x1, "*"x2, " "x6, "*"x2, " "x5, "\n", "*"x1, " "x10, "*"x5, "\n"'
(O segundo deve facilitar a obtenção do padrão exato)
Sua tarefa é exibir o mar em um terminal e parecer que as ondas estão se movendo para a direita: ele precisa mudar para a direita a uma velocidade de 1 caractere a cada 100ms (= 10 vezes a cada segundo). Nenhum caractere deve ser impresso após a coluna 80, mas, à medida que a onda mais à direita desaparece, um novo aparece à esquerda.
Aqui está um exemplo de saída:
time = 0.0s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
time = 0.1s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
*** ****** ****** ****** ****** ***
time = 0.2s
* ** ** ** ** *
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
**** ****** ****** ****** ****** **
time = 0.3s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
***** ****** ****** ****** ****** *
time = 0.4s
** ** ** ** **
* **** **** **** **** ***
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
****** ****** ****** ****** ******
Obviamente, cada saída deve substituir a anterior.
Você pode executar esse código em um terminal unix para ver como deve ficar com a animação:
perl -M5.010 -MTime::HiRes=sleep -E '@arr=([($")x12,($n="*")x2,($")x3],[($")x8,($n)x4,($")x4],[($")x5,($n)x5,($")x6],[($")x3,($n)x2,($")x3,($n)x2,($")x6],[($")x1,($n)x2,($")x6,($n)x2,($")x5],[($n)x1,($")x10,($n)x5]);while(++$j){for$i(0..5){for$k(0..15) {$out[$i][16*$_+$k]=$arr[$i][($k-$j)%16]for 0..4}}say"\e[H",$/,join$/,map{join"",@$_}@out;sleep 0.1}'
(Observe que este código não é muito bom para golfe: eu apenas o compacto o suficiente para ser conveniente para rodar em um terminal.)
Critério de vitória
Este é o codegolf, e o código mais curto em bytes ganha.