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.
sumber
Jawaban:
APL (35)
(Ya, itu cocok dalam 35 byte, ini adalah pengkodean APL 1-byte )
Penjelasan:
{
...}
1: panggil fungsi dengan 1 di awal1○⍵×.1
: cukup dekat untuk pekerjaan pemerintahsin(⍵×π÷30)
. (1○
adalahsin
).-21+⌈20
: menormalkan ke kisaran1..40
dan meniadakan'|'↑⍨
: ambilN
karakter terakhir dari string'|'
(yang menghasilkan string spasi dengan tanda|
di akhir)⎕←
: display⌈⎕DL.05
: tunggu 50 ms dan kembali1
. (⎕DL
mengembalikan jumlah waktu yang sebenarnya ditunggu, yang akan menjadi dekat0.05
, membulatkan nilai itu memberi1
).∇⍵+
: tambahkan nomor itu (1
) ke⍵
dan jalankan kembali fungsinya.sumber
{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
C,
7473706967 karakterSolusi 67 karakter dengan banyak ide bagus dari @ugoren & lainnya:
Solusi 69 karakter dengan loop sementara, bukan rekursi:
Mendekati wilayah perl. :)
sumber
5E4
bukan50000
.usleep()
prototipe kompiler , Anda harus secara eksplisit melemparkan 5E4.printf("%*s\n",j=21+sin(i++*.1)*20,"|")
. Jenis yang dihasilkan masih int jadi argumen lebar bidang yang valid.Mathematica
121 104 80 6764sumber
x=20*sin(pi*y/30)+20
atau sesuatu yang serupa.Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";[email protected],{n,18!}]
1 == 1
ke0 < 1
untuk mengurangi 1 karakter.Perl, 48 (68)
Versi tidur GNU: 48
Lintas platform: 68
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.
sumber
test.pl
dan berlariperl ./test.pl
, namun waktu tunggu tidak sesuai dengan spesifikasi. Juga, amplitudo gelombang terlalu kecil. (Amplitudo ini mengacu pada panjang antara puncak dan posisi kesetimbangan.)man sleep
→unsigned int sleep(unsigned int seconds);
. Itu tidak akan salah, tetapi interval tidur yang sebenarnya adalah nol. Beberapa saran untuk membuat Anda lebih pendek: ubah$d
menjadi$_
, lalu gunakan(25+20*sin)
, dan ubah\n
untuk baris baru literal.man 1 sleep
pada shell bash GNU / Linux memberitahu kita bahwaUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
Perl - 64 (atau 60) byte
Berikut ini menggunakan perintah shell khusus Windows:
Berikut ini menggunakan perintah shell khusus GNU / Linux:
Keduanya berukuran 64 byte.
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:
sumber
Ruby 56
sumber
p
akan menambahkan tanda kutip ganda di sekitar setiap baris dan mengubah "gambar".Befunge 98 -
103100Sorakan 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*
mendorong8*225**2
(405000
) dankz
menjalankan 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:
Saya mencoba untuk mempersingkat program saya, dan memutuskan untuk melihat seri taylor untuk cosinus (sinus lebih sulit untuk dihitung). Saya mengubah
x
agarpi * x / 30
sesuai dengan periode yang diminta di sini, lalu dikalikan dengan20
untuk 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.memeriksa apakah nilai seri taylor semakin tidak akurat (sekitar
x = 15
). Jika ya, maka saya menghitung seri taylor sebagaix - 30
gantinyax
.adalah implementasi seri taylor saya di
x = 0
, kapanx
nilainya di stack.meniadakan nilai seri taylor jika seri taylor perlu penyesuaian.
buat gelombang cosinus positif; jika tidak, pencetakan tidak akan berfungsi.
mencetak gelombang
sementara menunggu 50 milidetik, lalu naik
x
Jika
x
lebih besar dari 45, ubah ke -14 (lagi, penyesuaian kesalahan seri taylor).sumber
Python,
108,93,90,89, 88Sekarang dengan bergulir tak terbatas :)
Edit: ok, 90. Cukup?
Edit: Edit: no, 89.
Edit: Edit: Edit: 88 terima kasih kepada boothby .
sumber
a=0.
->a=0
membuat Anda menjadi 88PHP, 59 karakter
sumber
echo ...;
menggantikanfwrite(STDOUT,...);
.<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
~ƒõ
hanya singkatan untuk"|\n"
.C64 BASIC, 64 karakter PETSCII
Pada PAL C64,
For i=0 to 2:next i
siklus untuk sekitar. 0,05 detik, sehingga waktu tunda dihormati.sumber
Javascript
887678 karakterBerdasarkan kode Kendall Frey.
sumber
i
, sehingga mencetak garis lurus, bukan gelombang.C - 86 + 3 karakter
Terima kasih shiona dan Josh untuk hasil editnya
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
-lm
flag, saya menganggap saya perlu menambahkan 3 karaktersumber
i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
j=0
:i;main(j){for(;j++<21+sin(i/10.)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}
. Ini bergantung pada asumsi bahwa program tersebut dipanggil dengan 0 argumen.Ti-Basic, 33 byte
Peringatan berikut ada :
Karena batasan layar 16x8, gelombang sinus ini hanya memiliki amplitudo 7 (periode 60 tetap dipertahankan)
Karena kurangnya cara mudah untuk mengakses
|
char,!
digunakan sebagai gantinyaKarena kurangnya timer sistem yang akurat, penundaan tidak diterapkan. Namun, kecepatan lari muncul kira-kira benar.
sumber
JavaScript - 88
Saya yakin seseorang dapat menemukan sesuatu yang sebenarnya pintar.
sumber
J -
103,58,57, 54Terima kasih kepada teman-teman hebat dari IRC
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
Di mana
$:
ada panggilan rekursif.sumber
(+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.)0
meskipun tampaknya akan bertahan lebih lama sebelum keluar dari posisi terbawah.Haskell - 75
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):
sumber
20+20*sin x
untuk memenuhi syarat.Perl 6: 46 karakter
Buat Range malas tak terhingga menggunakan
0,0.1 ... *
, loop di atasnya.say
mengembalikanBool::True
yang dinomori sebagai 1 dalam perkalian, dengan cara ini saya dapat menyimpannya dalam satu pernyataan.sumber
sleep
dan.05
harus dipisahkan. Tapi saya bertanya-tanya apakah ruang antarasay
dan' '
wajib?say' '
Satu dapat digunakansay(' ')
tapi itu 1 tambahan dalam kasus ini ...fugly Javascript - 77
dan jika kita melakukannya di Firefox - 73
dan jika kita jahat - 67
sumber
Scala,
92,89, 87sumber
(20+20*math.sin(i*.1))
menguranginya dengan 1 char, dengan asumsi ini adalah sintaks yang valid (saya tidak punya pengalaman dengan Scala)Python 3, 103
Impor frikk'n bodoh ...
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.
sumber
C #
[152] Karakter
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
sumber
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.
sumber
C #
The Magic Line [91] Karakter
Program Kerja Di Bawah Ini. [148] Karakter
sumber
using System;class P{static void Main(){for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Thread.Sleep(50);}}
Threading.Thread.Sleep(50)
apakah saya melakukan sesuatu yang salah?Bash + bc (untuk menghitung), 80
sumber
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.
sumber
.03π
bisa jadi.1
, yang masih dalam interval yang diperlukan.Julia - 68
Sunting: terima kasih kepada ML dan kartu as.
Yah, itu tidak bisa bersaing vs APL, tapi inilah usaha saya.
Keluaran:
sumber
.05
bukan0.05
disleep
?i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end
———sin(i/10)*20
sama dengan20sin(.1i)
MATLAB, 81 byte
Saya menyalahgunakan fakta yang
i
selalu diinisialisasi dalam MATLAB, yang berarti bahwa saya bisa memasukkannya kefprintf
dalamwhile
pernyataan tanpa menginisialisasii
terlebih 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).
sumber
F # -
90797776Inilah solusi menggunakan rekursi
Mungkin bisa ditingkatkan lebih lanjut.
sumber
AutoHotkey 176
Jalankan skrip. Ini membuka Notepad dan mencetak karakter. Tekan Esc kapan saja untuk keluar.
sumber
Clojure, 121
Versi pendek:
Versi cantik:
Periode adalah 64.
Ketikkan ini ke dalam
lein repl
atau simpan dalam filesin.clj
dan jalankan denganlein exec sin.clj
(memerlukan lein-exec plugin).sumber