Imprimir uma onda sinusoidal (verticalmente)


42

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.


1
Amplitude de pico, amplitude de pico a pico ou amplitude de raiz quadrada?
DavidC

Amplitude de pico.
ace_HongKongIndependence 16/01

1
Tudo bem desenhar uma onda com apenas | se sem espaços?
Gelatina

1
Todas as respostas ainda são inválidas. Eles também param para a SIGKILL e não apenas para a SIGINT.
Max Ried

1
@ Max Ried bem, vou alterá-lo para "deve continuar para sempre, a menos que interrompido de outra forma".
ace_HongKongIndependence

Respostas:


12

APL (35)

(Sim, cabe em 35 bytes, aqui está uma codificação APL de 1 byte )

{∇⍵+⌈⎕DL.05⊣⎕←'|'↑⍨-21+⌈20×1○⍵×.1}1

Explicação:

  • {... }1: chame a função com 1 no início
  • 1○⍵×.1: perto o suficiente para o trabalho do governo sin(⍵×π÷30). ( 1○é sin).
  • -21+⌈20: normalize para o intervalo 1..40e negue
  • '|'↑⍨: pega os últimos Ncaracteres 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 volte 1. ( ⎕DLretorna a quantidade de tempo que realmente esperou, que será próximo 0.05, arredondando esse valor para cima 1).
  • ∇⍵+: adicione esse número ( 1) a e execute a função novamente.

2
Droga ... Eu pensei que funções trigonométricas, mais o atraso de tempo, deixariam vocês de fora
ace_HongKongIndependence

2
Aqui está um caractere de 33 caracteres:{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
Tobia

3
@ace LOL. Você deve verificar o APL, não é uma linguagem de novidade. É muito antigo e está em uso em grandes sistemas há décadas. É único, comparado a qualquer outra coisa. IMHO os símbolos tornam muito mais legível de que os derivativos somente ASCII (J)
Tobia

22

C, 74 73 70 69 67 caracteres

Solução de 67 caracteres com muitas boas idéias de @ugoren e outros:

i;main(j){main(poll(printf("%*c|\n",j=21+sin(i++*.1)*20,0),0,50));}

Solução de 69 caracteres com loop while em vez de recursão:

i;main(j){while(printf("%*c|\n",j=21+sin(i++*.1)*20,0))poll(0,0,50);}

Aproximando-se do território perl. :)


1
Isso foi inspirado na resposta C do próprio @ ace.
treamur

2
Eu acho que você poderia usar em 5E4vez de 50000.
Musiphil

2
Eu acho que você poderia usar * .1 em vez de / 10.
moala

1
@musiphil, eu também pensei em usar o 5E4, mas acontece que não funciona: sem mostrar o usleep()protótipo do compilador , você precisaria lançar explicitamente o 5E4.
treamur

2
Você pode cortar mais dois personagens movendo a atribuição para j para o printf, como este: printf("%*s\n",j=21+sin(i++*.1)*20,"|"). O tipo resultante ainda é int, portanto, é um argumento válido de largura de campo.
Art

12

Mathematica 121 104 80 67 64

n=1;While[0<1,Spacer[70 Sin[n Pi/32]+70]~Print~"|";Pause@.05; n++]

seno


pergunta diz para não usar o mathematica para plotá-lo. isso é diferente do que isso de alguma forma?
Malachi

13
@Malachi Sim. Isso usa o mathematica para calculá-lo, assim como qualquer outra resposta. Usar o mathematica para plotar seria dizer ao mathematica para plotar x=20*sin(pi*y/30)+20ou algo semelhante.
Justin

ok eu tenho o que você está dizendo que você agradecer pelo esclarecimento
Malaquias

1
E aqui está uma versão de 58 caracteresDo[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";Pause@.05,{n,18!}]
Ajasja

1
Im não um usuário Mathematica, mas eu acho que você pode mudar 1 == 1a 0 < 1diminuir 1 caractere.
CCP

11

Perl, 48 (68)

Versão do sono GNU: 48

print$"x(25+20*sin).'|
';$_+=.1;`sleep .05`;do$0

Plataforma cruzada: 68

use Time::HiRes"sleep";print$"x(25+20*sin).'|
';$_+=.1;sleep.05;do$0

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.


Salvei isso como um arquivo test.ple executei perl ./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.)
ace_HongKongIndependence

Eu acho que se eu alterasse o incremento de .105 para .1 eu venceria o ruby ​​com 56 caracteres!
precisa saber é o seguinte

@primo - minha concha sono faz fazer vezes menor do que 1 segundo ...
KevinColyer

