Sinüzoidal bir dalga yazdırın (dikey olarak)


42

Bir terminal üzerinde dikey kaydırma sürekli sinüzoidal dalga yazdırın. Program sonlandırılmamalı ve dalgayı sürekli olarak aşağı kaydırmalıdır (bir şekilde kesilmediği sürece). Taşma probleminin olmadığını düşünebilirsiniz (yani, artan sayaçları olan sonsuz döngüler veya sonsuz özyineleme kullanabilirsiniz).

Dalga aşağıdaki özellikleri sağlamalıdır:

  • Genlik = 20 karakter (en yüksek genlik)
  • Dönem = 60 - 65 satır (dahil)
  • Çıktı yalnızca boşluklardan, yeni satırdan ve |
  • Her çıktı satırından sonra 50ms durakla

Örnek çıktı:

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

SIGINT veya SIGKILL veya kapatma terminali penceresini, aksi halde kesintiye uğramadıkça, yukarıdaki çıkış sonsuza kadar devam etmelidir.

En kısa kod kazanır.

Not. Ekran Kaydırma Dalgaları'ndaki benzer bir sorunun farkındayım, ancak bu tam olarak aynı değil. Benim sorunumda, dalga "yerinde" kaydırılmamalıdır - sadece bir terminale çıkar. Ayrıca, bu bir sanat sorunu, bu yüzden onu çizmek için Mathematica'yı kullanmayın.


1
Tepe genliği, tepe-tepe genliği veya kök kare genliği?
DavidC


1
Sadece | s ile boşluk içermeyen bir dalga çizmek uygun mudur?
Jelatin

1
Henüz tüm cevaplar geçersiz. Ayrıca SIGKILL için de sadece SIGINT için değil.
Max Ried

1
@ Max Ried para cezası, "Aksi kesinti olmadıkça sonsuza dek devam etmeli" olarak değiştireceğim.
ace_HongKongIndependence

Yanıtlar:


12

APL (35)

(Evet, 35 bayta sığar, işte 1 bayt APL kodlaması )

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

Açıklama:

  • {... }1: En başında 1 olan işlevi çağırın
  • 1○⍵×.1: devlet işleri için yeterince yakın sin(⍵×π÷30). ( 1○is sin).
  • -21+⌈20: menzile göre normalleştirmek 1..40ve olumsuzlamak
  • '|'↑⍨: Ndizedeki son karakterleri alır '|'( |sonunda bir boşluk olan bir dizeyle sonuçlanır).
  • ⎕←: Görüntüle
  • ⌈⎕DL.05: 50 ms bekle ve geri dön 1. ( ⎕DLgerçekte beklediği, yakınına yaklaşacak 0.05, o değeri yukarı yuvarlamaların verdiği miktarı geri döndürür 1).
  • ∇⍵+: bu sayıyı ( 1) ekleyin ve işlevi tekrar çalıştırın.

2
Kahretsin ... Trigonometrik fonksiyonların artı zaman gecikmesinin sizi dışarıda bırakacağını düşündüm
ace_HongKongIndependence 17:14

2
İşte 33 karakter biri:{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
Tobia

3
@ ace LOL. APL'yi kontrol etmelisin, bu bir yenilik dili değil. Çok eski ve uzun yıllar boyunca büyük sistemlerde kullanılıyor. Başka bir şeyle karşılaştırıldığında oldukça benzersiz. IMHO semboller çok daha okunabilir hale bu yalnızca ASCII türevleri (J)
Tobia

22

C 74 73 70 69 67 karakter

@Ugoren ve diğerlerinden birçok iyi fikirle 67 karakter çözümü:

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

Özyineleme yerine while döngüsü ile 69 karakter çözümü:

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

Perl bölgesine yaklaşıyor. :)


1
Bu, @ ace'ın kendi C cevabından ilham aldı.
14'te treamur

2
Bunun 5E4yerine kullanabileceğini düşünüyorum 50000.
musiphil

2
Sanırım / 10 yerine * .1 kullanabilirsiniz.
moala

1
@ musiphil, 5E4'ü kullanmayı da düşündüm, ama işe yaramadığı ortaya çıktı: Derleyici usleep()prototipini göstermeden, açıkça 5E4'ü atmanız gerekecekti.
Ocak'ta 14:32

