Pengantar:
The sinus dari x
diberikan oleh rumus:
sin(x) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! - x^11/11! // and more follows...
The cosinus dari x
diberikan oleh rumus:
cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - x^10/10! // and more follows...
Tugas:
Diberi nilai x
dan n
, tulis sebuah program (tidak ada fungsi, dll.) Untuk menampilkan nilai sin(x)
dan cos(x)
memperbaiki n
ketentuan rumus di atas. Anggap itu x
dalam radian.
Memasukkan:
x n
Angka desimal x
(dengan hingga 3 tempat desimal) dan bilangan bulat n
. Masukan harus di stdin atau kotak dialog prompt (jika bahasa Anda tidak mendukung stdin)
Keluaran:
[sin(x)]
[cos(x)]
Nilai keduanya sin(x)
dan cos(x)
harus dibulatkan ke 6 tempat desimal. Jika sin(x)
ini 0.5588558855
(10 digit desimal), itu harus dibulatkan ke 0.558856
(6 digit desimal). Pembulatan harus dilakukan ke yang terdekat, seperti yang dijelaskan dalam kolom kelima, "Bulatkan ke yang terdekat", dari tabel di artikel Wiki ini .
Kendala:
1 <= x <= 20
1 <= n <= 20
Sampel:
----
5 3
10.208333
14.541667
----
8.555 13
0.765431
-0.641092
----
9.26 10
-3.154677
-8.404354
----
6.54 12
0.253986
0.967147
----
5 1
5.000000
1.000000
----
20 20
-5364.411846
-10898.499385
----
Catatan:
- Celah standar dilarang.
- Fungsi matematika bawaan dan operator trigonometri (sin, cos, tan, dll.), Faktorial, dan eksponensial tidak dapat digunakan. Anda bebas menggunakan fungsi pembulatan bawaan untuk memperkirakan hasil komputasi
sin(x)
dancos(x)
ke angka desimal ke-6. - Tidak perlu menangani input yang salah.
- Hanya karakter ASCII yang dapat digunakan dalam program, bukan karakter Unicode Cina yang memungkinkan kompresi kode.
- Program Anda harus menghentikan, dan menampilkan output, dalam 3 detik input.
- Jawaban Anda harus menyertai kode yang tidak disatukan, bersama dengan penjelasan kode (wajib jika kode tidak segera jelas bagi programmer-tidak-akrab-dengan-bahasa Anda, terutama GolfScript, J, dll).
- Harap sertakan tautan ke kompiler online tempat program Anda dapat diuji.
Mencetak:
Jawaban dengan panjang kode terendah dalam karakter, termasuk spasi, tab, dll. Menang! Pemenang akan diumumkan pada 21 Mei 2014.
EDIT : 21/05/14 Pemenang adalah aditsu menggunakan bahasa CJam . Runner up mengikuti jpjacobs dengan bahasa J , dan runner up kedua primo dengan bahasa Perl . Selamat semua!
mod 2pi
untuk membuat input bertemu lebih cepat akan lebih bermanfaat - ini adalah salah satu dari banyak perbaikan yang digunakan dunia nyata ketika berhadapan dengan fungsi-fungsi ini. (Sebenarnya mod pi dan tanda kesadaran).Jawaban:
CJam - 42
Cobalah online di http://cjam.aditsu.net
Penjelasan:
r
membaca token dari inputd
convert to double:X
assigns ke variabel X;
muncul nilai dari stack1
menempatkan 1 pada stack (istilah pertama)_
menduplikasi 1r
membaca token berikutnya (n)i
mengkonversi ke integer2*,1>{...}/
adalah semacam loop dari 1 hingga 2 * n - 1:-
2*
dikalikan 2-
,
membuat array dari 0 hingga (nilai terakhir) -1-
1>
menghapus item pertama dari array (0)-
{...}/
mengeksekusi blok untuk setiap item dalam array_
menduplikasi "loop" variabel "(sebut saja k)2%2*(
mengonversi dari even / odd ke -1/1:-
2%
adalah modulo 2 (-> 0/1)-
2*
dikalikan dengan 2 (-> 0/2)-
(
decrements (-> -1/1)*
mengalikan, dengan demikian mengubah tanda setiap detik/
membagi istilah pada stack dengan k atau -k; ini adalah "/ k!" bagian dari perhitungan bersama dengan tanda perubahanX*
dikalikan dengan X; ini adalah bagian "X ^ k" dari perhitungan; kami memperoleh istilah berikutnya dalam seri_
duplikat istilah yang akan digunakan untuk menghitung istilah berikut dalam iterasi berikutnya;
(setelah loop) muncul istilah duplikat terakhir]
mengumpulkan istilah pada tumpukan di dalam array.Pada titik ini kami memiliki array [ 1 X -X ^ 2/2! -X ^ 3/3! X ^ 4/4! X ^ 5/5! ...] berisi persis semua istilah yang kita butuhkan untuk cos (x) dan sin (x), yang disatukan
2/
membagi array ini menjadi pasanganz
transposes matriks, menghasilkan array dengan syarat untuk cos (x) dan array dengan syarat untuk sin (x), sebagai "baris matriks"{...}/
lagi mengeksekusi blok untuk setiap item array (baris matriks):-
:+
menambahkan elemen dari baris matriks bersama-
6mO
bulat ke 6 desimalPada titik ini kita memiliki cos (x) dan sin (x) yang diinginkan pada stack
p
mencetak representasi item terakhir pada stack (sin (x)) diikuti oleh baris baruAt akhir program, isi tumpukan yang tersisa (cos (x)) dicetak secara otomatis.
sumber
Perl - 72 byte
Atau, menghitung opsi baris perintah masing-masing 1 byte, dalam 70 byte :
Atau, jika Anda mengizinkan saya Perl 5.8, dalam 63 byte :
tapi mengapa kamu mau.
Sunting : Kepatuhan dengan aturan baru.
%f
berkeliling ke 6 tempat secara default, betapa nyamannya!Algoritma
Meneliti deret Taylor untuk dosa (x) :
dapat dilihat bahwa setiap istilah secara merata membagi setiap istilah yang berurutan. Karena itu, ini dapat ditransformasikan dengan mudah menjadi ekspresi bersarang:
cos (x) mentransformasikannya dengan cara yang sama, tanpa x terkemuka , dan istilah penyebutnya lebih kecil.
Selain itu, ekspresi bersarang ini dapat diformulasi ulang sebagai ekspresi rekursif terbalik:
dengan s ∞ = 0 dan sin (x) = x · s 1 , yang pada akhirnya adalah apa yang digunakan.
Tidak disatukan
Contoh Penggunaan
Jika Anda ingin menguji ini secara online, saya sarankan menggunakan compileonline.com . Salin-tempel kode ke
main.pl
, dan input ke dalamSTDIN
kotak, lalu Execute Script.sumber
Python 3 (102) / Python 2 (104)
Python 3 (102)
Python 2.7 (104)
Pada dasarnya kode yang sama. Kami menyimpan dua karakter dari tidak perlu parens untuk
print
tetapi kehilangan empat dari membutuhkanraw_input
.Contoh dijalankan
Anda dapat menjalankan ini di sini .
Penjelasan kode
Gagasan utamanya adalah untuk menghitung
2*n
istilahe^(ix)
, dan kemudian mengambil bagian imajiner dan nyata untuk mendapatkansin
dancos
nilai - nilai didekati dengann
istilah. Kami menggunakan pemotongan seri Taylor:Ini polinomial dalam i * x, tetapi daripada menghitung nilainya dengan menjumlahkan setiap istilah, kami menggunakan Metode Horner yang dimodifikasi untuk menghitung urutan (didefinisikan secara rekursif secara terbalik)
yang memberikan
t_1
sama dengan nilai yang diinginkan.Operasi pemformatan string python digunakan untuk mendapatkan nilai untuk menampilkan dibulatkan hingga 6 digit desimal.
Sunting: Diubah menjadi bulat menjadi 6 digit sesuai aturan baru. Tidak ada perubahan lain yang diperlukan.
sumber
J
98 70 6958Meskipun ini mungkin dapat dipersingkat sedikit menggunakan fungsi yang lebih mewah ... komentar dipersilahkan:
Catatan 2: input berakhir ketika menerima EOF (ctrl-D di linux). Edit: bergabung eksponensial dan faktorial menjadi lebih bagus, lebih J-ish keseluruhan:
($ %&(*/) >:@i.@[ )
. Ini intinya untuk mengambil array x replikasi y dan array angka dari 1 ke y. Lipat gandakan masing-masing dan bagi hasilnya. Ini menghilangkan duplikat*/
.Berkat algortihmshark, ada 7 karakter lagi.
Potongan yang dihapus karena menyingkirkan baris baru yang tertinggal.
Versi yang lebih panjang, yang mengetahui tentang garpu adalah suatu keharusan.
Tidak ada penerjemah online J, tapi ini open source sejak beberapa tahun; instalasi mudah dengan instruksi ini:
http://www.jsoftware.com/jwiki/System/Installation/J801
Di #jsoftware di irc.freenode.org, ada bot J juga.
stdin hanya berfungsi ketika dijalankan dari file, dari baris perintah, atau ganti
stdin ''
dengan di'a b;'
mana a dan b adalah angka-angka yang akan diteruskan pada baris perintah.sumber
exit
&
dari0j6&":
untuk menyimpan char. Juga,(i.@(,&_2)@{:($%&(*/)>:@i.@[)"0{.)
dapat ditulis ulang(($%&(*/)1+i.@[)"0~i.@,&_2)/
untuk 6. lainnyaT.
(perkiraan fungsi dengan n-term seri Taylor), tapi saya pikir itu verboten sebagai celah standar.Perl,
1201081048985Tidak Terkumpul:
Baris pertama membaca input dan menggunakan regex untuk menemukan spasi; ini secara otomatis menempatkan nilai sebelum spasi dalam $ `dan nilai setelahnya dalam $ '.
Sekarang kita beralih dari 1 ke
2*n-1
.$t
adalah istilah kami, yang loop berulang kali dikalikanx
dan dibagi dengan indeks loop ($_
). Loop dimulai pada 1 daripada 0 karena cosinus diinisialisasi ke 1, yang menyelamatkan saya harus berurusan dengan pembagian dengan nol.Setelah memperbarui
$t
, operator trinary mengembalikan salah satu$sine
atau$cosine
, tergantung pada apakah indeksnya ganjil atau genap, dan menambah$t
nilai padanya. Rumus ajaib$_&2?-$t:$t
angka apakah akan menambah atau mengurangi nilai ini (pada dasarnya menggunakan bitwise-dan pada indeks dan 2 untuk menghasilkan urutan berulang dari "tambah, tambah, kurangi, kurangi").Anda dapat menguji-coba kode ini di compileonline.com .
sumber
20 20
.1..$n*2-1
, bukan1..$n
. Sementara saya di sini ...$s
baik-baik saja dibiarkan tidak diinisialisasi, sepertiundef
mengevaluasi0
dalam konteks numerik. Tugas terner tidak perlu kurung:$_&1?$s:$c+=$t
."%.8f\n%.8f"
dapat disingkat menjadi"%.8f\n"x2
, pada konsekuensi menambahkan baris baru.$t*(1-($_&2))
=>$_&2?-$t:$t
.Fortran:
8910912510210198 byteSaya menyalahgunakan pengetikan tersirat, tetapi sayangnya tidak ada jenis rumit tersirat seperti itu, jadi saya harus menentukan itu & kompleks
i
.Gfortran memangkas output pada 8 tempat desimal secara alami, jadi kami bagus untuk spek itu.Sayangnya, metode keluaran saya yang asliprint*,t
,, tidak memenuhi spesifikasi jadi saya harus menambahkan 16 karakter untuk menampilkan komponen imajiner dan nyata & menekan 8 tempat desimal yang diperlukan.Berkat Ventero, saya berhasil menghemat 23 byte antara output dan loop. Dan karakter lain untuk mendapatkan jawaban yang benar dan output yang diformat. Dan 3 lagi pada
read
pernyataan itu.Tidak disatukan,
sumber
C, 120
Untuk menyimpan byte, pernyataan yang memperbarui nilai sinus ditempatkan di dalam
for()
pernyataan, tetapi sebenarnya dieksekusi setelah pernyataan mengikuti tanda kurung penutup yang memperbarui nilai cosinus. (Saya kira saya juga bisa menyimpan beberapa byte lagi dengan menghapus karakter baris baru terakhir dalam output program.)Variabel global
s
,c
,r
danx
secara implisit diinisialisasi ke nol, dani
akan memiliki nilai 1 selama tidak ada argumen yang diberikan pada baris perintah. Sayangnyaprintf()
standarnya adalah 6 desimal, jadi format outputnya agak bertele-tele.Tidak Terkumpul:
Berikut kode dengan sedikit penataan ulang untuk membuat urutan di mana hal-hal dilakukan lebih jelas:
Output sampel:
Cobalah online:
http://ideone.com/URZWwo
sumber
Python> = 2.7.3,
186184211200182170 karakterAgak sederhana sekali. Menggunakan rumus dari pertanyaan parameter untuk sinus dan cosinus.
Penerjemah online dapat ditemukan
sinisiniSunting: Versi yang valid dengan semua batasan
Sunting2: Mengubah juru online ke ideone.com karena
round
keluaran fungsi tidak valid di Python 2.7.1Sunting3: Ternyata saya menggunakan lambda inline yang tidak perlu + mengubah pembulatan ke format string (dicuri dari xnor :))
Sunting4: Diganti
join
denganfor
loop utama yang tidak berfungsisumber
**
saya lakukan). Jadi, saya pikir Anda harus mengedit jawaban Anda. Maaf atas ketidaknyamanan Tolong koreksi saya jika saya salah.20 20
, saya mendapatkan output-5364.4118142500001
. Mungkin ingin memperbaikinya menjadi 8 desimal.2.7.1
. Jika Anda menjalankannya di ideone.com (Python 2.7.3) itu berfungsi dengan baik. ideone.com/JsYNNKJavaScript - 114 karakter
Berdasarkan jawaban james yang bagus. Algoritma yang sama, langkah pertama dihindari dengan inisialisasi c = 1 dan s = x. Menggunakan 2 vars bukan array untuk output menyederhanakan loop.
Tidak disatukan
sumber
s += (l *= x / ++d)
dan tidak adas += (l* = x / ++d)
dalam kode yang tidak diserang.JavaScript (ECMAScript 6 Draft) -
9796 KarakterSolusi rekursif:
Keluaran:
sumber
no functions
persyaratan input .C, 114
Reputasi yang tidak memadai untuk berkomentar, tetapi lebih jauh ke jawaban C Squeamish Offisrage , reduksi 7 byte dengan menggunakan float untuk menggandakan dan menghilangkan spasi, dan menggabungkan deklarasi dan init dari 'r' memberi
coba di sini .
sumber
r
dalam deklarasi. Saya belum diuji untuk melihat apakahfloat
memberikan presisi yang dibutuhkan.float
akan memberikan presisi yang diperlukan, tetapi itu berhasil :) Dan selamat datang di PPCG, user2702245!float
variabel? Untukx=5
dann=3
, saya dapatsin(x)=10.20833206
dancos(x)=14.54166412
:-( (Intel Core Duo, kalau-kalau Anda bertanya-tanya)GNU bc, digerakkan oleh bash, 128 byte
Terlalu banyak byte yang dihabiskan untuk mengatur tempat desimal dan pembulatan ke-terdekat. Oh well, ini dia:
Keluaran:
Alat baris perintah Linux, 97 karakter unicode
Jawaban hack Unicode dihapus atas permintaan OP. Lihatlah riwayat edit jika Anda tertarik.
sumber
Ruby, 336
Mungkin yang terpanjang di sini, tapi saya yakin itu bisa dibuat lebih pendek :(
sumber
JavaScript (ES6) - 185 karakter
Menggunakan fungsi
q
untuk faktorial,i
untuk eksponensial, danp
untuk melakukan keduanyasin
dancos
. Jalankan di jsbin.com. Menggunakan formula persis tanpa modifikasi apa pun.EDIT : Mengubah
8
tempat6
desimal ke tempat desimal. 15 / Mei / 14Kode Tidak Terkunci :
sumber
JavaScript - 133 karakter
Tidak disatukan
sumber
Mathematica, 96 karakter
sumber
x,n
saya?x n
.Ruby -
160152140 KarakterMenggunakan rekursi dan fakta bahwa untuk implementasi implementasi rekursif ini dosa (x, 2n + 1) = 1 + cos (x, 2n - 1), menjadi sin (x, n) dan cos (x, n) seri yang ditentukan di atas untuk cos x dan dosa x.
Sunting: Dikontribusikan oleh komentator (baca di bawah).
sumber
p=->x,n{...}
,f=->n{...}
dan sebagainya, dan kemudian menggunakan kurung bukan kurung untuk memanggil mereka, sepertip[x,n-1]
. Juga, saya pikircollect
itu hanya alias untukmap
, yang jauh lebih pendek, dan karena Anda hanya memetakan panggilan anggota, Anda dapat mempersingkatnya menjadigets.split.map &:to_f
.