man sleepunsigned 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 $dpara $_e, em seguida (25+20*sin), use e altere o \npara uma nova linha literal.
Primo

2
O @primo man 1 sleepem 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.
ace_HongKongIndependence

11

Perl - 64 (ou 60) bytes

A seguir, um comando shell específico do Windows:

`sleep/m50`,print$"x(20.5-$_*(32-abs)/12.8),'|
'for-32..31;do$0

A seguir, é utilizado um comando shell específico do GNU / Linux:

`sleep .05`,print$"x(20.5-$_*(32-abs)/12.8),'|
'for-32..31;do$0

Ambos em 64 bytes.

  • O período é 64.
  • A amplitude máxima é exatamente 20.
  • A curva é perfeitamente simétrica.
  • Todo período é idêntico.
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |

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:

`sleep/m50`,print$"x(20-$_*(31-abs)/12),'|
'for-31..30;do$0

Esta não é uma onda sinusoidal; são simplesmente parábolas (se eu leio seu código corretamente). (Se você pode representar isso com alguma onda sinusoidal, eu adoraria ver a função).
Justin

O seno é uma fórmula, se você replicar a fórmula, ainda é uma onda sinusoidal. e esta é provavelmente uma variante do Sine de alguma forma.
Malachi

8

Ruby 56

i=0
loop{puts" "*(20*Math.sin(i+=0.1)+20)+?|;sleep 0.05}

É permitido substituir por p?
Slicedpan

1
@ Slicedpan Acho que não vou, já que este é um desafio para desenhar algo. padicionará aspas duplas ao redor de cada linha e alterará o "desenho".
Daniero 17/01/14

7

Befunge 98 - 103 100

:1g:02p' \k:02gk,'|,a,$ff*:*8*kz1+:'<\`*
468:<=?ABDEFGGGHGGGFEDBA?=<:86420.,+)'&$#"!!! !!!"#$&')+,.02

Felicidades 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*empurra 8*225**2( 405000) e kzexecuta 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:

:::f`!4*jf2*-:::*:*9*\:*aa*:*:01p*-01g9*/a2*+\$\f`!4*j01-*b2*+:01p' \k:01gk,$'|,a,ff*:*8*kz1+:f3*`!3*j$e-

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 xpara pi * x / 30corresponder ao período solicitado aqui e, em seguida, multipliquei por 20para 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.

:f`!4*jf2*-

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 em x - 30vez de x.

:::*:*9*\:*aa*:*:01p*-01g9*/a2*+

é minha implementação da série taylor em x = 0, quando xé o valor na pilha.

\$\f`!4*j01-* 

nega o valor da série taylor se a série taylor precisar de ajuste.

b2*+

tornar a onda cosseno positiva; caso contrário, a impressão não funcionaria.

:01p' \k:01gk,$'|,a,

imprime a onda

ff*:*8*kz1+

improvisada, aguarde 50 milissegundos e depois aumente x

:f3*`!3*j$e-

Se xfor maior que 45, altere para -14 (novamente, ajuste de erro da série taylor).


Este é exatamente o tipo de resposta que eu estou olhando para a frente, espero que você pode golfe-lo para baixo :)
ace_HongKongIndependence

1
Lá! Reduzi com sucesso o comprimento do código em -5 caracteres! E ainda há espaço para melhorias!
Justin

@Quincunx minha solução perl também não usa funções trigonométricas embutidas;)
primo

6

Python, 108,93,90,8988

import math,time
a=0
while 1:print" "*int(20+20*math.sin(a))+"|";time.sleep(.05);a+=.1

Agora com rolagem infinita :)

Edit: ok, 90. Chega?

Editar: Editar: não, 89.

Edit: Edit: Edit: 88 graças a boothby .


Desculpe se eu não ter feito a pergunta clara - o programa não deve terminar e deve continuamente rolar a onda (exceto até SIGINT)
ace_HongKongIndependence

1
a=0.-> a=0você fica a 88
Boothby

5

PHP, 59 caracteres

<?for(;;usleep(5e4))echo str_pad('',22+20*sin($a+=.1)).~ƒõ;

1
Você pode economizar alguns bytes usando echo ...;no lugar de fwrite(STDOUT,...);.
primo

Isso faz sentido ao chamar da linha de comando de qualquer maneira. 10 caracteres salvos - obrigado primo.
Alex Barrett

1
58:<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
primo

Muito agradável. Não vou editar minha resposta com essas alterações, você deve postar como sua.
Alex Barrett

