Pembagi angka n adalah angka yang membagi n secara merata , termasuk 1 dan n itu sendiri. Jumlah pembagi d (n) adalah berapa banyak pembagi yang dimiliki suatu angka. Inilah d (n) untuk pasangan pertama n:
n divisors d(n)
1 1 1
2 1, 2 2
3 1, 3 2
4 1, 2, 4 3
5 1, 5 2
6 1, 2, 3, 6 4
Kami berulang kali dapat mengurangi jumlah pembagi dari suatu angka. Sebagai contoh:
16 = 16
16 - d(16) = 16 - 5 = 11
11 - d(11) = 11 - 2 = 9
9 - d( 9) = 9 - 3 = 6
6 - d( 6) = 6 - 4 = 2
2 - d( 2) = 2 - 2 = 0
Dalam hal ini dibutuhkan 5 langkah untuk mencapai 0.
Tulis program atau fungsi yang diberi nomor nonnegatif n kembalikan jumlah langkah yang diperlukan untuk menguranginya menjadi 0 dengan pengurangan berulang dari jumlah pembagi.
Contoh:
0, 0
1, 1
6, 2
16, 5
100, 19
100000, 7534
Jawaban:
Jelly,
109 byte1 byte berkat Dennis ♦ .
Port jawaban saya di Pyth .
Cobalah online!
Suite uji.
Penjelasan
sumber
Python, 49 byte
orlp membantu menghemat satu byte! Dan Sp3000 menyimpan dua lagi. Terima kasih!
sumber
-~
dalamn%-~k
, dan menghapus batas bawah rentang.C, 52 byte
sumber
Pyth, 10 byte
Suite uji.
Penjelasan
sumber
Julia, 31 byte
Implementasi rekursif langsung.
sumber
MATL , 14 byte
Cobalah online!
Penjelasan
sumber
JavaScript (ES6),
6451 byteJangan tanya kenapa saya tidak perlu menggunakan rekursi ekor.
sumber
Jawa,
14793sumber
n=new Integer(100000)
bukannyan=100000
?05AB1E,
1210 byteKode:
Penjelasan:
Cobalah online
Sunting: 2 byte disimpan dan bug dengan input 0 diperbaiki berkat @Adnan
sumber
[Ð>#Ñg-¼]¾
. Harus ada cara untuk membuatnya lebih pendek ...D0Q#
bagiannya adalah setelah kenaikan counter. The[Ð>#Ñg-¼]¾
kode harus bekerja untuk0
meskipun :).R, 50 byte
Implementasi yang cukup sederhana. Cobalah online
sumber
Mathcad, [tbd] byte
Skema ekivalensi byte Mathcad belum ditentukan. Menggunakan kesetaraan keystroke kasar, program ini menggunakan sekitar 39 "byte". Perhatikan bahwa sementara dan untuk operator pemrograman masing-masing hanya mengambil satu operasi keyboard untuk memasukkan (ctl-] dan ctl-shft- #, masing-masing) - memang, mereka hanya dapat dimasukkan dengan cara ini dari keyboard.
Apa yang Anda lihat adalah persis apa yang akan diletakkan di lembar kerja Mathcad. Mathcad mengevaluasi persamaan / program dan menempatkan output pada lembar yang sama (misalnya, setelah operator evaluasi '=' atau di plot).
sumber
MATL, 13 byte
Cobalah online
Penjelasan:
sumber
Mathematica, 35 byte
Memanfaatkan yang baik tua
DivisorSigma
. @ MartinBüttner mencatat alternatif berikut:sumber
Hoon ,
9376 byteTidak Disatukan:
Mengembalikan fungsi yang mengambil atom
r
,. Buat nilai menengah yang berisi semua devisors darir
(Buat daftar [1..n], simpan hanya elemen di mana (mod ri) == 0). Jikar
nol, kembalikan nol, jika tidak kembalikan nilai berulang dari pengulangan dengan r sama dengan r- (pembagi panjang).Kode as-is membutuhkan jumlah waktu yang bodoh untuk mengevaluasi n = 100.000, seluruhnya karena menemukan pembagi angka besar membuat daftar raksasa dan memetakannya. Memoizing para pembagi mendapat hasil yang benar untuk n = 10.000, tapi saya tidak repot menunggu sekitar 100.000
sumber
Haskell,
434039 bytePendekatan rekursif sederhana. Contoh penggunaan:
g 16
->5
.Sunting: @ Lynn disimpan
34 byte. Terima kasih!sumber
g(sum$signum.mod n<$>[1..n])
?min 1
sebenarnya satu byte lebih pendek darisignum
, bahkanPowerShell v2 +,
7467 byteTampaknya cukup panjang dibandingkan dengan beberapa jawaban lain ...
Mengambil input
$n
, memasukifor
lingkaran dengan kondisi yang$n
lebih besar dari0
. Setiap iterasi loop kami atur helper$a
, lalu loop melalui setiap angka dari1
hingga$n
. Setiap loop batin kami memeriksa setiap angka untuk melihat apakah itu pembagi, dan jika demikian kami menambah pembantu kami$a
(menggunakan negasi Boolean dan implisit cast-to-int). Lalu, kita kurangi berapa banyak pembagi yang kita temukan$n-=$a
dan tambahkan penghitung kita$o++
. Akhirnya, kami output$o
.Butuh waktu lama untuk dieksekusi, karena ini adalah konstruksi for-loop yang signifikan. Misalnya, menjalankan
n = 10,000
komputer saya (Core 1 i5 lama) membutuhkan waktu hampir 3 menit.sumber
Racket -
126 byte Turun ke 98 byte91 byteSolusi yang sangat naif - mungkin bisa ditebang dengan algoritma yang layak dan beberapa trik lisp yang saya tidak tahuEdit: penjelasan dengan permintaan. Seperti yang saya katakan, ini adalah solusi rekursif yang sangat naif dan bisa jauh lebih pendek.
Sunting versi 2: 98 byte dengan algoritme yang kurang bodoh (masih sangat bodoh dan bisa lebih pendek)Penjelasan:Sunting 3: Disimpan 7 byte dengan menggantinya
(cdr(build-list x values))
dengan(build-list x add1)
sumber
> <> , 52 + 2 = 54 byte
Nomor input harus ada pada stack pada awal program, jadi ada +2 byte untuk
-v
flag. Cobalah online!4 byte yang mengganggu terbuang untuk masalah perataan. Bah
Yang ini bekerja dengan membangun urutan dari
n
ke0
di tumpukan. Setelah 0 tercapai, letakan dan ouput panjang tumpukan yang tersisa.Ngomong-ngomong, ini berjalan
O(n^2)
tepat waktu, jadi saya tidak akan mencoban = 100000
...sumber
-v
adalah satu byte, bukan dua.> <> , 36 + 3 = 39 byte
Implementasi relatif mudah, dengan setiap iterasi menjadi
sum(n%k>0 for k in range(1,n-1))
. +3 byte untuk-v
bendera, per meta .Cobalah online!
sumber
Ruby, 42 byte
Ada kesalahan stack overflow pada case uji terbesar
100000
, jadi inilah versi berulang dalam 49 byte . Butuh beberapa saat, mengingatO(N^2)
kompleksitasnya.sumber
Perl 5, 40 byte
Input dan output adalah sebagai daftar jumlah salinan yang diperlukan
1
.sumber
C #, 63 byte
sumber
Sebenarnya, 17 byte
Cobalah online! (catatan: waktu uji kasus terakhir habis pada TIO)
Penjelasan:
sumber