Fungsi Anda mengambil nomor alami dan mengembalikan nomor alami terkecil yang memiliki jumlah pembagi yang tepat, termasuk dirinya sendiri.
Contoh:
f(1) = 1 [1]
f(2) = 2 [1, 2]
f(3) = 4 [1, 2, 4]
f(4) = 6 [1, 2, 3, 6]
f(5) = 16 [1, 2, 4, 8, 16]
f(6) = 12 [1, 2, 3, 4, 6, 12]
...
Fungsi tidak harus mengembalikan daftar pembagi, mereka hanya ada di sini untuk contoh.
Jawaban:
APL,
252423 karakterMenentukan fungsi
f
yang kemudian dapat digunakan untuk menghitung angka:Solusinya memanfaatkan fakta bahwa LCM (n, x) == n iff x membagi n . Dengan demikian, blok
{+/⍵=⍵∧⍳⍵}
hanya menghitung jumlah pembagi. Fungsi ini diterapkan ke semua angka dari 1 hingga 2 ^ d¨⍳2*⍵
. Daftar yang dihasilkan kemudian dicari untuk d sendiri (⍳⍵
) yang merupakan fungsi yang diinginkan f (d) .sumber
{⍵⍳⍨(+/⊢=⊢∧⍳)¨⍳2*⍵}
f
.GolfScript,
2928 karakterSunting: Satu char dapat disimpan jika kami membatasi pencarian untuk <2 ^ n, terima kasih kepada Peter Taylor untuk ide ini.
Versi sebelumnya:
Upaya dalam GolfScript, jalankan online .
Contoh:
Kode dasarnya berisi tiga blok yang dijelaskan secara rinci di baris berikut.
sumber
1
.Python: 64
Merevisi solusi Bakuriu dan memasukkan saran grc serta trik dari solusi R plannapus, kami mendapatkan:
sumber
Python: 66
Di atas akan meningkatkan
RuntimeError: maximum recursion depth exceeded
dengan input kecil di CPython, dan bahkan menetapkan batas ke jumlah yang sangat besar itu mungkin akan memberikan beberapa masalah. Pada implementasi python yang mengoptimalkan rekursi ekor, ia seharusnya bekerja dengan baik.Versi yang lebih verbose, yang seharusnya tidak memiliki batasan seperti itu, adalah solusi 79 byte berikut :
sumber
if else
denganand or
dan==1
dengan<1
:f=lambda n,k=1:n==sum(k%i<1for i in range(1,k+1))and k or f(n,k+1)
sum(k%-~i<1for i in range(k))
f=lambda n,k=1:n==sum(k%-~i<1for i in range(k))or-~f(n,k+1)
menghemat 7 byte.Mathematica
3836Pemakaian:
Hasil:
Edit
Beberapa penjelasan:
Ketika
form[i]
saya menggunakan fungsi1 &
, itu selalu kembali1
, sehingga secara efektif menghitung jumlah pembagi dengan cara singkat.sumber
DivisorSum
dikembalikan (jumlah pembagi) tetapi saya tidak melihat bagaimana itu penting untuk menjawab pertanyaan yang diajukan. Tolong jelaskan bagaimana cara kerjanya. BTW, saya pikir Anda harus memasukkan data waktu untuk n = 200; fungsinya sangat cepat, mengingat semua angka yang harus diperiksa.J, 33 karakter
Cukup cepat, melewati semua angka yang lebih kecil dan menghitung jumlah pembagi berdasarkan faktorisasi.
sumber
Haskell 54
Solusi cepat dan kotor (sangat mudah dibaca dan tidak rumit):
sumber
K, 42
Solusi rekursif yang tidak efisien yang meledakkan tumpukan dengan cukup mudah
.
sumber
APL 33
Contoh:
sumber
APL (25)
sumber
R - 47 karakter
!n%%1:n
memberikan vektor booleans: BENAR ketika bilangan bulat dari 1 ke n adalah pembagi n dan SALAH jika tidak.sum(!n%%1:n)
memaksa booleans ke 0 jika FALSE dan 1 jika TRUE dan menjumlahkannya, sehingga ituN-sum(...)
adalah 0 ketika jumlah pembagi adalah N. 0 kemudian diartikan sebagai FALSE olehwhile
yang kemudian berhenti.Pemakaian:
sumber
Javascript 70
Benar-benar hanya ada 46 karakter yang bermakna:
Saya mungkin harus belajar bahasa dengan sintaks yang lebih pendek :)
sumber
N=>eval("for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j));i")
Haskell: 49 karakter
Itu bisa dilihat sebagai peningkatan dari solusi Haskell sebelumnya, tetapi itu dikandung dengan sendirinya (peringatan: sangat lambat):
Ini fungsi yang cukup menarik, misalnya perhatikan bahwa f (p) = 2 ^ (p-1), di mana p adalah bilangan prima.
sumber
n
menjadi bilangan prima (dengan pengulangan), mengurutkan menurun, mengurangi masing-masing, zip dengan urutan bilangan prima yang tak terbatas, dan kemudian melipat produkp^(factor-1)
C:
6664 karakterSolusi yang hampir singkat:
Dan solusi saya sebelumnya yang tidak berulang:
Harus ada solusi yang jauh lebih pendek.
sumber
Haskell (120C), metode yang sangat efisien
Kode uji:
Metode ini sangat cepat. Idenya adalah pertama untuk menemukan faktor utama
k=p1*p2*...*pm
, di mana p1 <= p2 <= ... <= pm. Maka jawabannya adalahn = 2^(pm-1) * 3^(p(m-1)-1) * 5^(p(m-2)-1) ...
.Misalnya, memfaktorkan k = 18, kita mendapatkan 18 = 2 * 3 * 3. 3 bilangan prima pertama adalah 2, 3, 5. Jadi jawabannya n = 2 ^ (3-1) * 3 ^ (3-1) * 5 ^ (2-1) = 4 * 9 * 5 = 180
Anda dapat mengujinya di bawah
ghci
:sumber
Brachylog , 2 byte
Cobalah online!
Mengambil input melalui variabel output dan output melalui variabel inputnya.
Predikat yang sama persis ini, mengambil input melalui variabel inputnya dan mengeluarkan melalui variabel outputnya, menyelesaikan tantangan ini sebagai gantinya .
sumber
C, 69 karakter
Bukan yang terpendek, tetapi jawaban C pertama:
f(n,s)
menghitung pembagin
dalam kisaran tersebut1..s
. Jadif(n,n)
diperhitungkan pembagin
.g(d)
loop (dengan rekursi) hinggaf(x,x)==d
, lalu mengembalikan x.sumber
Mathematica
3836Pemakaian
Entri pertama (sebelum
code-golf
tag ditambahkan ke pertanyaan.)Masalah langsung, mengingat bahwa
Divisors[n]
mengembalikan pembagin
(termasukn
) danLength[Divisors[n]]
mengembalikan jumlah pembagi tersebut. **Contohnya
sumber
Length@Divisors@n
ituDivisorSigma[0,n]
.DivisorSigma
.Jelly , 6 byte (tidak bersaing)
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
2*
? Apakah setiap angka setelahnya memiliki lebih banyak pembagi daripada n?2**(n-1)
termasuk dalam rentang itu, yang terkecil juga.C ++, 87 karakter
sumber
Python2, 95 karakter, Non-rekursif
Sedikit lebih bertele-tele daripada solusi python lain tetapi tidak bersifat rekursif sehingga tidak mencapai batas rekursi cpython:
sumber
Perl 6 , 39 karakter
Contoh penggunaan:
sumber