1
@ace ele precisa ser salvo com uma codificação ansi. O ideone converte automaticamente tudo em utf-8, que quebra. ~ƒõé apenas uma abreviação de "|\n".
Primo

4

C64 BASIC, 64 PETSCII chars

insira a descrição da imagem aqui

Em um PAL C64, For i=0 to 2:next ialterna por aprox. 0,05 segundos, para que o tempo de atraso seja respeitado.


3

Javascript 88 76 78 caracteres

setInterval('console.log(Array(Math.sin(i++/10)*20+21|0).join(" ")+"|")',i=50)

Baseado no código de Kendall Frey.


Você nunca inicializa i, por isso imprime uma linha reta em vez de uma onda.
precisa saber é o seguinte

Meu erro ... Provavelmente funcionou porque eu já tinha executado o script do Kendall no meu console, então eu já fui inicializado.
joeytje50

3

C - 86 + 3 caracteres

Obrigado shiona e Josh pela edição

i;main(j){for(;j++<21+sin(i*.1)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}

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 -lmbandeira, suponho que preciso adicionar 3 caracteres


1
Funcionaria se você fizesse um int e apenas o dividisse por 10,0 (ou 9,9 para salvar um caractere?) Na chamada para sin ()? i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
shiona

Você pode diminuir o tamanho para 76 caracteres usando printf () para substituir o loop for:printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
treamur

1
Hmm ... eu me sentiria realmente culpado se usasse essa idéia na minha resposta, especialmente quando essa for minha própria pergunta ... Você consideraria postar uma resposta você mesmo?
ace_HongKongIndependence

Ok, vai fazer. Obrigado. :)
treamur

1
Você pode raspar mais dois personagens se remover o 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.
Josh Josh

3

Ti-Basic, 33 bytes

