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.
Respostas:
MATL ,
4140 bytesExemplo de execução:
Ou tente no MATL Online! (a velocidade real pode depender da carga do servidor).
Como funciona
fonte
JavaScript (ES6) + HTML,
151143 + 10 =161153 bytesfonte
a
?a
mantém o padrão de onda codificado em binário e é rotacionado em cada quadro. Portanto, não pode ser codificado: ele precisa ser armazenado em uma variável.HTML + CSS, 70 +
181175 = 245 bytesFaz uso de
text-shadow
,rtl
texto e quadro-chave CSS animações.fonte
C #
450444425417 bytes399 sem,
using System.Linq;
mas tenho certeza que seria trapaça ...Edit: Saved 25 Bytes graças a @Cyoce
Golfe:
Ungolfed:
fonte
(a)=>
. Ewhile(true)
pode serfor(;;)
s
lambda, acho que você pode remover o{}
ereturn
\r
partir dostring.Join
(pelo menos no Windows funciona, não testá-lo com Mono embora) Você também pode salvar 1 byte, colocandop++
nofor
loop como estefor(;;p++)
if (p==16)...
), você também pode colocá-la no cabeçalho do loop for como estefor(;;p=++p%16)
. Economize mais 1 byte, declarandop
no loop (for(int p=0;;p=++p%16)
)V,
989773 bytesObrigado a @ nmjcman101 por salvar 24 bytes!
Isso contém muitos imprimíveis, então aqui está um hexdump do xxd:
Editar
Usado em
y$
vez de<C-v>$y
Muitas mudanças
{
e}
para economizar alguns bytesò
vez de registradores para criar o loop infinito (por algum motivo, preciso incluir umò
no final para que ele funcione)*
na parte inferiorMini-explicação
Estou usando
<alt-n>
para criar cópias de strings. Por exemplo,<alt-5>*
(isso pareceµ5
) faz5
cópias*
no modo de inserção. Achei isso mais curto do que copiar a string e usar um regex para fazer as substituições necessárias. Depois de criar uma onda, colo-a para criar as outras ondas. Por fim, faço um loop recursivamente usandoò
para criar o loop infinito (com um atraso de100ms
).Gif
A maior parte do código é dedicada à criação da onda, então ainda estou tentando jogar isso. Observe que esse código não funcionará no TIO, pois o TIO somente gera a saída após o término da execução. Então, aqui está um gif (desculpe pela baixa qualidade, eu tive que usar um site para converter um
.mov
para um.gif
, também o>_
que continua aparecendo à direita é o ícone do Terminal no dock do meu mac):fonte
5j
(no contexto de$<C-V>5j
) poderia ser apenas}
, e op
depois do|
deve ser umP
que fixará a estática*
no canto inferior esquerdo.qm[CODE]@mq@m
no final por apenasò[CODE]
. O código entreò
será executado em loop até a quebra (de maneira semelhante à sua macro) e, no final de um programa, umò
é implicitamente fechado.Lote, 424 bytes
Algumas linhas têm espaços à direita. Requer um terminal padrão de 80 colunas. O tempo não é muito preciso, mas é o melhor que você pode fazer no Lote.
fonte
Raquete
395374373367364351 bytesUsa uma biblioteca externa para limpar a tela
Editar: salvou 21 bytes por não definir
w
e incluir a função.Edit2: salvou 1 byte removendo um espaço.
Edit3: salvou 6 bytes renomeando
loop
parap
, obrigado @rnso!Edit4: Colocando substring na lista, economizando 3 bytes.
Edit5: Remove
#lang racket
, o que não é necessário no intérprete.Golfe: 351 bytes
Rolagem (sem limpeza): 272 bytes
Ungolfed:
fonte
simplescreenrecorder
comavconv
para converter mp4 para gif.rotmul
realmente foi capturadow
como parâmetro.PowerShell 3.0,
183182173 bytesRequer PS 3.0 para operadores de turno binário. Reduziu para 173 bytes com a ajuda do AdmBorkBork !
fonte
.PadLeft
, mova a$o
declaração para a[convert]
chamada e elimine as aspas ao redor dos números nas-replace
operações. Obtém-lo para baixo para 175 -for(){0..5|%{("{0:D16}"-f+[Convert]::ToString(([uint16]$o=$w[$_]),2))*5-replace0,' '-replace1,'*'
+
no"{0:D16}"-f+[Convert]
? Ele não funciona sem ele, mas não consigo entender o que faz.[convert]::ToString()
retorna uma string. As+
forças de um elenco para um[int]
modo que-f
pega o tipo de parâmetro correto para oD16
ao trabalho.+'1'
como uma operação aritmética válida sem primeiro summand, moldesstring
paraint
e retorna o resultado? Grande Scott!Bash + coreutils,
172148 bytes24 bytes salvos graças a @zeppelin , muito obrigado
A primeira linha descomprime o seguinte padrão composto por 6 ondas consecutivas:
Em seguida, o loop desliza uma janela de 80 bytes de largura por esse padrão.
fonte
*> <> ,
251250251 bytes (não concorrente)Nota:
"H;0["
é suposto ter ascii27
depois[
.Experimente aqui! (defina o atraso para 0 ms)
Não acredito que acabei fazendo isso com sucesso. Isso usa as instruções
I
eD
, que aumentam ou diminuem a pilha selecionada. Isso demonstra que provavelmente é possível fazer isso em pura> <> (menos o sono) ou em uma resposta competitiva *> <>, embora provavelmente seja muito mais difícil de fazer.A versão do intérprete on-line é diferente simplesmente para limpar a saída usando um retorno de carro.
Isto é não concorrentes, porque os
I
,D
,C
, eR
instruções são mais jovens do que o desafio. Provavelmente isso é possível sem essas instruções, mas seria muito difícil / longo.Edit: Eu realmente consegui remover um byte, mas também notei que medi o tamanho errado, então, na verdade, ganhei um byte.
Eu farei o meu melhor para quebrar as etapas e explicar o que está acontecendo aqui ...
Explicação
Índice
Inicialização
Aqui construímos as 6 linhas que constroem as ondas. Precisamos repetir cada corda 5 vezes para ter o comprimento correto.
Começamos com 6, um para cada linha da onda:
E entramos no loop principal após a inicialização
09.
.Copiar pilha atual 4 vezes
Esta é uma função simples que simplesmente pega a pilha atual e a copia 4 vezes. Então "a" se tornaria "aaaaa".
Pilha de cópias
Isso copia a pilha atual, acrescentando a cópia à pilha atual.
Configuração
Ir para pular a inicial
<
e inverter a primeira linha para se tornar,l:&0v
pois é a ordem em que é executada após as<
alterações na direção do IP.Daqui em diante, o comprimento será referido como
n
e o0
asi
.Ciclo
Limpar
Loop principal
Aqui é onde o código funciona para sempre, redesenhando constantemente as ondas entre 100ms e dorme.
Configuração
Ciclo
fonte
PHP, 128 bytes
Não é possível animar mais de uma linha, mas ela rola.
Adicione
,0
à matriz uma linha vazia entre iterações. Corra com-r
.fonte
Mathematica, 213 bytes
Não vejo nenhuma maneira de jogar golfe no padrão de ondas do Mathematica além de começar com uma lista de strings para cada linha. I inicializar
i
ser0
e agendar uma tarefa para incrementá-lo a cada0.1
segundos. Eu tambémDynamic
exibo o resultado do seguinte:StringRepeat
cada linha 5 vezes.Characters
.RotateRight
cada lista de caracteres pori
.Grid
.fonte
C (unix),
231191bytesIsso funcionará apenas em ambientes unix. Além disso, desculpe o fato de que o sono aceita apenas números inteiros ... para atrasar 1 segundo entre os quadros.
Versão não destruída:
Versão Golfed:
fonte
Javascript (ES6),
152147145 bytesfonte
setInterval(a=>{...},100,6)
e mais 4 comf+=" *"[[...][a]&1<<(i+x)%16]
.Perl 6,
140138137 137120120 bytesSoluções antigas:
fonte
Python 3,
240239230 bytes-1 byte graças a @redstarcoder
-9 bytes graças a @PascalvKooten
fonte
print("\x1b[0;H")
também funciona para mim para -1 byte.' **'
por' '*13+'**'
e pode ter 1 recuos de caracteres enquanto isso, sem a necessidade de ter 4 caracteres.Raquete 295 bytes
Ungolfed:
Testando:
Resultado:
(Essa exibição do arquivo gif é mais lenta que a saída real).
fonte
Python 2,
207202 bytesNormalmente, sou desenvolvedor de C #, portanto, talvez ainda não esteja completamente interessado nisso ...
fonte
C #, 327 bytes
Mais ou menos uma versão portada da minha solução em Python ...
fonte
Perl, 110 bytes
Requer
-E
sem custo extra. Isso contém caracteres não imprimíveis.Crie os dados acima usando o hexdump reversível abaixo. Execute
xxd -d > sea.pl
em um linux ou terminal compatível, cole o abaixo e pressione Ctrl+ d, depois executeperl -E "$(cat sea.pl)"
.Uso
Para facilitar a cópia / colagem, use o seguinte:
Explicação
Uma solução bastante simples que armazena a onda como uma string no início, que é
unpack
editada em binária, cada seção é quintuplicada,0
s são convertidos em espaços e1
s são convertidos em*
s. Agora temos a string inteira, então inserimos umredo
loop que imprime a string inteira, depois esperamos 0,1 segundos e, para cada linha da string, movemos o último caractere para o início da string.fonte
Mathematica 171 Bytes
A onda em si é um dado, então estou armazenando uma versão compactada de toda a onda no meu código. Eu posso armazenar uma única onda de maneira muito mais compacta,
\fð߀ᣀ恠耟
usando a representação binária, mas a sobrecarga de contagem de caracteres da descompressão é muito alta *.Aqui está o código:
Aqui está o código que eu usei para criar a versão compactada dos dados da onda:
Aqui está o código que eu preferiria usar para armazenar dados binários repetidos compactados como esta onda:
Como você pode ver, a sobrecarga para transformar os dados compactados novamente em uma sequência é muito cara para esse problema específico, embora uma única onda possa ser armazenada dessa maneira com 7 caracteres UTF e 15 bytes.
Aqui estava o código para determinar a sequência de caracteres UTF para armazenar uma única onda (s como acima).
fonte
Ruby
269217189185 Bytes-28 Bytes graças a @manatwork
-5 Bytes graças a @ropata
Normal
Golfe
fonte
do … end
→{ … }
e remova as novas linhas{
antes e depois}
; remova o espaço entresystem
e seu parâmetro; remova o,
último elemento do literal depois da matriz;.each
→.map
e remova o espaço entre ele e seu bloco de código; remova o espaço na frente deputs
;0..80
→0,80
(isso também é um erro, pois a expressão resulta em 81 caracteres);p=p+1==16?0: p+1
→p=-~p%16
.do … end
→{ … }
, ainda há necessidade daloop
palavra - chave. Este é o mais curto que recebo: pastebin.com/cg3gxnm4b=' '
(5 espaços em branco) no topo, em seguida, alterando a expressão de saída para' '*12+'** ', ' '*8+'**** ',b+'***** '+b,' ** ** '+b,' ** **'+b,'*'+b+b+'*****'
... (mas SE não está mostrando espaços repetidos corretamente em este comentário!)HTML + JS + jQuery, 10 + 233 = 243 bytes
O JavaScript apenas muda cada linha por 1 e altera o texto a cada 100 ms.
fonte