Imprima uma onda sinusoidal contínua rolando verticalmente em um terminal. O programa não deve terminar e deve rolar a onda continuamente para baixo (exceto até que de alguma forma seja interrompida). Você pode assumir que o estouro não é um problema (ou seja, você pode usar loops infinitos com contadores crescentes ou recursão infinita).
A onda deve satisfazer as seguintes propriedades:
- Amplitude = 20 caracteres (amplitude de pico)
- Período = 60 a 65 linhas (inclusive)
- A saída deve consistir apenas em espaços, nova linha e
|
- Após cada linha de saída, faça uma pausa de 50ms
Saída de amostra:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A saída acima deve durar para sempre, a menos que seja interrompido de outra forma, por exemplo, SIGINT ou SIGKILL, ou fechar a janela do terminal, ou você desligue sua máquina, ou o Sol engula a Terra, etc.
O menor código vence.
Nota. Estou ciente de um problema semelhante no Display Scrolling Waves, mas isso não é exatamente o mesmo. No meu problema, a onda não deve ser rolada "no lugar" - basta imprimi-la em um terminal. Além disso, esse é um problema artístico, portanto, não use o Mathematica para plotá-lo.
fonte
Respostas:
APL (35)
(Sim, cabe em 35 bytes, aqui está uma codificação APL de 1 byte )
Explicação:
{
...}
1: chame a função com 1 no início1○⍵×.1
: perto o suficiente para o trabalho do governosin(⍵×π÷30)
. (1○
ésin
).-21+⌈20
: normalize para o intervalo1..40
e negue'|'↑⍨
: pega os últimosN
caracteres da sequência'|'
(o que resulta em uma sequência de espaços com um|
no final⎕←
: exibição⌈⎕DL.05
: aguarde 50 ms e volte1
. (⎕DL
retorna a quantidade de tempo que realmente esperou, que será próximo0.05
, arredondando esse valor para cima1
).∇⍵+
: adicione esse número (1
) a⍵
e execute a função novamente.fonte
{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
C,
7473706967 caracteresSolução de 67 caracteres com muitas boas idéias de @ugoren e outros:
Solução de 69 caracteres com loop while em vez de recursão:
Aproximando-se do território perl. :)
fonte
5E4
vez de50000
.usleep()
protótipo do compilador , você precisaria lançar explicitamente o 5E4.printf("%*s\n",j=21+sin(i++*.1)*20,"|")
. O tipo resultante ainda é int, portanto, é um argumento válido de largura de campo.Mathematica
121 104 80 6764fonte
x=20*sin(pi*y/30)+20
ou algo semelhante.Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";[email protected],{n,18!}]
1 == 1
a0 < 1
diminuir 1 caractere.Perl, 48 (68)
Versão do sono GNU: 48
Plataforma cruzada: 68
Removido o uso do módulo Time :: HiRes usando a função de suspensão do shell. Incremento reduzido conforme o exemplo do Ruby. Encurtado usando $ "e $ 0, vendo dicas do trabalho de Primo Obrigado pelas dicas Primo.
fonte
test.pl
e executeiperl ./test.pl
, no entanto, o tempo de espera não corresponde à especificação. Além disso, a amplitude da onda é muito pequena. (Isto refere-se a amplitude do comprimento entre o pico e a posição de equilíbrio.)man sleep
→unsigned int sleep(unsigned int seconds);
. Não haverá erro, mas o intervalo de suspensão real é zero. Algumas sugestões para tornar a sua mais curta: altere$d
para$_
e, em seguida(25+20*sin)
, use e altere o\n
para uma nova linha literal.man 1 sleep
em um shell bash do GNU / Linux nos diz queUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
Perl - 64 (ou 60) bytes
A seguir, um comando shell específico do Windows:
A seguir, é utilizado um comando shell específico do GNU / Linux:
Ambos em 64 bytes.
Observe que essa não é exatamente uma onda sinusoidal, mas uma interpolação quadrática. Traçados contra um pecado real:
Na granularidade requerida, elas são visualmente indistinguíveis.
Se a estética não é tão importante, ofereço uma alternativa de 60 bytes , com duração de período 62, amplitude máxima de ~ 20,02 e pequenas assimetrias:
fonte
Ruby 56
fonte
p
adicionará aspas duplas ao redor de cada linha e alterará o "desenho".Befunge 98 -
103100Felicidades para um programa que faz isso, em um idioma sem capacidades trigonométricas; o primeiro programa de fato. A segunda linha é simplesmente dados; o caractere correspondente ao valor ascii do pecado, adicionado a um caractere de espaço.
Edição: eu salvei 3 caracteres, não subtraindo o espaço; o sinusóide é traduzido 32 unidades para a direita (o que é válido).
O Befunge também não possui um comando de suspensão ou algo semelhante. Seria bom encontrar uma impressão digital, mas não consegui encontrar uma, então
ff*:*8*
empurra8*225**2
(405000
) ekz
executa um noop tantas vezes (bem, tantas vezes + 1). Na linha de comando do Windows com pyfunge , isso acaba sendo de cerca de 50 milissegundos, então eu digo que sou bom. Nota: se alguém souber uma boa impressão digital, informe-me.A última parte do código simplesmente verifica se o contador (para a linha de dados) passou dos dados; se estiver, o contador é redefinido para 0.
Eu usei isso para gerar os dados.
Taylor Series
Embora esta versão tenha 105 caracteres, eu apenas precisei incluí-la:
Eu estava tentando encurtar meu programa e decidi olhar para a série de taylor em busca de cosseno (o seno é mais difícil de calcular). Mudei
x
parapi * x / 30
corresponder ao período solicitado aqui e, em seguida, multipliquei por20
para corresponder à amplitude. Fiz algumas simplificações (fatores ajustados para cancelar, sem alterar muito o valor da função). Então eu implementei. Infelizmente, não é uma implementação mais curta.verifica se os valores da série taylor estão ficando imprecisos (sobre
x = 15
). Se eles são, então eu calculo a série de taylor emx - 30
vez dex
.é minha implementação da série taylor em
x = 0
, quandox
é o valor na pilha.nega o valor da série taylor se a série taylor precisar de ajuste.
tornar a onda cosseno positiva; caso contrário, a impressão não funcionaria.
imprime a onda
improvisada, aguarde 50 milissegundos e depois aumente
x
Se
x
for maior que 45, altere para -14 (novamente, ajuste de erro da série taylor).fonte
Python,
108,93,90,8988Agora com rolagem infinita :)
Edit: ok, 90. Chega?
Editar: Editar: não, 89.
Edit: Edit: Edit: 88 graças a boothby .
fonte
a=0.
->a=0
você fica a 88PHP, 59 caracteres
fonte
echo ...;
no lugar defwrite(STDOUT,...);
.<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
~ƒõ
é apenas uma abreviação de"|\n"
.C64 BASIC, 64 PETSCII chars
Em um PAL C64,
For i=0 to 2:next i
alterna por aprox. 0,05 segundos, para que o tempo de atraso seja respeitado.fonte
Javascript
887678 caracteresBaseado no código de Kendall Frey.
fonte
i
, por isso imprime uma linha reta em vez de uma onda.C - 86 + 3 caracteres
Obrigado shiona e Josh pela edição
i; main (j) {para (j = 0; j ++ <20 + sin (i / 10.) * 20;) putchar (32); puts ("|"); usleep (50000); i ++; main () ;}float i; main (j) {for (j = 0; j ++ <20 + sin (i) * 20;) putchar (32); puts ("|"); usleep (50000); i + = 0,1; main ( );}Compilado com a
-lm
bandeira, suponho que preciso adicionar 3 caracteresfonte
i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
j=0
:i;main(j){for(;j++<21+sin(i/10.)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}
. Isso se baseia na suposição de que o programa é chamado com 0 argumentos.Ti-Basic, 33 bytes
Existem as seguintes advertências :
Devido à limitação da tela de 16x8, essa onda senoidal tem apenas uma amplitude de 7 (o período de 60 ainda é mantido)
Devido à falta de uma maneira fácil de acessar o
|
char,!
é usadoDevido à falta de um cronômetro preciso do sistema, o atraso não é implementado. No entanto, a velocidade de execução parece aproximadamente correta.
fonte
JavaScript - 88
Tenho certeza de que alguém pode inventar algo realmente inteligente.
fonte
J -
103,58,5754Graças a caras incríveis do IRC
Em palavras da direita para a esquerda, lê-se: a partir de 0 infinitas vezes: sin, adicione 1, multiplique por 20, floor, acrescente 1 (para que se torne uma matriz de 2 elementos), copie dois bytes '|' correspondentemente, imprima, aguarde 0,05s e adicione 0,1
Em vez de loop infinito, podemos usar a recursão, ele salvaria 2 caracteres, mas também produzirá um erro de pilha após algumas iterações
Onde
$:
é uma chamada recursiva.fonte
(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0
. A versão de recursão salva apenas 1 caractere dessa vez,$:@(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0
embora pareça durar mais tempo antes de chegar ao fundo do poço.Haskell - 75
Infelizmente, não consegui fazer o programa pausar 50 ms sem dobrar minha contagem de caracteres, por isso apenas inunda o console, mas produz a onda senoidal.
Aqui está o código completo com a pausa (138 caracteres com novas linhas):
fonte
20+20*sin x
para qualificar.Caracteres do Perl 6: 46
Crie um intervalo preguiçoso infinito usando
0,0.1 ... *
, faça um loop sobre isso.say
retornaBool::True
que numera como 1 em multiplicação, desta forma eu posso mantê-lo em uma única instrução.fonte
sleep
e.05
tenho que ser separado. Mas eu me pergunto se o espaço entresay
e' '
é obrigatório?say' '
say(' ')
fugly Javascript - 77
e se fizermos isso no Firefox - 73
e se somos desagradáveis - 67
fonte
Scala,
92,8987fonte
(20+20*math.sin(i*.1))
reduz em 1 char, assumindo que este é válido sintaxe (não tenho experiência com Scala)Python 3, 103
Imitações estúpidas de frikk'n ...
Em vez de "dormir", essa implementação funciona na CPU, porque o Python facilita a obtenção de um clock da CPU de ponto flutuante em vez do relógio de parede. Essa abordagem não supera o friol , mas é divertido, então eu estou deixando para lá.
fonte
C #
[152] Personagens
Não consegui obter a resposta C # existente para Executar e não pude reduzir a votação porque não tenho reputação suficiente
faltavam algumas
{
e)
depois da declaração For Loop.Eu acho que a variação na aparência da onda quando ela é executada é por causa da maneira como estamos tentando exibir essa onda.
se não estivermos contando o espaço para nome e a declaração do método, seriam [104] caracteres para a versão de trabalho
fonte
VB
[236][178]Não tenho certeza de como você contaria as guias, peguei a contagem do Notepadd ++ antes de colar aqui. as novas linhas são obrigatórias, provavelmente por que ninguém gosta de usá-las no golfe com código.
fonte
C #
A Linha Mágica [91] Personagens
Programa de trabalho abaixo. [148] Personagens
fonte
using System;class P{static void Main(){for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Thread.Sleep(50);}}
Threading.Thread.Sleep(50)
estou fazendo algo errado?Bash + bc (para fazer as contas), 80
fonte
TI-BASIC, 30 bytes
Melhoria de tamanho pequeno em relação à outra resposta, ao custo de alguma precisão. Observe que a TI-Basic possui tecnicamente o | caractere, mas você deve transferi-lo via computador ou usar um programa de montagem para acessá-lo.
fonte
.03π
pode ser.1
, que ainda está dentro do intervalo necessário.Julia - 68
Edit: graças a ML e ás.
Bem, ele não pode competir contra APL, mas aqui está minha tentativa.
Saída:
fonte
.05
, em vez de0.05
nossleep
?i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end
———sin(i/10)*20
é igual a20sin(.1i)
MATLAB, 81 bytes
Eu abusei do fato de
i
sempre ser inicializado no MATLAB, o que significava que eu poderia colocar ofprintf
nawhile
declaração sem inicializari
primeiro. Isso significa que o programa gera primeiro uma linha vazia, mas acho que isso não é proibido nas especificações.Além disso, abusa do fato de o Matlab ignorar a maioria dos caracteres de controle ASCII, imprimindo um espaço em vez de NULL (também para a primeira linha vazia).
fonte
F # -
90797776Aqui está uma solução usando recursão
Provavelmente poderia ser melhorado ainda mais.
fonte
AutoHotkey 176
Execute o script. Abre o bloco de notas e imprime os caracteres. Pressione Esc a qualquer momento para sair.
fonte
Clojure, 121
Versão curta:
Versão bonita:
O período é 64.
Digite isso
lein repl
ou salve no arquivosin.clj
e execute comlein exec sin.clj
(requer o plugin lein-exec).fonte