Diberi angka n> 77 , tulis sebuah program atau fungsi yang menemukan satu set bilangan bulat positif yang berbeda sehingga jumlah himpunan sama dengan n , dan jumlah kebalikan dari himpunan sama dengan 1.
Contoh untuk 80:
80 = 2 + 4 + 10 + 15 + 21 + 28 ⟶ 1/2 + 1/4 + 1/10 + 1/15 + 1/21 + 1/28 = 1
Program atau fungsi Anda harus (secara teoritis) bekerja untuk n <2 32 , dan tidak diizinkan untuk kesalahan pembulatan titik mengambang. Perhatikan bahwa solusi ada untuk semua n> 77 .
Kode terpendek dalam byte menang.
Ada insentif bonus: Saya akan memberikan hadiah untuk solusi terkecil yang bekerja untuk semua n dan menjalankan log (n) . Untuk n kecil harus cepat (ditentukan atas kebijaksanaan saya). Ya, ini mungkin.
O(log n)
algoritme.Jawaban:
Mathematica, 54 byte
Tentang tidak efisien karena mendapat, tetapi itu menyelesaikan
n = 78
dalam waktu sekitar 9 detik.Hasilnya dikembalikan sebagai daftar yang dibungkus dalam daftar tunggal, misalnya:
sumber
Python 3,
73061995 BytesSolusi ini berjalan dalam kompleksitas log (n) (sejauh yang saya tahu).
Anda dapat menguji yang
f(2**32 - 1)
berjalan hampir secara instanSaya menggunakan makalah ini pada metode untuk menghitungnya. Dengan metode ini ada sejumlah besar data untuk nilai yang ditentukan sebelumnya untuk n dari 78 menjadi 334 tanpa angka genap setelah 168. Saya ingin mengubah data ini menjadi sesuatu yang kecil dan saya tidak tahu algoritma kompresi yang baik jadi saya membuat saya sendiri.
Cara saya mengompresnya adalah dengan memiliki daftar aturan ganti string. Saya membuat metode yang menemukan aturan ganti string yang akan mengurangi sebagian besar konten dengan mempertimbangkan mendefinisikan aturan. Saya kemudian menerapkan ini secara rekursif sampai saya tidak dapat membuat aturan lagi (saya menggunakan karakter gz dan AZ). String yang saya buat untuk diganti adalah daftar nilai hex yang dipisahkan koma untuk masing-masing angka. Dalam retrospeksi, mengonversikannya ke nilai hex mereka mungkin bukan pilihan yang paling bijaksana, mungkin akan lebih pendek untuk membiarkannya dalam desimal, karena memiliki hex hanya akan menyimpan untuk angka 3 digit tetapi akan menambahkan 0 untuk angka digit tunggal.
Baris tempat saya atur c Anda dapat melihat daftar aturan ganti dan teks yang menjalankannya. Aturan perlu diterapkan secara terbalik juga karena beberapa aturan menyertakan karakter yang dibuat dari aturan lain.
Ada juga banyak tempat dalam kode ini di mana saya mungkin bisa mengurangi sintaksis, seperti mengubah daftar daftar menjadi satu daftar dan kemudian menggunakan metode berbeda untuk mengakses aturan mengganti teks dengan
sumber
n=218
output[2]
yang diharapkan ??Haskell, 93 byte
1 sangat lambat tetapi berjalan dalam memori konstan. Solusi sepele: periksa semua urutan
[2..n]
untuk jumlah dan jumlah timbal balik.Mengembalikan semua solusi alih-alih satu adalah 3 byte lebih pendek: hapus saja
!!0
(waspadalah: waktu berjalan akan selalu keluar dari grafik).1 Waktu berjalan tergantung pada seberapa awal hasilnya muncul dalam daftar berikutnya. Kemalasan Haskell menghentikan pencarian jika kecocokan pertama ditemukan. Ketika dikompilasi,
p 89
(hasil[3,4,6,9,18,21,28]
:) berjalan di laptop (4 tahun) saya di usia 35-an. Nilai-nilai lain, bahkan yang lebih kecil, bisa memakan waktu berjam-jam.sumber
Julia, 77 byte
Ini adalah fungsi lambda yang tidak efisien yang menerima integer dan mengembalikan array integer. Untuk menyebutnya, tetapkan ke variabel.
Kami mendapatkan partisi menggunakan integer
partitions
. Kami kemudian memfilter sekumpulan partisi hanya untuk mereka yang memiliki elemen unik yang jumlah balasannya menjadi 1. Untuk memastikan tidak ada kesalahan pembulatan, kami menggunakanRational
tipe Julia untuk membuat resiprokal.filter
mengembalikan sebuah iterator, jadi kita haruscollect
mengubahnya menjadi sebuah array. Ini memberi kita array array (hanya dengan satu elemen), jadi kita bisa menggunakan yang pertama[1]
.Sekarang, ketika saya mengatakan tidak efisien, saya sungguh-sungguh. Menjalankan ini untuk n = 80 membutuhkan 39,113 detik di komputer saya dan mengalokasikan 13,759 GB memori.
sumber