While 1:Output(8,int(7sin(X)+8),"!":Disp "":π/30+X→X:End

Existem as seguintes advertências :

  1. Devido à limitação da tela de 16x8, essa onda senoidal tem apenas uma amplitude de 7 (o período de 60 ainda é mantido)

  2. Devido à falta de uma maneira fácil de acessar o |char, !é usado

  3. Devido à falta de um cronômetro preciso do sistema, o atraso não é implementado. No entanto, a velocidade de execução parece aproximadamente correta.


1
Heh, como o TI-BASIC é contado em tokens de um / dois bytes, na verdade são 33 bytes (não "56 caracteres"), portanto, ele deveria ter vencido o desafio!
MI Wright

Exceto para a coisa amplitude ...
lirtosiast

Bem, sim, mas passando por bytes está tudo bem.
MI Wright

2

JavaScript - 88

setInterval(function(){console.log(Array(Math.sin(i++/10)*20+21|0).join(" ")+"|")},i=50)

Tenho certeza de que alguém pode inventar algo realmente inteligente.


2

J - 103,58,5754

Graças a caras incríveis do IRC

(0.1&+[6!:3@]&0.05[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0

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

($:+&0.1[6!:3@]&0.05[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0  

Onde $:é uma chamada recursiva.


Você se importaria de adicionar uma pequena explicação, para que pessoas não familiarizadas com a sintaxe J (como eu) também possam entender sua resposta?
ace_HongKongIndependence

É possível encurtar este a 50 caracteres por agitação sobre a estrutura do comboio: (+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.)0embora pareça durar mais tempo antes de chegar ao fundo do poço.
algorithmshark

2

Haskell - 75

main=putStr$concat["|\n"++take(floor$20+20*sin x)(repeat ' ')|x<-[0,0.1..]]

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):

import GHC.Conc
import Control.Monad
main=mapM_(\a->putStr a>>threadDelay 50000)(["|\n"++take(floor$20+20*sin x)(repeat ' ')|x<-[0,0.1..]])

2
A pausa foi um dos requisitos. Você também pode postar o código com a pausa?
Justin

Ok, eu postei. Desejo que Haskell permita que você pause o código sem importar.
Zaq

Por amplitude, quero dizer a amplitude de pico, ou seja, o dobro da amplitude do seu programa atual. Você pode alterar 20+20*sin xpara qualificar.
ace_HongKongIndependence

Ah com certeza. Acho que interpretei mal essa parte da pergunta.
Zaq 18/01/14

2

Caracteres do Perl 6: 46

sleep .05*say ' 'x(25+20*.sin),'|'for 0,.1...*

Crie um intervalo preguiçoso infinito usando 0,0.1 ... *, faça um loop sobre isso. sayretorna Bool::Trueque numera como 1 em multiplicação, desta forma eu posso mantê-lo em uma única instrução.


Eu posso ver o porquê sleepe .05tenho que ser separado. Mas eu me pergunto se o espaço entre saye ' 'é obrigatório?
Matthias

Sim: s say' 'say(' ')
Emite

1
@ Matthias: No Perl 6, os listops não precisam aceitar argumentos, ter um espaço após eles ou usar parênteses. Não é uma linguagem projetada para código de golfe, diferente do Perl 5 (mas contém muitos recursos internos agradáveis, por isso é utilizável).
precisa saber é o seguinte

@xfix Obrigado pela explicação. Eu gosto do idioma, mas ainda não o examinei completamente, porque ainda não posso usá-lo em um projeto de trabalho. No entanto, eu sempre planejo escrever alguns scripts Perl 6. @ Ayiko, eu aprecio seus Perl 6 posts :-)
Matthias

2

fugly Javascript - 77

i=setInterval("console.log(Array(Math.sin(i+=.1)*20+20|0).join(' ')+'|')",50)

e se fizermos isso no Firefox - 73

i=setInterval("console.log(' '.repeat(Math.sin(i+=.1)*20+20|0)+'|');",50)

e se somos desagradáveis ​​- 67

i=setInterval("throw(' '.repeat(Math.sin(i+=.1)*20+20|0)+'|');",50)

1

Scala, 92,8987

def f(i:Int){println(" "*(20+20*math.sin(i*.1)).toInt+"|");Thread sleep 50;f(i+1)};f(1)

(20+20*math.sin(i*.1))reduz em 1 char, assumindo que este é válido sintaxe (não tenho experiência com Scala)
ace_HongKongIndependence

Obrigado, mas acabo de descobrir que eu mesmo :)
ValarDohaeris

1

Python 3, 103

Imitações estúpidas de frikk'n ...

import time,math
t=0
while 1:t+=(.05+t<time.clock())and(print(' '*int(20+20*math.cos(t*1.9))+'|')or.05)

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á.


1

C #

[152] Personagens

namespace System{class P{static void Main(){for(var i=0d;;){Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|');Threading.Thread.Sleep(50);}}}}

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

for(var i=0d;;){Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|');Threading.Thread.Sleep(50);}

A outra resposta C # funciona em gmcs. Ele falha na compilação no início, mas acho que é porque existe algum caractere não imprimível no código-fonte. Depois de digitar novamente em um arquivo vazio, a compilação foi bem-sucedida.
ace_HongKongIndependence

Compiladores podem ser exigentes, não é?
Malachi

1

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.

Module Module1
Sub Main()
Dim i
While True
Console.WriteLine("{0:" & (40 + 20 * Math.Sin(i = i + 0.1)) & "}", "|")
Threading.Thread.Sleep(50)
End While
End Sub
End Module

1

C #

A Linha Mágica [91] Personagens

for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Thread.Sleep(50);

Programa de trabalho abaixo. [148] Personagens

namespace System{class P{static void Main(){for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Threading.Thread.Sleep(50);}}}

Desculpe se eu não esclareci a questão - seu programa não deve terminar e deve rolar a onda continuamente para baixo (exceto até SIGINT). Além disso, adicione uma contagem de caracteres.
ace_HongKongIndependence

Desculpe esqueci esse pedaço. Corrigido agora.
precisa saber é o seguinte

Eu acho que você pode perder "Thread.Sleep" se mudar "float" com var :) 117 caracteres. - Desculpe, não vi o tempo de espera .. 133 caracteres agora. 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);}}
Medeni Baykal

1
Não consigo compilar no VS2010, Threading.Thread.Sleep(50)estou fazendo algo errado?
Malachi

1
Eu era capaz de fazê-lo correr, mas eu tive que adicionar alguns suportes e Semi-e-vírgula e não têm a mesma aparência cada período
Malaquias

1

Bash + bc (para fazer as contas), 80

$ for((;;i++)){ printf "%$(bc -l<<<"a=20*s($i/10);scale=0;a/1+20")s|
";sleep .05;}
                |
                 |
                   |
                     |
                       |
                         |
                           |
                            |
                              |
                               |
                                |
                                 |
                                  |
                                   |
                                   |
                                   |
                                   |
                                   |
                                   |

1

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.

While 1
Output(8,int(8+7sin(Ans)),":
Disp "
.03π+Ans
End

Woah, não viu quantos anos esse desafio tinha! Estava indo para tentar golf isso mais (que é definitivamente possível), mas não é realmente vale a pena ...
MI Wright

By the way, .03πpode ser .1, que ainda está dentro do intervalo necessário.
lirtosiast

Boa captura, obrigado! Você vê alguma maneira de eu jogar o comando de saída? Além disso, como eu tenho um CSE, eu poderia obtê-lo na amplitude correta (tela de 26 caracteres) ao custo de alguns bytes.
MI Wright

Não, o comando de saída parece bom - pena que o Disp precise de uma cotação. A amplitude deve ser de 20 caracteres, na verdade, tornando o requisito de largura de tela 39. Portanto, funcionaria apenas na tela de gráfico, e não há uma maneira curta de fazer isso.
lirtosiast

1

Julia - 68

Edit: graças a ML e ás.

i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end

Bem, ele não pode competir contra APL, mas aqui está minha tentativa.

Saída:

                    |
                      |
                        |
                          |
                            |
                              |
                               |
                                 |
                                  |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                              |
                             |
                           |
                         |
                       |
                     |
                   |
                 |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
|
|
|
|
|
 |
 |
  |
   |
     |
      |
       |
         |
           |
             |
              |
                |
                  |
                    |
                      |
                        |
                          |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                 |
                                |
                              |
                            |
                          |
                        |
                      |
                    |
                  |
                 |
               |
             |
           |
         |
       |
      |
     |
   |
  |
  |
 |
|
|
|
|
|
 |
  |
  |
    |
     |
      |
        |
         |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                  |
                                 |
                               |
                              |
                            |
                          |
                        |
                      |
                    |
                  |
                |
              |
            |
           |
         |
       |
      |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
  |
   |
    |
     |
      |
        |
          |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                              |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                  |
                                 |
                               |
                             |
                            |
                          |
                        |
                      |
                    |
                  |
                |
              |
            |
          |
         |
       |
      |
    |
   |
  |
 |
 |
|
|
|
|
 |
 |
  |
   |
    |
     |
       |
        |
          |
            |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                      |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                      |
                                      |
                                     |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                       |
                     |
                   |

1
Eu não sei Julia, mas é possível usar .05, em vez de 0.05nos sleep?
ace_HongKongIndependence

Na verdade sim! Obrigado
CCP

Reduza para 68 caracteres : i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end——— sin(i/10)*20é igual a20sin(.1i)
ML

Eu não conheço Julia, mas você poderia usar um loop for repetindo todos os números naturais?
lirtosiast

1

MATLAB, 81 bytes

t=0;while(fprintf('%s\n',i))i=[];t=t+1;i(fix(21+20*sind(t*6)))='|';pause(.05);end

Eu abusei do fato de isempre ser inicializado no MATLAB, o que significava que eu poderia colocar o fprintfna whiledeclaração sem inicializar iprimeiro. 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).


"Eu abusei do fato de eu sempre ser inicializado no MATLAB, o que significava que eu poderia colocar o fprintf na instrução while sem inicializá-lo primeiro". Realmente inteligente! +1!
Stewie Griffin

0

F # - 90 79 77 76

Aqui está uma solução usando recursão

let rec f x=printfn"%*c"(int(20.*sin x)+21)'|';Thread.Sleep 50;f(x+0.1)
f 0.

Provavelmente poderia ser melhorado ainda mais.


Sem saber nada sobre F #, eu estou supondo que Thread.Sleep espera um valor em ms, assim você pode se livrar de um dos 0 e fazer Thread.Sleep 50. :)
ValarDohaeris

@ValarDohaeris Você está certo. Eu interpretei mal os requisitos.
Pwg

0

AutoHotkey 176

SetKeyDelay,-1
run Notepad.exe
WinWaitActive, ahk_class Notepad
p:=0
loop
{
sleep 50
p+=Mod(Floor(A_index/40),2)?-1:1,t:=""
loop % p
t .= " "
sendinput % t "|`n"
}
esc::Exitapp

Execute o script. Abre o bloco de notas e imprime os caracteres. Pressione Esc a qualquer momento para sair.


0

Clojure, 121

Versão curta:

(loop[a 0](println(clojure.string/join(repeat(int(+ 20 (* 20 (Math/sin a)))) " ")) \|)(Thread/sleep 50)(recur(+ a 0.1)))

Versão bonita:

(loop [a 0]
  (println (clojure.string/join (repeat (int (+ 20 (* 20 (Math/sin a)))) " ")) \|)    
  (Thread/sleep 50)
  (recur(+ a 0.1)))

O período é 64.

Digite isso lein replou salve no arquivo sin.clje execute com lein exec sin.clj(requer o plugin lein-exec).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.