Mencetak gelombang sinusoidal (vertikal)

42

Cetak gelombang sinusoidal kontinu yang bergulir secara vertikal pada terminal. Program tidak boleh berhenti dan harus terus-menerus gulir ke bawah gelombang (kecuali sampai entah bagaimana terputus). Anda mungkin menganggap overflow bukan masalah (yaitu Anda dapat menggunakan loop tak terbatas dengan penghitung yang bertambah, atau rekursi tak terbatas).

Gelombang harus memenuhi properti berikut:

  • Amplitudo = 20 karakter (puncak amplitudo)
  • Periode = 60 hingga 65 baris (termasuk)
  • Output hanya terdiri dari spasi, baris baru dan |
  • Setelah setiap baris output, jeda selama 50 ms

Output sampel:

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

Output di atas akan berlangsung selamanya kecuali jika tidak terganggu, misalnya SIGINT atau SIGKILL, atau menutup jendela terminal, atau Anda mematikan mesin Anda, atau Matahari menelan Bumi, dll.

Kode terpendek menang.

Catatan. Saya mengetahui masalah serupa pada Display Scrolling Waves tetapi ini tidak persis sama. Dalam masalah saya, gelombang tidak boleh digulir "di tempat" - hanya output di terminal. Juga, ini adalah masalah ascii-art, jadi jangan gunakan Mathematica untuk merencanakannya.

ace_HongKongIndependence
sumber
1
Amplitudo puncak, amplitudo puncak ke puncak, atau amplitudo akar-kuadrat?
DavidC
Amplitudo puncak.
ace_HongKongIndependence
1
Apakah boleh menggambar gelombang dengan hanya | s dan tanpa spasi?
Gelatin
1
Semua jawaban belum valid. Mereka juga berhenti untuk SIGKILL bukan hanya untuk SIGINT.
Max Ried
1
@ Max Ried baik-baik saja, saya akan mengubahnya ke "harus berlangsung selamanya kecuali jika tidak terganggu".
ace_HongKongIndependence

Jawaban:

12

APL (35)

(Ya, itu cocok dalam 35 byte, ini adalah pengkodean APL 1-byte )

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

Penjelasan:

  • {... }1: panggil fungsi dengan 1 di awal
  • 1○⍵×.1: cukup dekat untuk pekerjaan pemerintah sin(⍵×π÷30). ( 1○adalah sin).
  • -21+⌈20: menormalkan ke kisaran 1..40dan meniadakan
  • '|'↑⍨: ambil Nkarakter terakhir dari string '|'(yang menghasilkan string spasi dengan tanda |di akhir)
  • ⎕←: display
  • ⌈⎕DL.05: tunggu 50 ms dan kembali 1. ( ⎕DLmengembalikan jumlah waktu yang sebenarnya ditunggu, yang akan menjadi dekat 0.05, membulatkan nilai itu memberi 1).
  • ∇⍵+: tambahkan nomor itu ( 1) ke dan jalankan kembali fungsinya.
marinus
sumber
2
Sial ... Saya pikir fungsi trigonometri ditambah penundaan waktu akan membuat kalian keluar
ace_HongKongIndependence
2
Berikut 33 karakter:{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
Tobia
3
@ace LOL. Anda harus memeriksa APL, itu bukan bahasa yang baru. Ini sangat tua dan telah digunakan dalam sistem besar selama beberapa dekade. Ini cukup unik, dibandingkan dengan yang lain. IMHO simbol membuatnya jauh lebih mudah dibaca bahwa ASCII-satunya turunannya (J)
Tobia
22

C, 74 73 70 69 67 karakter

Solusi 67 karakter dengan banyak ide bagus dari @ugoren & lainnya:

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

Solusi 69 karakter dengan loop sementara, bukan rekursi:

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

Mendekati wilayah perl. :)