2
Böyle, printf içine j atama hareket ettirerek iki daha fazla karakter kesebilirsiniz: printf("%*s\n",j=21+sin(i++*.1)*20,"|"). Sonuçta ortaya çıkan tür hala int olduğundan, geçerli bir alan genişliği argümanıdır.
Sanat

12

Mathematica 121 104 80 67 64

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

sinüs


soru, onu çizmek için matematiği kullanmamayı söylüyor. bu bir şekilde bundan farklı mı?
Malaçi

13
@Malachi Evet. Bu, diğer herhangi bir cevap gibi, onu hesaplamak için matematiği kullanır. Çizim için matematiği kullanmak, matematiğe arsa x=20*sin(pi*y/30)+20veya benzer bir şeyi söylemek anlamına gelir .
Justin

tamam söylediklerini alıyorum açıklama için teşekkür ederim
Malachi

1
Ve burada 58 karakter versiyonuDo[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";Pause@.05,{n,18!}]
Ajasja,

1
Im değil Mathematica kullanıcı, ama sen değiştirebilir düşünmek 1 == 1için 0 < 11 kömürü azaltmak için.
ÇKP

11

Perl, 48 (68)

GNU uyku sürümü: 48

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

Çapraz platform: 68

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

Time :: HiRes modülünün kullanımı kabuk uyku işlevini kullanarak kaldırıldı. Ruby örneğine göre kısaltılmış artış. Primo'nun çalışmalarından çıkan ipuçlarını görmek için $ "ve $ 0 kullanarak kısaltıldı İpuçları için teşekkür ederiz Primo.


Bunu bir dosya olarak sakladım test.plve koştum perl ./test.pl, ancak bekleme süresi özelliklere uymuyor. Ayrıca, dalganın genliği çok küçük. (Bu genlik, tepe ile denge konumu arasındaki uzunluğu ifade eder.)
ace_HongKongIndependence

Sanırım artışı 0,105'den 0,1'e değiştirirsem 56 karakterde yakutu yenerdim!
KevinColyer

@primo - benim kabuk uyku 1 saniyeden daha kısa sürüyor ...
KevinColyer

man sleepunsigned int sleep(unsigned int seconds);. Hata vermez, ancak gerçek uyku aralığı sıfırdır. Değişikliği: Bazı öneriler seninkini kısaltmak için $diçin $_, ve sonra kullanmak (25+20*sin)ve değiştirmek \nbir hazır Yenisatır için.
primo

2
@primo man 1 sleepbir GNU / Linux bash kabuk üzerinde söylerUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
ace_HongKongIndependence

11

Perl - 64 (veya 60) bayt

Aşağıdaki, Windows'a özgü bir kabuk komutu kullanır:

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

Aşağıdaki GNU / Linux'a özel bir kabuk komutu kullanır:

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

Her ikisi de 64 baytta.

  • Dönem 64.
  • Maksimum genlik tam olarak 20'dir.
  • Eğri tamamen simetriktir.
  • Her dönem aynıdır.
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |

Bunun tam olarak sinüzoidal bir dalga olmadığını, ancak ikinci dereceden bir enterpolasyon olduğunu unutmayın. Gerçek bir günah karşı çizilir:

Gereken ayrıntı düzeyinde, bunlar görsel olarak ayırt edilemez.

Eğer estetik o kadar önemli değilse, 60 no'lu bir alternatif, periyot uzunluğu 62, maksimum ~ 20.02 genlik ve hafif asimetriler sunarım:

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

Bu sinüzoidal bir dalga değil; bu sadece parabollerdir (eğer kodunuzu doğru okursam). (Bunu bir sinüzoidal dalga ile gösterebilirseniz, işlevi görmeyi çok isterim).
Justin

Sinüs bir formüldür, eğer formülü kopyalarsanız, o hala bir Sinusoidal dalgadır. ve bu muhtemelen bir şekilde Sine'nin bir çeşididir.
Malachi

8

Yakut 56

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

P'leri p ile değiştirmek mümkün mü?
Dilimlenmiş patates

1
@Slicedpan Yapmayacağımı düşünüyorum, çünkü bu bir şeyler çizmek için zor bir görev. pHer çizginin etrafına çift tırnak işareti ekler ve "çizimi" değiştirir.
daniero

7

Befunge 98 - 103 100

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

Bunu yapan bir program için alkışlar, trigonometrik yetenekleri olmayan bir dilde; Aslında ilk program. İkinci satır sadece veridir; günahın ascii değerine karşılık gelen karakter boşluk karakterine eklenir.

EDIT: Boşluğu çıkarmadan 3 karakter kurtardım; sinüzoid sağa 32 birim çevrilir (bu geçerlidir).

Befunge'nin aynı zamanda bir uyku komutu veya benzeri bir özelliği yoktur. Bir parmak izi bulmak güzel olurdu, ama bir tane bulamadım, bu yüzden ff*:*8*iter 8*225**2( 405000) ve kzbir noop çalıştırır (pek çok kez + 1). Pyfunge ile Windows komut satırında , bu yaklaşık 50 milisaniye olduğu ortaya çıkıyor, bu yüzden iyiyim diyorum. Not: Bunun için iyi bir parmak izi bilen varsa, lütfen bana bildirin.

Kodun son kısmı, sayacın (veri hattı için) verilerin geçmiş olup olmadığını kontrol eder, öyleyse sayaç 0 olarak sıfırlanır.

Kullandığım bu verilerini oluşturmak için.


Taylor Serisi

Bu sürüm 105 karakter olmasına rağmen, sadece eklemek zorunda kaldım:

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

Programımı kısaltmaya çalışıyordum ve taylor serisine bakmaya karar verdim (sinüs hesaplaması daha zordur). Değiştim xiçin pi * x / 30süre sonra çarpılır, burada istenen maç için 20genliği eşleşecek. Bazı basitleştirmeler yaptım (işlevin değerini çok fazla değiştirmeden iptal etmenin faktörlerini değiştirdim). Sonra uyguladım. Ne yazık ki, daha kısa bir uygulama değil.

:f`!4*jf2*-

taylor serisinin değerlerinin yanlış olup olmadığını kontrol eder (yaklaşık x = 15). Eğer öyleyse, o zaman x - 30bunun yerine taylor serisini hesaplarım x.

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

Taylor serisi benim uygulama x = 0, ne zaman xyığındaki değeri.

\$\f`!4*j01-* 

taylor serisinin ayarlanması gerekiyorsa taylor serisinin değerini olumsuzlar.

b2*+

kosinüs dalgasını pozitif yapmak; Aksi takdirde, yazdırma çalışmaz.

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

dalgayı yazdırır

ff*:*8*kz1+

derhal 50 milisaniye bekle, sonra artış x

:f3*`!3*j$e-

Eğer x45 daha büyüktür, -14 (yine Taylor serisi hata düzeltmesi) olarak değiştirin.


Bu tam olarak dört gözle beklediğim bir cevap, umarım onu ​​aşağıya
çekersiniz

1
Orada! Kod uzunluğunu -5 karakter azalttım! Ve hala iyileştirme için yer var!
Justin

@ Quincunx perl çözümüm aynı zamanda dahili trig işlevlerini kullanmaz;)
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

Şimdi sonsuz kaydırma ile :)

Düzenleme: tamam, 90. Yeterince?

Düzenleme: Düzenleme: hayır, 89.

Düzenleme: Düzenleme: Düzenleme: 88, kabin sayesinde .


Soruyu açıklığa kavuşturmadıysam özür dilerim - programınız sonlandırılmamalı ve sürekli dalgayı aşağı kaydırmalıdır (SIGINT hariç)
ace_HongKongIndependence

1
a=0.-> a=088
yaşına girer

5

PHP, 59 karakter

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

1
echo ...;Yerine kullanarak bazı baytları kaydedebilirsiniz fwrite(STDOUT,...);.
primo

Zaten komut satırından çağırırken bu mantıklı. 10 karakter kaydedildi - teşekkürler primo.
Alex Barrett,

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

Çok hoş. Bu değişikliklerle cevabımı düzenlemeyeceğim, kendin olarak göndermelisin.
Alex Barrett,

1
@ace bir ansi kodlaması ile kaydedilmiş olması gerekiyor. ideone otomatik olarak her şeyi kesen utf-8'e dönüştürür. ~ƒõiçin sadece steno "|\n".
primo

4

C64 BASIC, 64 PETSCII karakterleri

görüntü tanımını buraya girin

Bir PAL C64'de, For i=0 to 2:next iyakl. 0,05 saniye, bu nedenle gecikme süresi dikkate alınır.


3

JavaScript 88 76 78 karakter

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

Kendall Frey'in koduna göre.


Asla başlatmazsınız i, bu nedenle dalga yerine düz bir çizgi yazdırır.
gilly3

Benim hatam ... Muhtemelen işe yaradı çünkü Kendall'ın senaryosunu zaten konsolumda okudum, bu yüzden zaten benim için başlatıldım.
joeytje50

3

C - 86 + 3 karakter

Düzenleme için teşekkürler shiona ve Josh

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

i, ana (j) {(j = 0; j ++ <20 + sin (i / 10) x 20;). putchar (32); koyar ( "|"); usleep (50000); i ++, ana () ;}

float i; main (j) {((j = 0; j ++ <20 + sin (i) * 20;) için putchar (32); koyar ("|"); usleep (50000); i + =. 1; main ( );}

İle Derleyen -lmbayrak, ben 3 karakter eklemek gerekir varsayıyorum


1
Eğer bir int yaptıysam ve sadece günah () çağrısı içinde 10.0 (ya da bir karakter kaydetmek için 9.9?) İle bölerseniz işe yarar mı? i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
shiona

For döngüsünü değiştirmek için printf () kullanarak boyutu 76 karaktere kadar printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
düşürebilirsiniz

1
Hmm ... Bu fikri cevabımda kullanırsam, özellikle de kendi sorum olduğunda ... gerçekten kendimi suçlu hissederdim.
ace_HongKongIndependence 16:14

Tamam yapacağım. Teşekkürler. :)
treamur

1
Eğer kaldırırsanız iki karakterden kapalı tıraş edebilirsiniz j=0: i;main(j){for(;j++<21+sin(i/10.)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}. Bu, programın 0 argümanla çağrıldığı varsayımına dayanır.
Josh

3

Ti-Basic, 33 bayt

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

Aşağıdaki uyarılar var :

  1. 16x8 ekran sınırlaması nedeniyle, bu sinüs dalgası sadece 7 genliğe sahiptir (60 periyodu hala korunur)

  2. Karaktere erişmek için kolay bir yol bulunmamasından dolayı |, !bunun yerine kullanılır.

  3. Doğru bir sistem zamanlayıcı eksikliği nedeniyle, gecikme uygulanmaz. Ancak, çalışma hızı yaklaşık olarak doğru görünüyor.


1
Heh, TI-BASIC bir / iki baytlık belirteçlerde sayıldığından, bu aslında 33 bayttır ("56 karakter" değil), bu yüzden aslında mücadeleyi kazanmalıydı!
MI Wright,

Genlik olayı hariç ...
lirtosiast

Evet, ama baytlara gitmek iyi.
MI Wright,

2

JavaScript - 88

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

Birisi gerçekten zeki olan bir şey bulabilirim eminim.


2

J - 103,58,5754

IRC'den müthiş adamlara teşekkürler

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

Sağdan sola yazılan sözcükler: 0 sonsuz zamandan başlayarak şunu yapın: sin, add 1, 20 ile çarp, floor, append 1 (böylece 2 eleman dizisi olur), iki bayt kopyalayın '|' Buna göre, yazdırın, 0.05 saniye bekleyin ve 0.1 ekleyin

Sonsuz döngü yerine özyineleme kullanabiliriz, 2 karakter kaydeder, ancak birkaç yinelemeden sonra da bir yığın hatası oluşturur.

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

$:Özyinelemeli arama nerede .


Küçük bir açıklama ekler misiniz, böylece J sözdizimini bilmeyen insanlar da (benim gibi) cevabınızı anlayabilirler mi?
ace_HongKongIndependence

Bu tren yapısı ile ilgili mızmızlanıyor 50 karakter bu kısaltmak mümkündür: (+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0. Özyinelemeli sürüm bu sefer sadece 1 karakter kaydeder, $:@(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0ancak dipten çekmeden önce daha uzun süre dayanır.
algorithmshark

2

Haskell - 75

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

Ne yazık ki, programın char sayımı iki katına çıkarmadan 50 ms duraklatmasını sağlayamadım, bu yüzden sadece konsola taşar, ancak sinüs dalgasını oluşturur.


İşte duraklatma kodunun tamamı (yeni hatlarla 138 karakter):

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
Duraklatma şartlardan biriydi. Kodu duraklatma ile de gönderebilir misiniz?
Justin

Tamam, gönderdim. Haskell'in kodu içe aktarmadan duraklatmanıza izin vermesini diliyorum.
Zaq

Genlik derken, en yüksek genlik, yani mevcut programınızın iki katı genlik anlamına gelir. Kalifiye olmak için değiştirmek isteyebilirsiniz 20+20*sin x.
ace_HongKongIndependence

Tabiiki. Sanırım sorunun bu bölümünü yanlış yorumladım.
Zaq

2

Perl 6: 46 karakter

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

Bunun 0,0.1 ... *üzerine döngü kullanarak sonsuz bir tembel Range oluşturun . çarpımda 1 olarak gösterilen saydöner Bool::True, bu şekilde tek bir ifadede tutabilirim.


Neden olduğunu sleepve .05ayrılması gerektiğini anlayabiliyorum . Ama arasındaki boşluk merak sayve ' 'zorunludur?
Matthias

Evet: s say' 'One'ın kullanabileceği "üst üste 2 terim" hatası veriyor say(' ')ama bu durumda 1 char fazladan ...
Ayiko

1
@Matthias: Perl 6'da listopların ya argüman almaması, ardında boşluk bırakması ya da parantez kullanması gerekir. Perl 5'in aksine kod golf için tasarlanmış bir dil değil (ancak birçok güzel yerleşik özellik içeriyor, bu yüzden kullanılabilir).
Konrad Borowski

@xfix Açıklama için teşekkür ederiz. Dili seviyorum ama henüz tam olarak anlamadım, çünkü henüz bir iş projesinde kullanamıyorum. Ancak, her zaman bazı Perl 6 betikleri yazmayı planlıyorum. @ Ayiko, Perl'in 6 mesajını takdir ediyorum :-)
Matthias

2

fugly Javascript - 77

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

ve eğer Firefox’ta yaparsak - 73

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

ve eğer yaramazsak - 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))bunun geçerli bir sözdizimi olduğunu farz ederek 1 karakter azaltıyor (Scala ile ilgili deneyimim yok)
ace_HongKongIndependence

Teşekkürler, ama daha yeni
öğrendim

1

Python 3, 103

Aptal frikk'n ithalatı ...

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

"Uyku" yerine, bu uygulama cpu'da taşlar çünkü python duvar saati yerine kayan nokta cpu saatini almayı kolaylaştırır. Bu yaklaşım friol'ları yenmeyecek , ama eğlenceli, ben de bırakıyorum.


1

C #

[152] Karakterler

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);}}}}

Mevcut C # cevabını Çalıştır seçeneğine alamadım ve oyu kaldıramadım çünkü yeterince ünüm yok

For Loop Deklarasyonundan sonra bir kaçını {kaçırıyordu ).

Çalıştığında dalganın görüntüsündeki varyansın, bu dalgayı göstermeye çalıştığımızdan kaynaklandığını düşünüyorum.


Eğer Namespace ve Method Beyanını saymazsak, o zaman çalışan versiyon için [104] karakter olur.

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

Diğer C # cevap gmcs üzerinde çalışır. İlk önce derleme başarısız olur, ancak kaynak kodunda yazdırılamayan bir karakter olduğundan dolayı olduğunu düşünüyorum. Boş bir dosyaya tekrar yazdıktan sonra derleme başarılı olur.
ace_HongKongIndependence 17:14

Derleyiciler seçici olabilir, ha?
Malachi

1

VB [236] [178]

sekmeleri nasıl satacağınızdan emin değilim, buraya yapıştırmadan önce sayımı Notepadd ++ 'dan aldım. newlines zorunludur, neden hiç kimse kodu golf oynamak için kullanmayı sevmiyor?

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 #

Sihirli Çizgi [91] Karakterler

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

Aşağıda Çalışma Programı. [148] Karakterler

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);}}}

Soruyu açıklığa kavuşturamadığım için üzgünüm - programınız sonlandırılmamalı ve dalgayı sürekli aşağı kaydırmalıdır (SIGINT hariç). Ayrıca, lütfen bir karakter sayımı ekleyin.
ace_HongKongIndependence 16:14

Üzgünüm o kısmı unuttum. Şimdi düzeltildi.
John ClearZ

Sanırım "Thread.Sleep" lerinizi kaybedebilir ve "float" değişkenini var :) 117 karakter ile değiştirebilirsiniz. - Üzgünüm bekleme süresini görmedim .. Şimdi 133 karakter. 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
VS2010 ile derlemek için bulamıyorum Threading.Thread.Sleep(50)yanlış bir şey yapıyorum?
Malachi

1
Çalıştırmayı başarabildim, ancak bazı Parantez ve Yarı-kolon eklemek zorunda kaldım ve her dönem aynı gözükmüyor
Malaçi

1

Bash + bc (matematik yapmak için), 80

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

1

TI-BASIC, 30 bayt

Diğer cevaplara göre küçük boyutta iyileştirme, bazı doğruluk pahasına. TI-Basic'in teknik olarak | karakter, ancak erişmek için bilgisayar üzerinden aktarmanız veya bir montaj programı kullanmanız gerekir.

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

Woah, bu zorluğun kaç yaşında olduğunu görmedim! Bu daha çok golf oynamaya çalışacaktı (ki bu kesinlikle mümkün) ama buna değmezdi ...
MI Wright

Bu arada, .03πolabilir .1gerekli aralık içinde hala olan.
lirtosiast

Güzel yakala, teşekkürler! Çıkış komutunu golf yapabilmemin bir yolunu gördün mü? Ayrıca, bir CSE'ye sahip olduğum için, bunu birkaç bayt pahasına doğru genliğe (26 karakterlik ekran) bulabilirim.
MI Wright,

Hayır, çıktı komutu iyi görünüyor - Disp'in bir fiyat teklifi alması çok kötü. Genlik, 20 karakter olmalı, aslında, ekran genişliği gereksinimini 39 yapmıştır. Bu yüzden sadece grafik ekranda çalışacak ve bunu yapmanın kısa bir yolu olmayacaktı.
lirtosiast

1

Julia - 68

Düzenleme: ML ve as sayesinde.

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

APL ile rekabet edemez, ama işte benim girişim.

Çıktı:

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

1
Julia'yı bilmiyorum ama kullanmak mümkündür .05yerine 0.05içinde sleep?
ace_HongKongIndependence 3

Aslında evet! Thanks
ÇKP

68 karaktere kadar azaltın : i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end——— sin(i/10)*20şuna eşittir20sin(.1i)
ML

Julia'yı tanımıyorum ama bunun yerine tüm doğal sayıları yineleyen bir for döngüsü kullanabilir misiniz?
lirtosiast

1

MATLAB, 81 bayt

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

Ben gerçeği istismar iben koymak anlamına geliyordu hep MATLAB'da başlatılır, fprintfiçinde whilebaşlatılıyor olmadan açıklamada iilk. Bu, programın önce boş bir satır çıktığı anlamına gelir, ancak teknik özelliklerde bunun yasak olmadığını düşünüyorum.

Ayrıca, Matlab'ın çoğu ASCII kontrol karakterini görmezden gelmesi, NULL yerine (ilk boş satır için de) boşluk bırakması gerçeğini kötüye kullanır.


“Her zaman MATLAB'da başlatıldığım gerçeğini kötüye kullandım, bu da ilk önce ifadeyi başlatmadan fprintf'i while ifadesine koyabileceğim anlamına geliyordu.” Gerçekten zeki! 1!
Stewie Griffin,

0

F # - 90 79 77 76

İşte özyineleme kullanarak bir çözüm

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

Muhtemelen daha da geliştirilebilirdi.


F # hakkında bir şey bilmeden, Thread.Sleep'in ms
cinsinden

@ValarDohaeris Haklısın. Gereklilikleri yanlış anladım.
pswg

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

Senaryoyu çalıştır. Not Defteri'ni açar ve karakterleri yazdırır. Çıkmak için istediğiniz zaman Esc tuşuna basın.


0

Clojure, 121

Kısa versiyon:

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

Güzel sürüm:

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

Dönem 64.

Bunu yazın lein replya da dosyaya kaydedin sin.cljve çalıştırın lein exec sin.clj(lein-exec eklentisini gerektirir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.