Tugas Anda adalah mengubah desimal kembali menjadi jumlah akar kuadrat dari bilangan bulat. Hasilnya harus memiliki akurasi setidaknya 6 digit desimal yang signifikan.
Masukan :
Angka yang menunjukkan jumlah akar kuadrat dan desimal yang menunjukkan angka untuk perkiraan.
Contoh input:
2 3.414213562373095
Keluaran : Bilangan bulat dipisahkan oleh spasi yang, ketika kuadrat dan ditambahkan, kira-kira desimal asli akurat hingga setidaknya 6 angka desimal yang signifikan.
Nol tidak diizinkan dalam solusi.
Jika ada beberapa solusi, Anda hanya perlu mencetak satu.
Contoh output (dalam urutan apa pun):
4 2
Ini berhasil karena Math.sqrt(4) + Math.sqrt(2) == 3.414213562373095
.
Ini kode golf. Kode terpendek (dengan bonus opsional) menang!
Akan selalu ada solusi tetapi -10 jika program Anda mencetak "Tidak" ketika tidak ada solusi dengan bilangan bulat. Selain itu, -10 jika program Anda mencetak semua solusi (dipisahkan oleh baris baru atau titik koma atau apa pun) alih-alih hanya satu.
Kasus uji:
3 7.923668178593959 --> 6 7 8
2 2.8284271247461903 --> 2 2
5 5.0 --> 1 1 1 1 1
5 13.0 --> 4 4 9 9 9 --> 81 1 1 1 1 --> 36 9 4 1 1 etc. [print any, but print all for the "all solutions bonus"]
Dan ya, program Anda harus selesai dalam waktu yang terbatas menggunakan memori yang terbatas pada mesin yang masuk akal. Itu tidak bisa hanya berfungsi "secara teori," Anda harus dapat benar-benar mengujinya.
sumber
6 7 8
untuk bonus kedua?Jawaban:
Python 3, 90 - 10 = 80
(Mega terima kasih kepada @xnor untuk kiat, terutama restrukturisasi for for loop sementara)
Upaya rekursif sederhana. Dimulai dengan angka target dan terus mengurangi akar kuadrat hingga mencapai 0 atau lebih rendah. Fungsi
S
dapat disebut sepertiS(2,3.414213562373095)
(argumen kedua diasumsikan positif).Program ini tidak hanya mencetak semua solusi, ia mencetak semua permutasi solusi (agak asing, saya tahu). Inilah output untuk kasus terakhir: Pastebin .
Tweak sedikit memberikan solusi 98 - 10 = 88 yang tidak mencetak permutasi, membuatnya lebih efisien:
Dan hanya untuk bersenang-senang, 99 - 10 = 89 yang satu ini seefisien yang didapatnya (tidak seperti yang lain, ini tidak membuat tumpukan
S(1,1000)
:Perhatikan bahwa, meskipun kami memiliki argumen default yang dapat diubah, ini tidak pernah menyebabkan masalah jika kami menjalankan kembali fungsinya karena
n+[i]
membuat daftar baru.Bukti kebenaran
Untuk berakhir dalam loop tak terbatas, kita harus menekan beberapa titik di mana x <0 dan 0,1 + x 2 > 1 . Hal ini puas dengan x <-0,948 ... .
Tetapi perhatikan bahwa kita mulai dari x positif dan x selalu menurun, jadi untuk mencapai x <-0,948 ... kita harus memiliki x '- i 0,5 <-0,948 ... untuk beberapa x'> -0,948 .. . sebelum x dan bilangan bulat positif saya . Agar loop sementara berjalan, kita juga harus memiliki 0,1 + x ' 2 > i .
Penyusunan ulang kita dapatkan x ' 2 + 1,897x' + 0,948 <i <0,1 + x ' 2 , bagian luar menyiratkan bahwa x' <-0,447 . Tetapi jika -0.948 <x '<-0.447 , maka tidak ada bilangan bulat positif saya bisa cocok dengan kesenjangan dalam ketidaksetaraan di atas.
Karenanya kita tidak akan pernah berakhir dalam loop yang tak terbatas.
sumber
abs
denganx*x<1e-12
.while
lingkaran bekerja untuk menggantikanfor
:while.1+x*x>i:S(x-i**.5,n+[i]);i+=1
, setelah diinisialisasii=1
dalam parameter fungsi. Idenya adalah untuk menghindari keharusan mengkonversi keint
s. The.1
adalah untuk menangani ketidakakuratan mengapung; Saya pikir itu aman terhadap loop tak terbatas.N
sekarang argumen fungsi, lebih pendek untuk berulang denganN-1
dan memeriksa kapanN==0
daripadalen(n)==N
..1
ini aman; Saya dapat ngobrol argumen Anda jika Anda mau.ECLiPSe Prolog - 118 (138-20)
Saya menggunakan implementasi Prolog berikut ini: http://eclipseclp.org/
Ini adalah pendekatan yang sangat naif dan eksponensial. Mendaftarkan semua solusi yang mungkin membutuhkan waktu untuk mencakup semua kombinasi ( edit : kisaran bilangan bulat yang dikunjungi sekarang berkurang di setiap langkah, yang menghilangkan banyak kombinasi yang tidak berguna).
Berikut ini transkrip sesi tes. Secara default, lingkungan akan mencoba menemukan semua solusi yang mungkin (-10) dan mencetak "Tidak" ketika gagal melakukannya (-10).
Seperti Sp3000 dicatat dengan benar dalam komentar, itu juga mencetak "Ya" ketika berhasil. Itu pasti berarti saya dapat menghapus 10 poin lagi ;-)
(Sunting) Mengenai kinerja, itu cukup bagus, setidaknya dibandingkan dengan yang lain (lihat misalnya komentar ini dari FryAmTheEggman ). Pertama, jika Anda ingin mencetak semua hasil, tambahkan predikat berikut:
Lihat http://pastebin.com/ugjfEHpw untuk kasus (5,13.0), yang selesai dalam 0,24 detik dan menemukan 495 solusi (tapi mungkin saya kehilangan beberapa solusi, saya tidak tahu).
sumber
Erlang,
305-10302-10Fungsi ini mengembalikan string "Tidak" atau string dengan nilai yang dipisahkan oleh spasi. Ini (tidak efisien) memproses setiap nilai yang mungkin mengkodekannya menjadi bilangan bulat besar, dan mulai dengan nilai yang lebih tinggi. 0 tidak diperbolehkan dalam solusi, dan 0 yang disandikan mewakili semua. Kesalahan dikuadratkan.
Contoh:
Harap bersabar
f(5,13.0)
karena ruang fungsi pencarian adalah 13 ^ 10. Itu dapat dibuat lebih cepat dengan 2 byte tambahan.sumber
Python
32:173159 - 10 = 149Penjelasan: Setiap solusi berbentuk x_1 x_2 ... x_n dengan 1 <= x_1 <= x ^ 2 di mana x adalah jumlah target. Oleh karena itu kita dapat menyandikan setiap solusi sebagai bilangan bulat di basis x ^ 2. Loop sementara iterates atas semua kemungkinan (x ^ 2) ^ n. Lalu saya mengonversi bilangan bulat kembali dan menguji jumlahnya. Cukup lurus ke depan.
Ia menemukan semua solusi, tetapi test case terakhir terlalu lama.
sumber
JavaScript (ES6) 162 (172 - 10)
173Sunting Sedikit lebih pendek, sedikit lebih lambat.
Sebagai fungsi dengan 2 parameter, output ke konsol javascript. Ini mencetak semua solusi tanpa pengulangan (solusi tuple yang dihasilkan sudah diurutkan).
Saya lebih peduli tentang waktu daripada tentang jumlah char, sehingga mudah diuji di konsol browser dalam batas waktu javascript standar.
(Pembaruan Feb 2016) Waktu saat ini untuk kasus uji terakhir: sekitar 1
150 detik. Persyaratan memori: dapat diabaikan.Versi ES 5 Semua browser
Cuplikan Uji harus dijalankan pada browser terbaru apa pun
( Sunting ) Di bawah ini adalah hasil pada PC saya ketika saya memposting jawaban ini 15 bulan yang lalu. Saya mencoba hari ini dan 100 kali lebih cepat pada PC yang sama, hanya dengan versi 64-bit alpha dari Firefox (dan Chrome tertinggal jauh di belakang)! - waktu saat ini dengan Firefox 40 Alpha 64 bit: ~ 2 detik, Chrome 48: ~ 29 detik
Output (pada PC saya - angka terakhir adalah runtime dalam milidetik)
sumber
Mathematica - 76 - 20 = 56
Contohnya
sumber
No
? Juga, output tidak dipisahkan ruang. Juga, tidak bisakah Anda menggunakanTr@
bukanPlus@@
? Dan Anda mungkin dapat menyimpan beberapa karakter dengan mengubahSelect
keCases
, fungsi di akhir pola, dan membuatf
fungsi murni tanpa nama.Haskell,
8780 - 10 = 70Ini adalah algoritma rekursif mirip dengan program Python 3 dari @ Sp3000. Ini terdiri dari fungsi infiks
#
yang mengembalikan daftar semua permutasi semua solusi.Dengan skor
102 9992 - 10 = 82 kita dapat mencetak setiap solusi hanya sekali, diurutkan:sumber
Pyth
55 5447-20 = 27Cobalah online.
Tanpa malu meminjam dari komentar xnor ;)
Ini akan kehabisan memori pada komputer waras apa pun bahkan untuk nilai seperti
5,5.0
. Mendefinisikan fungsig
,, yang bisa disebut sepertig 3 7.923668178593959
.Program python 3 ini pada dasarnya menggunakan algoritma yang sama (hanya tidak melakukan pencetakan "Tidak" pada akhirnya, yang dapat dilakukan dengan menetapkan variabel ke semua hasil, lalu menulis
print(K if K else "No")
), tetapi menggunakan generator, jadi ia tidak t mendapatkan kesalahan memori (masih akan memakan waktu sangat lama, tetapi saya telah membuatnya mencetak ketika menemukan nilai-nilai):Ini memberikan hasil yang sama persis dengan yang didapat @ Sp3000. Juga, ini butuh beberapa hari untuk menyelesaikannya (saya tidak menghitung waktu, tetapi sekitar 72 jam).
sumber
Python 3 -
157174169 - 10 = 159Sunting1: Mengubah format output ke integer yang dipisahkan ruang alih-alih dipisahkan oleh koma. Terima kasih atas tip melepas kawat gigi di sekitar (n, x).
Sunting2: Terima kasih atas tip golfnya! Saya dapat memotong 9 karakter lain jika saya hanya menggunakan uji == alih-alih menguji untuk persamaan perkiraan dalam 1e-6, tapi itu akan membatalkan solusi perkiraan, jika ada.
Gunakan itertools untuk menghasilkan semua kombinasi integer yang mungkin, semoga efisien :)
Saya belum menemukan cara untuk menambahkan pencetakan "Tidak" secara efisien, sepertinya selalu butuh lebih dari 10 karakter tambahan.
sumber
n,x
.SyntaxError
ketika saya mencobaeval
garis ...from itertools import*
menghemat 1, menghapus ruangz**.5for
menghemat 1, dan menghapus[]
dalamsum(z**.5for z in c)
menghemat 2 dan menghapus()
dalamif(...)
menyimpan 1.n,x=input()
menjadi lebih ringkas?Scala (397 bytes - 10)
Jika tidak ada permutasi, maka program ini tidak mencetak apa pun.
sumber