treamur
sumber
1
Ini terinspirasi oleh jawaban C a @ ace sendiri.
treamur
2
Saya pikir Anda bisa menggunakan 5E4bukan 50000.
musiphil
2
Saya pikir Anda bisa menggunakan * .1 bukannya / 10.
moala
1
@musiphil, saya juga berpikir tentang menggunakan 5E4, tetapi ternyata tidak bekerja: Tanpa menunjukkan usleep()prototipe kompiler , Anda harus secara eksplisit melemparkan 5E4.
treamur
2
Anda dapat memotong dua karakter lainnya bergerak tugas untuk j ke printf, seperti ini: printf("%*s\n",j=21+sin(i++*.1)*20,"|"). Jenis yang dihasilkan masih int jadi argumen lebar bidang yang valid.
Seni
12

Mathematica 121 104 80 67 64

n=1;While[0<1,Spacer[70 Sin[n Pi/32]+70]~Print~"|";[email protected]; n++]

sinus

DavidC
sumber
pertanyaan mengatakan tidak menggunakan Mathematica untuk merencanakannya. apakah ini berbeda dari itu?
Maleakhi
13
@Malachi Ya. Ini menggunakan mathatica untuk menghitungnya, sama seperti jawaban lainnya. Menggunakan Mathematica untuk menggambar akan memberitahu Mathematica untuk menggambar x=20*sin(pi*y/30)+20atau sesuatu yang serupa.
Justin
ok saya mengerti apa yang Anda katakan terima kasih atas klarifikasi
Maleakhi
1
Dan ini adalah versi char 58Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";[email protected],{n,18!}]
Ajasja
1
Saya bukan pengguna Mathematica, tetapi saya pikir Anda dapat mengubah 1 == 1ke 0 < 1untuk mengurangi 1 karakter.
PKC
11

Perl, 48 (68)

Versi tidur GNU: 48

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

Lintas platform: 68

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

Menghapus penggunaan modul Time :: HiRes dengan menggunakan fungsi shell sleep. Selisih yang dipersingkat sesuai contoh Ruby. Dipersingkat menggunakan $ "dan $ 0 melihat petunjuk dari karya Primo. Terima kasih atas petunjuk Primo.

KevinColyer
sumber
Saya menyimpan ini sebagai file test.pldan berlari perl ./test.pl, namun waktu tunggu tidak sesuai dengan spesifikasi. Juga, amplitudo gelombang terlalu kecil. (Amplitudo ini mengacu pada panjang antara puncak dan posisi kesetimbangan.)
ace_HongKongIndependence
Saya kira jika saya mengubah selisih dari .105 menjadi .1 Saya akan mengalahkan ruby ​​dengan 56 karakter!
KevinColyer
@ primo - tidur shell saya memang lebih pendek dari 1 detik ...
KevinColyer
man sleepunsigned int sleep(unsigned int seconds);. Itu tidak akan salah, tetapi interval tidur yang sebenarnya adalah nol. Beberapa saran untuk membuat Anda lebih pendek: ubah $dmenjadi $_, lalu gunakan (25+20*sin), dan ubah \nuntuk baris baru literal.
Primo
2
@primo man 1 sleeppada shell bash GNU / Linux memberitahu kita bahwaUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
ace_HongKongIndependence
11

Perl - 64 (atau 60) byte

Berikut ini menggunakan perintah shell khusus Windows:

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

Berikut ini menggunakan perintah shell khusus GNU / Linux:

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

Keduanya berukuran 64 byte.

  • Periode adalah 64.
  • Amplitudo maksimum tepat 20.
  • Kurva sangat simetris.
  • Setiap periode identik.
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |

Perhatikan bahwa ini bukan gelombang sinusoidal, melainkan interpolasi kuadrat. Direncanakan melawan dosa yang sebenarnya:

Pada rincian yang diperlukan, ini secara visual tidak bisa dibedakan.

Jika estetika tidak begitu penting, saya menawarkan alternatif 60 byte , dengan panjang periode 62, amplitudo maksimum ~ 20,02, dan sedikit asimetri:

`sleep/m50`,print$"x(20-$_*(31-abs)/12),'|
'for-31..30;do$0
primo
sumber
Ini bukan gelombang sinusoidal; itu hanya parabola (jika saya membaca kode Anda dengan benar). (Jika Anda dapat mewakili ini dengan beberapa gelombang sinusoidal, saya ingin melihat fungsinya).
Justin
Sinus adalah rumus, jika Anda meniru rumus itu masih merupakan gelombang Sinusoid. dan ini mungkin merupakan varian dari Sine dalam beberapa mode.
Maleakhi
8

