pengantar
Ini adalah tantangan yang sangat sederhana: cukup hitung pembagi angka. Kami pernah menghadapi tantangan yang serupa tetapi lebih rumit sebelumnya, tapi saya bermaksud yang ini menjadi entry-level.
Tantangan
Buat program atau fungsi yang, dengan satu bilangan bulat positif N
, menghasilkan atau mengembalikan berapa banyak pembagi yang dimilikinya, termasuk 1 dan N
.
Input: Satu bilangan bulat> 0. Anda dapat menganggap bahwa angka tersebut dapat direpresentasikan dalam tipe numerik asli bahasa Anda.
Output: Jumlah pembagi integer positif yang dimilikinya, termasuk 1 dan nomor itu sendiri.
Pengajuan akan dicetak dalam byte . Anda mungkin menemukan situs web ini berguna, meskipun Anda dapat menggunakan metode yang masuk akal untuk menghasilkan jumlah byte Anda.
Ini kode-golf , jadi skor terendah menang!
Sunting: Sepertinya jawaban Pyth 5-byte FryAmTheEggman adalah pemenangnya! Namun, jangan ragu untuk mengirimkan jawaban baru; jika Anda bisa mendapatkan sesuatu yang lebih pendek, saya akan mengubah jawaban yang diterima.
Uji Kasus
ndiv(1) -> 1
ndiv(2) -> 2
ndiv(12) -> 6
ndiv(30) -> 8
ndiv(60) -> 12
ndiv(97) -> 2
ndiv(100) -> 9
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
# Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
C ++C,4357564643 byteAtas saran Martin Büttner:
sumber
i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
LabVIEW, 4938 Bytes
Yah itu jelas tidak cocok untuk golf kode tetapi apa pun, jadi untuk posting pertama saya dan lolz begini.
sumber
.
, yang saya cukup yakin dimaksudkan sebagai pemisah seribu, bukan titik desimal (seperti yang umum dalam beberapa bahasa).Haskell, 28 byte
Kuncinya di sini adalah untuk menguji apakah sisanya
0
menggunakan fungsi indikator0^
.Ini berfungsi karena setiap kekuatan positif 0 adalah 0, sedangkan 0 ^ 0 secara kombinatorial adalah produk kosong dari 1.
Bandingkan ini dengan pemfilteran
sumber
Dyalog APL ,
76 byteIni adalah fungsi tanpa nama yang dapat dinamai dan kemudian digunakan kembali untuk setiap (
¨
) kasus uji sebagai berikut:Penjelasan:
Menghitung
≢
yang∘
unik∪
dari GCD∨
sendiri⊢
dan masing-masing bilangan bulat-sampai⍳
.Terima kasih kepada ngn untuk menyimpan byte.
Versi lama:
+/0=⍳|⊢
Begini Cara kerjanya:
⍳|⊢
1-through-argumen pembagian-sisa argumen0=
Boolean jika 0 sama dengan sisa pembagian+/
Jumlah boolean, yaitu jumlah yang.sumber
Python 2, 37 byte
Fungsi rekursif. Input opsional
i
pada pembagi yang diuji. Ekspresi(n%i<1)
menguji pembagian, denganTrue
(yang sama dengan1
) untuk pembagi. Hasilnya ditambahkan ke ekspresi recusive untuki+1
. Ketikai==n
tercapai, lantai-bilangan bulati/n
dievaluasi untuk1
, dan nilai itu dikembalikan sebagai kasus dasar, yang dengann
sendirinya menjadi pembagin
.38:
Fungsi anonim. Tes semua kemungkinan pembagi
1
melaluin
. Ini digeser naik dari0
melaluin-1
dirange(n)
menggunakan-~
, yang menambahkan1
. Menjumlahkan bools menggunakan fakta bahwa Python memperlakukanTrue
/False
sebagai1
/0
.sumber
Retina , 17 byte
Input dalam unary , output dalam desimal.
Cobalah online.
Ketika dipanggil dengan regex tunggal, Retina hanya menghitung pertandingan. Regex itu sendiri cocok dengan posisi , di mana angka unary di sebelah kiri itu adalah pembagi dari seluruh input. Saya juga memanfaatkan fakta bahwa lookaround adalah atom, sehingga saya tidak perlu menggunakan
^
jangkar.Tampilan pertama hanya menangkap seluruh awalan dalam grup
1
. Ini tidak akan pernah gagal, jadi setelah melihat ke belakang kita tahu apa yang ada di grup 1 dan itu tidak akan berubah lagi.Lookahead kemudian memeriksa apakah kita dapat mencapai ujung string dengan mengulangi string yang ditangkap (pembagi potensial kita) 0 kali atau lebih.
sumber
J, 10 byte
Ini adalah kata kerja monadik tanpa nama. Ini menghitung σ 0 (∏p k α k ) sebagai ∏ (α k + 1) .
Cobalah online dengan J.js .
Bagaimana itu bekerja
sumber
q:
diperbolehkan karena itu memecahkan bagian penting dari tantangan. Bagaimana kalau[:+/0=]|~1+i.
q:
.Golfscript,
19181713 byteDengan terima kasih kepada Martin Büttner .
Bagaimana itu bekerja
Juga
Dari @Peter Taylor , juga dalam 13 byte.
Bagaimana itu bekerja
sumber
~:X,{)X\%!},,
J,
131211 byteGolf pertamaku di J. Aku masih mempelajarinya.
Menyimpan satu byte berkat Dennis.
Disimpan satu byte lagi berkat randomra.
Penjelasan:
sumber
Arcyóu , 12 byte
Ayo mulai pestanya!
Ini menggunakan fungsi bawaan
d/
. Berikut adalah versi tanpa built-in (27 byte):Penjelasan:
sumber
CJam, 11 byte
Uji di sini.
Penjelasan
CJam tidak memiliki bawaan untuk ini, jadi kami melakukan pembagian percobaan.
Bonus
Berikut adalah solusi yang menarik pada 12 byte (yang saya duga mungkin paling pendek dalam bahasa seperti J):
Hasilnya sama dengan berapa kali
n
muncul dalamn x n
tabel perkalian:sumber
Matlab, 20 byte
Lakukan
k mod n
untuk setiapk = 1,...,n
, kemudian lakukannot
(yang mengubah setiap nonzer menjadi nol dan setiap nol menjadi 1) dan jumlahkan semua nilai tersebut.sumber
length(divisors(n))
.@(n)
untuk menjadikannya submision yang validJulia, 20 byte
Ini adalah fungsi anonim yang berfungsi sebagai berikut: Untuk setiap bilangan bulat dari 1 ke input, uji apakah input modulo bilangan bulat adalah nol. Jika demikian, nilainya akan menjadi
true
sebaliknyafalse
. Kami menjumlahkan boolean yang secara implisit dilemparkan ke bilangan bulat, menghasilkan jumlah pembagi.Solusi yang lebih keren (meskipun juga lebih lama), termasuk untuk kelengkapan, adalah
Ini mendapatkan faktorisasi kanonik
n
, yaitu\prod_{i=1}^k p_i^e_i
, dan menghitung fungsi pembagi sebagaiτ(n) = \prod_{i=1}^k e_i + 1
.sumber
PARI / GP, 6 byte
PARI / GP memiliki built-in untuk ini.
sumber
Pyth, 8 byte
Divisi uji coba sederhana.
Cobalah online di sini .
sumber
Ruby, 27 byte
Contoh dijalankan:
sumber
Oktaf,
2120 bytesumber
nnz
, penggunaan yang bagus di sini =)Regex (.NET), 33 byte
Dengan asumsi input dan output dalam kondisi unary, dan output diambil dari pertandingan utama regex.
Hancurkan regex:
.*$
ets pointer ke ujung string sehingga kita memiliki seluruh input x dalam satu arah.(?<=^\2*(.+?(?>\2?)))
cocok dari kanan ke kiri dan memeriksa pembagi dengan menggeser dari x ke 0.(.+?(?>\2?))
adalah "variabel" yang dimulai dari 1 pada iterasi pertama dan berlanjut dari angka pada iterasi sebelumnya dan loop hingga x.^\2*
memeriksa apakah x adalah kelipatan "variabel".Ini pada dasarnya memiliki ide yang sama dengan jawaban saya untuk Menghitung Phi (bukan Pi) . Hanya ceknya yang berbeda.
Uji regex di RegexStorm .
sumber
Labirin , 33 byte
Cobalah online.
Ini mengimplementasikan pembagian percobaan. Saya akan menambahkan penjelasan lengkap nanti. Ini mungkin tidak optimal, tetapi saya kesulitan menemukan sesuatu yang lebih pendek.
sumber
Perl 6 , 17 byte
pemakaian:
sumber
Javascript (ES6),
605742403937 byteIni mungkin bisa bermain golf lebih baik.
Sunting 1: Saya benar. Menghapus kawat gigi setelah for loop.
Sunting 2: Golf hingga 40 byte dengan terima kasih kepada manatwork dan Martin Büttner .
Sunting 3: Menyimpan byte dengan mendasarkan fungsi pada jawaban C di atas.
Sunting 4: Terima kasih ן nɟuɐɯɹɐ ן oɯ dan Neil , tapi saya tidak bisa membuat eval bekerja.
Sunting 5: Lupa untuk menghapus eval.
Uji
sumber
var
kata kunci. Kiat lainnya dalam Kiat untuk bermain golf di JavaScript dan Kiat untuk bermain golf di ECMAScript 6 .++i
dani++
, pilih yang pertama (ini tidak ada hubungannya dengan golf). Jugan%i<1
harus menyimpan byte.n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
n%++i||++d
?PowerShell, 34 byte
|
!
sehingga pembagi menjadi $ true dan diizinkan melalui; menggunakan alias builtin?
untukWhere-Object
()
dan.Count
berapa banyak item yang melewati filtersumber
Jelly , 2 byte (tidak bersaing (lagi))
Cobalah online!
Saya pikir ini menggunakan fitur yang diimplementasikan setelah jawaban Jelly lainnya. Komentar jika saya salah (saya tidak bisa melihat setiap komit di baris, Anda tahu :))
sumber
Taksi, 2143 byte
Cobalah online!
Tidak Disatukan:
Penjelasan:
sumber
Japt , 3 byte
-m
flag untuk menjalankan semua test case.Cobalah
sumber
Formula Excel,
4228 byteSunting: Saya baru sadar saya tidak perlu menggunakan
INDIRECT
, menghemat 14 byte!Berikut ini harus dimasukkan sebagai rumus array ( Ctrl+ Shift+ Enter):
Di mana N adalah angka untuk diuji.
Contoh:
Penjelasan:
sumber
05AB1E , 2 byte
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Cukup mudah, tetapi ini dia:
sumber
Mathematica, 16 byte
Komposisi fungsi sederhana dari built-in.
sumber
Minkolang 0,13 , 16 byte
Periksa semua kasing di sini.
Penjelasan
sumber