Menulis sebuah program atau fungsi yang dapat membedakan berikut 12 fungsi trigonometri: sin
,
cos
,
tan
,
asin
,
acos
,
atan
,
sinh
,
cosh
,
tanh
,
asinh
,
acosh
,
atanh
.
Program Anda diberi salah satu fungsi di atas sebagai kotak hitam dan harus menampilkan nama fungsi baik seperti yang diberikan di atas atau cara namanya dalam bahasa Anda.
Ini adalah kode-golf , jadi jawaban tersingkat di setiap bahasa menang. Anda harus menunjukkan bahwa kode Anda berfungsi dengan benar dengan memasukkan kasus uji dengan semua 12 input yang mungkin. Jika bahasa pilihan Anda tidak termasuk built-in untuk semua fungsi di atas, Anda harus memberikan implementasi masuk akal Anda sendiri dari yang hilang.
Klarifikasi lebih lanjut
- Menggunakan bilangan kompleks untuk menanyakan kotak hitam diizinkan jika build-in yang mendasarinya dapat menanganinya.
- Sebagai saat hanya menggunakan bilangan real, kueri ke fungsi kotak hitam dapat memberikan kesalahan domain. Dalam hal ini Anda harus mengasumsikan bahwa kotak hitam hanya mengkomunikasikan adanya kesalahan, tetapi bukan dari mana fungsi itu berasal.
- Jika alih-alih kesalahan beberapa nilai lain, misalnya
NaN
ataunull
, dikembalikan, maka kiriman Anda harus dapat menanganinya.
Terima kasih atas umpan balik kotak pasir yang bermanfaat !
sumber
Jawaban:
Python 3.6.4 di Linux, 99 byte
Sedikit jawaban konyol, tapi:
Membutuhkan fungsi trigonometri menjadi salah satu dari
cmath
modul bawaan untuk / keluaran yang kompleks.sumber
f
adalahf(.029)
- memanggil fungsi dengan nilai.Perl 6 , 75 byte
Cobalah online!
Ketika itu terjadi, ke dua belas fungsi yang akan didiskriminasi adalah bawaan dan semuanya mengambil argumen yang kompleks.
[X~] ("", "a"), <sin cos tan>, ("", "h")
menghasilkan semua dua belas nama fungsi dengan mengurangi tiga daftar input dengan gabungan produk-silang. Diberikan itu,.min(...)
menemukan satu yang perbedaan terkecil dari fungsi input2i
.sumber
X
dapat digunakan untuk beberapa istilah, dan beberapa trik lain untuk byte golfC (gcc) ,
178172 byteCobalah online!
Tua tapi keren: C (gcc) , 194 byte
Cobalah online!
The
-lm
switch TIO adalah hanya untuk tes. Jika Anda bisa menulis implementasi sempurna fungsi trigonometri standar, Anda akan mendapatkan jawaban yang tepat.Penjelasan
Idenya adalah untuk menemukan beberapa nilai input sehingga ketika saya menginterpretasikan output dari masing-masing fungsi trig sebagai bilangan bulat mereka memiliki modulo sisa yang berbeda 12. Ini akan memungkinkan mereka untuk digunakan sebagai indeks array.
Untuk menemukan nilai input seperti itu, saya menulis cuplikan berikut:
Jika Anda menjalankan itu (yang perlu dikompilasi dengan -lm) itu akan memuntahkan bahwa dengan nilai 0,9247 Anda mendapatkan nilai-nilai unik.
Selanjutnya saya reinterpeted sebagai integer, menerapkan modulo oleh 12, dan mengambil nilai absolut. Ini memberi masing-masing fungsi indeks. Mereka (dari 0 -> 11): acosh, sinh, asinh, atanh, tan, cosh, asin, dosa, cos, atan, tanh, acos.
Sekarang saya hanya bisa mengindeks ke array string, tetapi nama-nama yang sangat panjang dan sangat mirip, jadi alih-alih saya mengambilnya dari potongan string.
Untuk melakukan ini saya membangun string "asinhacoshatanh" dan dua array. Array pertama menunjukkan karakter mana dalam string yang akan ditetapkan ke terminator nol, sedangkan yang kedua menunjukkan karakter mana dalam string harus yang pertama. Array ini berisi: 10,5,5,0,14,10,4,4,9,9,14,0,9 dan 5,1,0,10,11,6,0,1,1,6,10,11, 5 masing-masing.
Akhirnya itu hanya masalah menerapkan algoritma reinterpretasi secara efisien dalam C. Sayangnya saya harus menggunakan tipe ganda, dan dengan tepat 3 penggunaan, lebih cepat hanya menggunakan
double
tiga kali kemudian menggunakan#define D double\nDDD
hanya 2 karakter. Hasilnya di atas, uraiannya di bawah:Sunting: Sayangnya hanya menggunakan array mentah sebenarnya lebih pendek, sehingga kode menjadi lebih sederhana. Meskipun demikian, mengiris senar itu menyenangkan. Secara teori, argumen yang tepat mungkin benar-benar muncul dengan irisan yang tepat dengan beberapa matematika.
sumber
puts(...)
denganprintf("%.5s","acoshsinh asinhatanhtan cosh asin sin cos atan tanh acos "+5*(_<0?-_:_))
-DD=double
dan mengganti semuadouble
kode Anda denganD
. Perhatikan bahwa bendera perlu dihitung untuk total byte.char*[]
denganint*[]
, dan dengan mengubah operator ternary (? :) menjadiabs(_)
Python 3.6.5 di Linux,
9085 byteIni dibangun berdasarkan jawaban orlp ; tetapi alih-alih menemukan 1 angka ajaib, kami menemukan 3! Ini pada dasarnya hanya menghemat byte dengan menghindari menempatkan string literal untuk "sin", "cos", dan "tan" beberapa kali, alih-alih membangun jawaban satu bagian pada suatu waktu.
Angka ajaib pertama digunakan untuk menentukan apakah itu salah satu dari fungsi trigonometrik "busur", dengan menambahkan sebuah "a" yang sesuai, yang kedua untuk apakah itu salah satu dari fungsi berbasis "dosa", "cos", atau "tan", memilih string yang sesuai, dan yang ketiga untuk apakah itu salah satu fungsi hiperbolik, menambahkan "h" yang sesuai.
Seperti jawaban orlp, ia menggunakan fungsi-fungsi dari
cmath
modul bawaan Python sebagai input.Disimpan 5 byte dengan menggunakan slice indexing ke string tengah
Menemukan Angka Ajaib
Untuk kelengkapan, inilah (kurang lebih) skrip yang saya gunakan untuk menemukan angka ajaib ini. Saya kebanyakan hanya bekerja langsung di terminal python, jadi kodenya berantakan, tapi itu menyelesaikan pekerjaan.
sumber
Python ,
1089490 byteMembandingkan hasil fungsi input dengan hasil semua fungsi untuk nilai
.2
.Cobalah online
-14 byte oleh Jonathan Allen
-4 byte oleh Rod
sumber
re
, hanya mendapatkan yang diperlukan dengan mengiris:lambda f,d=dir(cmath):[s for s in d[4:12]+d[22:]if eval("cmath."+s)(.2)==f(.2)][0]
(ditulis ulang untuk bekerja pada TIO sebagai impor harus terjadi sebelumd=dir(cmath)
belumF=
harus di header untuk tidak dihitung).lambda f:[s for s in dir(cmath)if s[-1]in'shn'and eval("cmath."+s)(.2)==f(.2)][0]
Dyalog APL ,
252119 byteCobalah online!
-3 terima kasih kepada H.PWiz
-2 terima kasih kepada ngn
Pergi melalui semua fungsi trigonometri yang diperlukan (yang ada di APL
1 2 3 5 6 7 ¯1 ¯2 ¯3 ¯5 ¯6 ¯7○2
) ditambah beberapa hal lagi (ini berjalan melalui-7..7
), menemukan mana yang cocokinput○2
, dan menghasilkan yang "dengan"○
, yang menghasilkan sebagainum∘○
sumber
C (gcc) dengan
-lm
,374346324 byteTerima kasih kepada Giacomo Garabello untuk sarannya.
Saya dapat menghemat sedikit lebih banyak ruang dengan memiliki makro pembantu melakukan token-paste di samping makro asli saya yang melakukan pengurutan.
Dalam tes, saya menggunakan beberapa fungsi trigonometri non-perpustakaan untuk mengkonfirmasi validitas hasil. Karena hasil antara fungsi perpustakaan dan non-perpustakaan tidak persis nilai floating-point yang sama, saya membandingkan perbedaan hasil terhadap nilai kecil ε daripada menggunakan kesetaraan.
Cobalah online!
sumber
JavaScript,
766766 byteTidak cantik tapi aku pergi terlalu jauh ke lubang kelinci dengan beberapa bir untuk tidak mempostingnya. Berasal secara independen dari solusi Nit.
Cobalah online
sumber
b=>Object.getOwnPropertyNames(M=Math).find(x=>M[x](.8)+M==b(.8)+M)
? (meskipun saya tidak tahu mengapa mengkonversi ke String untuk membandingkan)NaN
membandingkan sama denganNaN
, jadi apakah itu atauObject.is
.Bahasa Wolfram (Mathematica) , 86 byte
Cobalah online!
sumber
Ruby ,
7167 byteCobalah online!
sumber
JavaScript,
10870 byteSaya belum pernah mencoba bermain golf dalam Javascript murni, jadi saya yakin ada beberapa hal yang perlu ditingkatkan di sini.
Cukup mudah, periksa setiap fungsi pada
Math
prototipe terhadap nilai arbitrer (0,9, banyak nilai lain mungkin bekerja) dan membandingkannya dengan hasil dari fungsi kotak hitam.Diuji di Google Chrome, akan pecah jika fungsi kotak hitam input bukan salah satu pemicu.
Potong satu ton byte berkat Shaggy dan Neil.
sumber
0.3 -> .3
dan tetapkanMath
kem
dalamgetOwnPropertyNames()
.t=>Object.getOwnPropertyNames(m=Math).find(f=>m[f](.9,0)+''==t(.9)+'');
. Saya perhatikan @Shaggy juga digunakanfind
. The+''
tidak string membandingkan, berarti kita hanya harus memeriksa satu titik. Itu,0
membuat kita lewatiMath.atan2
.,0
diperlukan: tio.run/##Lc6xDoMgEMbxvU/RMEFq2TvgG1jdjYknomLkzghp7dPTqEz/…atan2
mendahuluiacosh
dalam array yang dikembalikan olehObject.getOwnPropertyNames
.getOwnPropertyNames
adalah Math.E, dan semua fungsi trigon sebelum itu.R , 75 byte
Cobalah online!
Untuk saat ini (R v3.5) berfungsi.
Jika dalam versi R yang akan datang akan ditambahkan fungsi yang cocok dengan regex ini, lalu siapa yang tahu: P
Find
sebagai gantinyafor
sumber
1i
berfungsi juga-1i
untuk -2 byte.HP 49G RPL, 88,0 byte tidak termasuk header program 10 byte
Solusi lain menggunakan bilangan kompleks! Masuk dan laksanakan dalam mode COMPLEX, APPROX. Mengambil fungsi pada stack.
(baris baru tidak masalah)
Untuk konstanta 2.0, semua dua belas fungsi trigonometri didefinisikan dalam bidang kompleks, jadi kami hanya mengevaluasi kedua belas trigonometri dan melihat mana yang cocok. Kali ini, solusi berulang lebih lama (111,5 byte) karena tumpukan shuffling diperlukan untuk mendapatkannya. RPL, sejauh yang saya tahu, tidak membiarkan Anda keluar dari lingkaran lebih awal.
sumber
->STR DUP SIZE 3 - " " " " IFTE XOR
, 34,5 byte. (masing-masing seharusnya terdiri dari 4 dan 3 ruang)Perl 6 , 39 byte
Cobalah online!
Dari penampilan, salah satu dari sedikit yang menggunakan introspeksi.
i
di sini adalah bilangan kompleks, yang nilainya unik untuk setiap fungsi trigonometri, jadi dengan mengulangi semua metode kita dapat menemukan metode yang cocok dan secara implisit meludahkan namanya. Initry
diperlukan karena beberapa metode (yang tidak diinginkan) memiliki tanda tangan yang berbeda.sumber
JavaScript (Node.js) , 72 byte
Cobalah online!
sumber