Ruby 56

i=0
loop{puts" "*(20*Math.sin(i+=0.1)+20)+?|;sleep 0.05}
daniero
sumber
Apakah mengganti put dengan p diperbolehkan?
Slicedpan
1
@ Sledpan saya pikir saya tidak akan, karena ini adalah tantangan untuk menggambar sesuatu. pakan menambahkan tanda kutip ganda di sekitar setiap baris dan mengubah "gambar".
daniero
7

Befunge 98 - 103 100

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

Sorakan untuk program yang melakukan ini, dalam bahasa tanpa kemampuan trigonometri; program pertama sebenarnya. Baris kedua hanyalah data; karakter yang sesuai dengan nilai ascii dari dosa, ditambahkan ke karakter spasi.

EDIT: Saya menyimpan 3 karakter dengan tidak mengurangi ruang; sinusoid diterjemahkan 32 unit ke kanan (yang valid).

Befunge juga tidak memiliki perintah tidur, atau yang serupa. Akan menyenangkan untuk menemukan sidik jari, tetapi saya tidak dapat menemukannya, jadi ff*:*8*mendorong 8*225**2( 405000) dan kzmenjalankan noop sebanyak itu (well, berkali-kali +1). Pada baris perintah windows dengan pyfunge , ini ternyata sekitar 50 milidetik, jadi saya katakan saya baik-baik saja. Catatan: jika ada yang tahu sidik jari yang baik untuk ini, beri tahu saya.

Bagian terakhir dari kode hanya memeriksa apakah penghitung (untuk jalur data) melewati data, jika itu, penghitung diatur ulang ke 0.

Saya menggunakan ini untuk menghasilkan data.


Seri Taylor

Meskipun versi ini adalah 105 karakter, saya hanya harus memasukkannya:

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

Saya mencoba untuk mempersingkat program saya, dan memutuskan untuk melihat seri taylor untuk cosinus (sinus lebih sulit untuk dihitung). Saya mengubah xagar pi * x / 30sesuai dengan periode yang diminta di sini, lalu dikalikan dengan 20untuk mencocokkan amplitudo. Saya membuat beberapa penyederhanaan (faktor yang disesuaikan untuk membatalkan, tanpa banyak mengubah nilai fungsi). Lalu saya menerapkannya. Sayangnya, ini bukan implementasi yang lebih pendek.

:f`!4*jf2*-

memeriksa apakah nilai seri taylor semakin tidak akurat (sekitar x = 15). Jika ya, maka saya menghitung seri taylor sebagai x - 30gantinya x.

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

adalah implementasi seri taylor saya di x = 0, kapan xnilainya di stack.

\$\f`!4*j01-* 

meniadakan nilai seri taylor jika seri taylor perlu penyesuaian.

b2*+

buat gelombang cosinus positif; jika tidak, pencetakan tidak akan berfungsi.

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

mencetak gelombang

ff*:*8*kz1+

sementara menunggu 50 milidetik, lalu naik x

