Cerita
Jadi saya punya buku yang ingin saya pisahkan dari meja saya dengan buku lain. Saya ingin tahu berapa banyak buku yang saya perlu untuk mencapai hal ini dengan panjang buku.
Berikut visualisasi yang dibuat oleh teman saya di Wolfram:
Informasi lebih lanjut tentang topik di Wolfram dan Wikipedia .
Tantangan
Diberikan input bilangan bulat , output berapa banyak buku yang dibutuhkan untuk buku teratas menjadi panjang buku dari tabel secara horizontal. atau
Temukan nilai integer terkecil untuk input dalam ketidaksetaraan berikut.
n m n m ∑ i = 1 1
Sunting: untuk fraksi, gunakan setidaknya floating point presisi-tunggal IEEE. maaf karena mengedit tantangan setelah posting
( OEIS A014537 )
Uji kasus
1 4
2 31
3 227
5 12367
10 272400600
Jawaban:
Oktaf ,
414033 byte1 byte disimpan berkat @Dennis
Cobalah online!
Penjelasan
Ini menggunakan fakta bahwa bilangan harmonik dapat dibatasi oleh fungsi logaritmik.
Juga,
>=
perbandingan dapat diganti oleh>
karena angka harmonik tidak dapat bahkan bilangan bulat (terima kasih, @ Dennis!).sumber
Python 3 , 35 byte
Cobalah online!
sumber
Sekam , 8 byte
Cobalah online!
Karena Sekam menggunakan bilangan rasional ketika bisa, ini tidak memiliki masalah floating point
Penjelasan
sumber
JavaScript, 30 byte
Fungsi rekursif sehingga akan keluar lebih awal.
Cobalah online
sumber
Haskell, 38 byte
sumber
Swift , 65 byte
Cobalah online!
Tidak disatukan
sumber
R , 39 byte
Cobalah online!
Paksaan!
sumber
Javascript (ES6), 34 byte
Tidak disatukan
Uji Kasus
Tampilkan cuplikan kode
sumber
eval
pernyataan?eval
yangi
variabel akan perlureturn
ed di akhir, pada biaya beberapa byte lagi.Jelly , 8 byte
Ini sangat lambat.
Cobalah online!
sumber
Haskell,
714948 byte@BMO menyelamatkan saya 22 byte!
sumber
Julia 0,6 ,
3027 byteCobalah online!
Hanya berhasil
n = 6
, karena Julia tidak memiliki optimasi panggilan ekor.-3 byte terima kasih kepada Dennis .
sumber
TI-BASIC, 27 byte
Meminta pengguna untuk input dan menampilkan output saat penghentian. Catatan:
⁻¹
adalah token -1 (terbalik).sumber
Ans
diN
segera, makaInput N
atauPrompt N
merupakan metode input yang menghemat satu byte lebihAns→N
. DanM
dapat digantikan olehAns
, sehingga1→M
menjadi1
danM+1→M
menjadiAns+1
. (Tapi saya skeptis tentang outputAns
yang tidak ditampilkan - lihat ini - jadi mungkin diakhiri dengan:Ans
tepat: maka nilainya akan ditampilkan di tempat "Selesai".)Ans→N
merasa lucu. Optimasi yang bagus. Juga mengambil saran Anda tentang output hanya agar aman. Masih keluar dengan net -3 byte: D05AB1E , 11 byte
Cobalah online!
Penjelasan
sumber
Pyth , 10 byte
Cobalah online!
Sangat lambat.
Pyth , 10 byte
Cobalah online!
sumber
Japt , 12 byte
Panjangnya sama, tetapi sedikit lebih efisien daripada, opsi rekursif.
Cobalah
Penjelasan
sumber
J, 22 byte
-6 byte terima kasih kepada frownyfrog
Cobalah online!
jawaban asli
Jawaban Luis dalam J:
Tidak disatukan
Kebanyakan penasaran untuk melihat apakah itu dapat ditingkatkan secara drastis ( batuk paging mil)
Penjelasan
Cobalah online!
sumber
1+]i.~[:<.
->1+]I.~
->I.~0,
I.~0+/\@,
PHP, 35 byte
Jalankan menggunakan CLI:
sumber
Bahasa Wolfram (Mathematica) , 40 byte
Cobalah online!
sumber
Java 8, 49 byte
Penjelasan:
Cobalah online. (Waktu habis untuk kasus uji di atas
n=7
.)sumber
tinylisp , 98 byte
Baris terakhir adalah fungsi lambda tanpa nama yang mengambil jumlah panjang buku dan mengembalikan jumlah buku yang dibutuhkan. Cobalah online!
Penjelasan
Satu-satunya tipe data numerik yang dimiliki tinylisp adalah bilangan bulat, jadi kami menghitung seri harmonik sebagai fraksi dengan melacak pembilang dan penyebut. Pada setiap langkah,
N
adalah pembilang,D
adalah penyebut, dank
merupakan indeks penjumlahan. Kami ingin jumlah parsial yang baru menjadiN/D + 1/k
, atau(N*k + D)/(D*k)
. Dengan demikian, kami berulang dengan pembilang baruN*K + D
, penyebut baru untukD*k
, dan indeks baruk+1
.Rekursi harus berhenti setelah jumlah parsial lebih besar atau sama dengan
#
, jumlah panjang buku yang diinginkan. Pada titik ini, kami sudah terlalu jauh membaca satu buku, jadi kami kembalik-1
. Kondisinya1/2 * N/D < #
; mengalikan penyebutnya, kita dapatkanN < D*#*2
, yang merupakan cara paling golf untuk menulisnya.Fungsi pembantu rekursif
_
melakukan semua perhitungan ini; fungsi utama hanyalah satu-argumen pembungkus yang panggilan_
dengan nilai-nilai awal yang benar untukk
,N
, danD
.sumber