:f3*`!3*j$e-

Jika xlebih besar dari 45, ubah ke -14 (lagi, penyesuaian kesalahan seri taylor).

Justin
sumber
Ini adalah jawaban yang saya
tunggu
1
Sana! Saya berhasil menurunkan panjang kode sebanyak -5 karakter! Dan masih ada ruang untuk perbaikan!
Justin
@ Quincunx solusi perl saya juga tidak menggunakan fungsi trigonometri bawaan;)
primo
6

Python, 108,93,90,89, 88

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

Sekarang dengan bergulir tak terbatas :)

Edit: ok, 90. Cukup?

Edit: Edit: no, 89.

Edit: Edit: Edit: 88 terima kasih kepada boothby .

Gabriele D'Antona
sumber
Maaf jika saya belum memperjelas pertanyaan ini - program Anda tidak boleh berhenti dan harus terus menggulir ke bawah gelombang (kecuali sampai SIGINT)
ace_HongKongIndependence
1
a=0.-> a=0membuat Anda menjadi 88
booth
5

PHP, 59 karakter

<?for(;;usleep(5e4))echo str_pad('',22+20*sin($a+=.1)).~ƒõ;
Alex Barrett
sumber
1
Anda dapat menghemat beberapa byte dengan menggunakan echo ...;menggantikan fwrite(STDOUT,...);.
Primo
Itu masuk akal saat menelepon dari baris perintah. 10 karakter disimpan - terima kasih banyak.
Alex Barrett
1
58:<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
primo
Sangat bagus. Saya tidak akan mengedit jawaban saya dengan perubahan itu, Anda harus memposting sebagai milik Anda.
Alex Barrett
1
@ace perlu disimpan dengan pengkodean ansi. ideone secara otomatis mengubah segalanya menjadi utf-8, yang pecah. ~ƒõhanya singkatan untuk "|\n".
Primo
4

C64 BASIC, 64 karakter PETSCII

masukkan deskripsi gambar di sini

Pada PAL C64, For i=0 to 2:next isiklus untuk sekitar. 0,05 detik, sehingga waktu tunda dihormati.

Gabriele D'Antona
sumber
3

Javascript 88 76 78 karakter

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

Berdasarkan kode Kendall Frey.

joeytje50
sumber
Anda tidak pernah menginisialisasi i, sehingga mencetak garis lurus, bukan gelombang.
gilly3
Kesalahan saya ... Mungkin berhasil karena saya sudah menjalankan skrip Kendall di konsol saya, jadi saya sudah diinisialisasi untuk saya.
joeytje50
3

C - 86 + 3 karakter

Terima kasih shiona dan Josh untuk hasil editnya

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

i; main (j) {untuk (j = 0; j ++ <20 + sin (i / 10.) * 20;) putchar (32); put ("|"); usleep (50000); i ++; main () ;}

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

Dikompilasi dengan -lmflag, saya menganggap saya perlu menambahkan 3 karakter

ace_HongKongIndependence
sumber
1
Apakah akan berhasil jika Anda membuat saya int dan hanya membaginya dengan 10.0 (atau 9,9 untuk menyimpan char?) Dalam panggilan untuk berbuat dosa ()? i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
shiona
Anda dapat menurunkan ukuran hingga 76 karakter atau lebih dengan menggunakan printf () untuk mengganti loop for:printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
treamur
1
Hmm ... Saya akan merasa sangat bersalah jika saya menggunakan ide ini dalam jawaban saya, terutama ketika ini adalah pertanyaan saya sendiri ... Apakah Anda ingin memposting jawaban sendiri?
ace_HongKongIndependence
OK akan ku lakukan. Terima kasih. :)
treamur
1
Anda dapat mencukur dua karakter lebih jika Anda menghapus j=0: i;main(j){for(;j++<21+sin(i/10.)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}. Ini bergantung pada asumsi bahwa program tersebut dipanggil dengan 0 argumen.
Josh
3

Ti-Basic, 33 byte

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

Peringatan berikut ada :

  1. Karena batasan layar 16x8, gelombang sinus ini hanya memiliki amplitudo 7 (periode 60 tetap dipertahankan)

  2. Karena kurangnya cara mudah untuk mengakses |char, !digunakan sebagai gantinya

  3. Karena kurangnya timer sistem yang akurat, penundaan tidak diterapkan. Namun, kecepatan lari muncul kira-kira benar.

Mike Clark
sumber
1
Heh, karena TI-BASIC dihitung dalam token satu / dua-byte, ini sebenarnya 33 byte (bukan "56 karakter"), jadi itu sebenarnya seharusnya memenangkan tantangan!
MI Wright
Kecuali untuk hal amplitudo ...
lirtosiast
Ya, tapi pergi dengan byte tidak masalah.
MI Wright
2

JavaScript - 88

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

Saya yakin seseorang dapat menemukan sesuatu yang sebenarnya pintar.

Kendall Frey
sumber
2

J - 103,58,57, 54

Terima kasih kepada teman-teman hebat dari IRC

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

Dalam kata-kata dari kanan ke kiri berbunyi: mulai dari 0 kali tak terbatas lakukan: sin, tambahkan 1, kalikan dengan 20, lantai, tambahkan 1 (sehingga menjadi array dari 2 elemen), salin dua byte '|' Sejalan dengan itu, cetak, tunggu 0,05 dan tambahkan 0,1

Alih-alih infinite loop kita dapat menggunakan rekursi, itu akan menghemat 2 karakter, tetapi juga akan menghasilkan kesalahan tumpukan setelah beberapa kali iterasi

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

Di mana $:ada panggilan rekursif.

desir
sumber
Maukah Anda menambahkan sedikit penjelasan, sehingga orang yang tidak terbiasa dengan sintaks J (seperti saya) juga dapat memahami jawaban Anda?
ace_HongKongIndependence
Ini mungkin untuk mempersingkat ini untuk 50 karakter dengan menyibukkan diri tentang dengan struktur kereta: (+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0. Versi rekursi hanya menyimpan 1 karakter saat ini $:@(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0meskipun tampaknya akan bertahan lebih lama sebelum keluar dari posisi terbawah.
algorithmshark
2

Haskell - 75

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

Sayangnya, saya tidak bisa membuat program untuk berhenti 50 ms tanpa menggandakan jumlah char saya, jadi itu hanya membanjiri konsol, tetapi tidak menghasilkan gelombang sinus.


Berikut kode lengkap dengan jeda (138 karakter dengan baris baru):

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..]])
Zaq
sumber
2
Menjeda adalah salah satu persyaratan. Bisakah Anda juga memposting kode dengan jeda?
Justin
Oke, saya mempostingnya. Saya berharap Haskell membiarkan Anda menjeda kode tanpa impor.
Zaq
Maksud saya adalah amplitudo puncak, yaitu dua kali amplitudo dari program Anda saat ini. Anda mungkin ingin mengubahnya 20+20*sin xuntuk memenuhi syarat.
ace_HongKongIndependence
Oh tentu saja. Saya kira saya salah menafsirkan bagian dari pertanyaan itu.
Zaq
2

Perl 6: 46 karakter

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

Buat Range malas tak terhingga menggunakan 0,0.1 ... *, loop di atasnya. saymengembalikan Bool::Trueyang dinomori sebagai 1 dalam perkalian, dengan cara ini saya dapat menyimpannya dalam satu pernyataan.

Ayiko
sumber
Saya bisa melihat mengapa sleepdan .05harus dipisahkan. Tapi saya bertanya-tanya apakah ruang antara saydan ' 'wajib?
Matthias
Ya: s Ini memberikan kesalahan "2 istilah secara berurutan" untuk say' 'Satu dapat digunakan say(' ')tapi itu 1 tambahan dalam kasus ini ...
Ayiko
1
@ Matthias: Di Perl 6, listops harus tidak mengambil argumen, memiliki spasi setelahnya, atau menggunakan tanda kurung. Ini bukan bahasa yang dirancang untuk golf kode, tidak seperti Perl 5 (tetapi mengandung banyak fitur builtin yang bagus, jadi itu dapat digunakan).
Konrad Borowski
@xfix Terima kasih atas penjelasannya. Saya suka bahasanya, tetapi saya belum memeriksanya secara menyeluruh, karena saya masih belum bisa menggunakannya dalam proyek kerja. Namun, saya selalu berencana untuk menulis beberapa skrip Perl 6. @ Ayiko, saya menghargai posting Perl 6 Anda :-)
Matthias
2

fugly Javascript - 77

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

dan jika kita melakukannya di Firefox - 73

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

dan jika kita jahat - 67

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

Scala, 92,89, 87

def f(i:Int){println(" "*(20+20*math.sin(i*.1)).toInt+"|");Thread sleep 50;f(i+1)};f(1)
ValarDohaeris
sumber
(20+20*math.sin(i*.1))menguranginya dengan 1 char, dengan asumsi ini adalah sintaks yang valid (saya tidak punya pengalaman dengan Scala)
ace_HongKongIndependence
Terima kasih, tapi saya baru tahu sendiri :)
ValarDohaeris
1

Python 3, 103

Impor frikk'n bodoh ...

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

Daripada "tidur", implementasi ini lebih baik di cpu karena python membuatnya lebih mudah untuk mendapatkan jam cpu floating-point daripada jam dinding. Pendekatan ini tidak akan mengalahkan friol , tapi itu menyenangkan jadi saya meninggalkannya.

stan
sumber
1

C #

[152] Karakter

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

Saya tidak bisa mendapatkan jawaban C # yang Ada untuk Berlari dan saya tidak bisa mengundurkan diri karena saya tidak memiliki Reputasi yang cukup

itu hilang beberapa {dan hilang )setelah Deklarasi For Loop.

Saya pikir perbedaan tampilan gelombang ketika dijalankan adalah karena cara kami mencoba menampilkan gelombang ini.


jika kita tidak menghitung Namespace dan Deklarasi Metode maka itu akan menjadi [104] karakter untuk versi yang berfungsi

for(var i=0d;;){Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|');Threading.Thread.Sleep(50);}
Maleakhi
sumber
Jawaban C # lainnya berfungsi pada gmcs. Gagal mengkompilasi pada awalnya, tapi saya pikir itu karena ada beberapa karakter yang tidak dapat dicetak dalam kode sumber. Setelah mengetiknya lagi di file kosong, kompilasi berhasil.
ace_HongKongIndependence
Kompiler bisa pilih-pilih, ya?
Maleakhi
1

VB [236] [178]

tidak yakin bagaimana Anda akan menghitung tab, saya hanya mengambil hitungan dari Notepadd ++ sebelum saya tempelkan di sini. baris baru wajib, mungkin mengapa tidak ada yang suka menggunakannya untuk kode golf.

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
Maleakhi
sumber
1

C #

The Magic Line [91] Karakter

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

Program Kerja Di Bawah Ini. [148] Karakter

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);}}}
John ClearZ
sumber
Maaf jika saya belum memperjelas pertanyaan - program Anda tidak boleh berhenti dan harus terus-menerus menelusuri gelombang (kecuali sampai SIGINT). Selain itu, harap tambahkan jumlah karakter.
ace_HongKongIndependence
Maaf lupa tentang itu. Diperbaiki sekarang
John ClearZ
Saya pikir Anda dapat kehilangan "Thread.Sleep" dan mengubah "float" dengan var :) 117 chars. - Maaf tidak melihat waktu tunggu .. 133 karakter sekarang. 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
Saya tidak bisa mengkompilasi di VS2010 dengan Threading.Thread.Sleep(50)apakah saya melakukan sesuatu yang salah?
Maleakhi
1
Saya dapat menjalankannya, tetapi saya harus menambahkan beberapa tanda kurung dan semi-titik dua dan tidak terlihat sama setiap periode
Maleakhi
1

Bash + bc (untuk menghitung), 80

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

TI-BASIC, 30 byte

Peningkatan ukuran kecil dari jawaban yang lain, dengan mengorbankan akurasi. Perhatikan bahwa TI-Basic secara teknis memiliki | karakter, tetapi Anda harus mentransfernya melalui komputer atau menggunakan program perakitan untuk mengaksesnya.

While 1
Output(8,int(8+7sin(Ans)),":
Disp "
.03π+Ans
End
MI Wright
sumber
Woah, tidak melihat berapa umur tantangan ini! Akan mencoba bermain golf ini lebih banyak (yang pasti mungkin) tapi itu benar-benar tidak layak ...
MI Wright
Omong-omong, .03πbisa jadi .1, yang masih dalam interval yang diperlukan.
lirtosiast
Tangkapan yang bagus, terima kasih! Apakah Anda melihat cara saya bisa golf perintah output? Juga, karena saya memiliki CSE, saya bisa mendapatkan ini dengan amplitudo yang tepat (layar 26-char) dengan biaya beberapa byte.
MI Wright
Tidak, perintah output terlihat baik - terlalu buruk Disp membutuhkan penawaran. Amplitudo harus 20 karakter, sebenarnya, membuat persyaratan lebar layar 39. Jadi itu hanya akan bekerja pada layar grafik, dan tidak ada cara pendek untuk melakukan itu.
lirtosiast
1

Julia - 68

Sunting: terima kasih kepada ML dan kartu as.

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

Yah, itu tidak bisa bersaing vs APL, tapi inilah usaha saya.

Keluaran:

                    |
                      |
                        |
                          |
                            |
                              |
                               |
                                 |
                                  |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                              |
                             |
                           |
                         |
                       |
                     |
                   |
                 |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
|
|
|
|
|
 |
 |
  |
   |
     |
      |
       |
         |
           |
             |
              |
                |
                  |
                    |
                      |
                        |
                          |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                 |
                                |
                              |
                            |
                          |
                        |
                      |
                    |
                  |
                 |
               |
             |
           |
         |
       |
      |
     |
   |
  |
  |
 |
|
|
|
|
|
 |
  |
  |
    |
     |
      |
        |
         |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                  |
                                 |
                               |
                              |
                            |
                          |
                        |
                      |
                    |
                  |
                |
              |
            |
           |
         |
       |
      |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
  |
   |
    |
     |
      |
        |
          |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                              |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                  |
                                 |
                               |
                             |
                            |
                          |
                        |
                      |
                    |
                  |
                |
              |
            |
          |
         |
       |
      |
    |
   |
  |
 |
 |
|
|
|
|
 |
 |
  |
   |
    |
     |
       |
        |
          |
            |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                      |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                      |
                                      |
                                     |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                       |
                     |
                   |
PKC
sumber
1
Saya tidak tahu Julia, tetapi apakah itu mungkin untuk menggunakan .05bukan 0.05di sleep?
ace_HongKongIndependence
Sebenarnya ya! Terima kasih
CCP
Potong menjadi 68 karakter : i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end——— sin(i/10)*20sama dengan20sin(.1i)
ML
Saya tidak tahu Julia, tetapi bisakah Anda menggunakan perulangan for iterating pada semua bilangan asli?
lirtosiast
1

MATLAB, 81 byte

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

Saya menyalahgunakan fakta yang iselalu diinisialisasi dalam MATLAB, yang berarti bahwa saya bisa memasukkannya ke fprintfdalam whilepernyataan tanpa menginisialisasi iterlebih dahulu. Ini berarti program pertama-tama menampilkan baris kosong, tapi saya pikir ini tidak dilarang dalam spesifikasi.

Selain itu, ia menyalahgunakan fakta bahwa Matlab akan mengabaikan sebagian besar karakter kontrol ASCII, mencetak spasi alih-alih NULL (juga untuk baris kosong pertama).

Sanchises
sumber
"Saya menyalahgunakan fakta bahwa saya selalu diinisialisasi dalam MATLAB, yang berarti bahwa saya bisa memasukkan fprintf dalam pernyataan sementara tanpa menginisialisasi saya terlebih dahulu." Sangat pintar! +1!
Stewie Griffin
0

F # - 90 79 77 76

Inilah solusi menggunakan rekursi

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

Mungkin bisa ditingkatkan lebih lanjut.

pswg
sumber
Tanpa tahu apa-apa tentang F #, saya berasumsi bahwa Thread.Sleep mengharapkan nilai dalam ms, sehingga Anda dapat menyingkirkan salah satu dari 0 dan melakukan Thread.Sleep 50. :)
ValarDohaeris
@ValarDohaeris Anda benar. Saya salah membaca persyaratan.
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

Jalankan skrip. Ini membuka Notepad dan mencetak karakter. Tekan Esc kapan saja untuk keluar.

Avi
sumber
0

Clojure, 121

Versi pendek:

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

Versi cantik:

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

Periode adalah 64.

Ketikkan ini ke dalam lein replatau simpan dalam file sin.cljdan jalankan dengan lein exec sin.clj(memerlukan lein-exec plugin).

ctrlrsf
sumber