Terinspirasi oleh akar digital, akar faktorial utama dari angka adalah angka yang muncul ketika Anda mengambil faktor prima dari suatu angka, menambahkannya bersama-sama, dan mengulangi proses pada angka yang dihasilkan, terus sampai Anda berakhir dengan nomor prima ( yang memiliki dirinya sendiri sebagai satu-satunya faktor utama, dan dengan demikian merupakan akar faktorial pribadinya sendiri). Akar faktorial utama dari 4 adalah 4, karena 2 * 2 = 2 + 2, dan ini adalah satu-satunya akar faktorial prime non-prima dari bilangan bulat yang lebih besar dari 1 (yang merupakan kasus khusus lainnya, karena tidak memiliki faktor prima). Urutan OEIS yang dibentuk oleh akar faktorial prima adalah A029908 .
Sebagai contoh, akar faktorial utama dari 24 adalah:
24=2*2*2*3
2+2+2+3=9=3*3
3+3=6=2*3
2+3=5, and the only prime factor of 5 is 5. Therefore, the prime factoral root of 24 is 5.
Tugas Anda:
Tulis program atau fungsi yang menemukan akar faktorial utama dari integer input.
Memasukkan:
Bilangan bulat, masukan melalui metode apa pun yang masuk akal, antara 2 dan bilangan bulat terbesar yang didukung bahasa Anda (inklusif). Khusus memilih bahasa yang memiliki ukuran bilangan bulat maksimum rendah yang tidak masuk akal tidak diizinkan (dan juga melanggar celah standar ini )
Keluaran:
Integer, akar faktorial utama dari input.
Kasus uji:
4 -> 4
24 -> 5
11 -> 11
250 -> 17
Mencetak:
Ini adalah kode-golf , skor terendah dalam byte menang!
4
dalam kasus uji, karena ini merupakan pengecualian dan mudah untuk melupakannya saat menguji jawaban?Jawaban:
05AB1E , 3 byte
Cobalah online!
Penjelasan:
sumber
4
.Haskell , 61 byte
Cobalah online!
Penjelasan
until=<<((==)=<<)
mengambil fungsif
dan menerapkannya pada inputx
hingga titik perbaikan tercapai, yaituf x
samax
.primeFactors
mengembalikan daftar faktor prima dari angka,sum
menghasilkan jumlah dari daftar angka.Tapi tunggu, mengapa
until=<<((==)=<<)
pekerjaan itu dan terlihat sangat aneh?Jika kita mengasumsikan
f=sum.primeFactors
, definisi yang lebih alami adalahuntil(\x->f x==x)f
, karenauntil
mengambil predikat (fungsi yang mengembalikan boolean), fungsi yang memiliki input dan tipe pengembalian yang sama (misalnyaInt -> Int
) dan nilai dari tipe ini, dan kemudian menerapkan fungsi tersebut ke nilai sampai predikat terpenuhi.until(\x->f x==x)f
sama denganuntil(\x->(==)(f x)x)f
, dan seperti yang berlaku itug (h x) x
sama dengan(g=<<h)x
, kita dapatkanuntil(\x->((==)=<<f)x)f
. Setelah konversi Eta , ini menjadiuntil((==)=<<f)f
. Tetapi jika kita sekarang memperlakukan(==)=<<
sebagai fungsi yang diterapkanf
, kita dapat melihat bahwauntil(((==)=<<)f)f
itu lagi bentukg (h x) x
, dengang=until
,h=((==)=<<)
danx=f
, sehingga dapat ditulis ulang(until=<<((==)=<<))f
. Menggunakan$
operator untuk menghilangkan tanda kurung luar dan menggantikannyaf
dengansum.primeFactors
menghasilkan solusi dari atas.sumber
=<<((==)=<<)$
Whaaaaaat.Sekam , 4 byte
Cobalah online!
Penjelasan:
sumber
Pyth , 3 byte
Coba di sini.
Penjelasan:
sumber
The trailing GQ is implicit
Python 2 , 84 byte
Cobalah online!
sumber
f=lambda n,d=2:n>1and(n%d and f(n,d+1)or d+f(n/d))
kerjanya? Saya tidak pernah memprogram dengan Python (terutama Java dan C #), jadi saya tidak yakin apa hasil dari fungsi ini. Apakah fungsi ini memodifikasi inputn
dan mengembalikannya setelahnya, atau apakah mirip dengan boolean di manan>1and(n%d and f(n,d+1)or d+f(n/d))
0 atau 1, atau 0 ataun
, atau yang lainnya? Saya mencoba memvisualisasikan bagaimana port ini akan terlihat seperti di Java / C #, tapi saya tidak bisa karena saya tidak benar-benar mengerti lambda Python seperti ini secara umum.n>1 ? (n%d!=0 ? f(n, d+1) : d+f(n/d)) : n>1
. Secara umumx and y
setara denganx ? y : x
.x and y or z
setara denganx ? y : z
dalam banyak kasus.f=(n,d=2)->n>1?n%d>0?f(n,d+1):d+f(n/d):0
.x and y
menjadix ? y : x
dari JavaScript juga. Terima kasih!Java 8,
175144142141 byte-1 byte berkat @Nevay .
Tidak seperti byte tunggal dalam beberapa bahasa golf, Java sangat cocok untuk pemeriksaan prima, faktor prima, jumlah digit, dan semacamnya, jadi saya kira kurang dari 200 tidak terlalu buruk.
Kemungkinan besar masih bisa bermain golf dengan menggabungkan loop
dan tidak menggunakan metode rekursif terpisah untuk jumlah digit.Penjelasan:
Coba di sini.
sumber
i,t=n,x
sepertinya itu milik Python, hahaint
(tidak seperti Python). ;)i++<n
bukan++i<=n
.Jelly , 5 byte
Penjelasan:
Cobalah online!
sumber
Retina , 30 byte
Input dan output di unary .
Cobalah online! (Melakukan konversi desimal / unary untuk kenyamanan.)
Penjelasan
The
{
menginstruksikan Retina untuk menjalankan seluruh program dalam satu lingkaran sampai lulus penuh gagal untuk memodifikasi string, yaitu sampai titik tetap tercapai. Akibatnya, program itu sendiri menghitung satu langkah menjumlahkan faktor utama dari nilai saat ini.Tahap ini sendiri menghitung faktor utama dari input. The
+
mirip dengan{
tetapi loop hanya tahap ini sampai berhenti mengubah string. Regex mencoba mencocokkan run terakhir1
dengan berulang kali mencocokkan substring yang sama (yaitu faktor). Cara ini dilakukan agak berbelit-belit karena referensi ke depan\1
. Pada iterasi pertama, grup1
belum menangkap apa pun, jadi\1
gagal tanpa syarat. Sebagai gantinya, kami harus mencocokkan\b11+?\B
yang merupakan substring sekecil mungkin yang dimulai pada awal jalankan, berisi setidaknya dua1
s dan tidak mencakup keseluruhan proses. Iterasi berikutnya tidak akan dapat menggunakan alternatif ini lagi, karena\b
. Jadi pada semua iterasi lebih lanjut, kami cocok\1
, yaitu substring yang sama berulang-ulang. Proses ini harus mengenai ujung string persis ($
) untuk memastikan kami telah menangkap dan pembagi yang sebenarnya. Keuntungan menggunakan pendekatan yang agak rumit ini adalah bahwa grup1
akan digunakan tepat n / d d . kali, yaitu apa yang tersisa setelah membagi pembagiKami mengganti kecocokan ini dengan d (
$1
), pemisah;
dan n / d ($#1$*
, yang menyisipkan$#1
salinan1
, di mana$#1
jumlah tangkapan yang dibuat oleh kelompok1
).Proses ini berhenti setelah menjalankan terakhir dalam string itu sendiri adalah yang utama, karena kemudian regex tidak lagi cocok.
Yang perlu kita lakukan untuk menjumlahkan bilangan prima adalah menghapus semua pemisah.
sumber
Ohm v2 , 4 byte
Cobalah online!
Penjelasan:
sumber
Sebenarnya , 7 byte
Cobalah online!
Penjelasan:
sumber
R + pracma , 53 byte
Cobalah online! (r-biola)
R tidak memiliki faktor prima builtin, tapi banyak paket (
pracma
,numbers
, dll) lakukan, jadi saya mengambil yang nyaman singkat.sumber
Jeli , 6 byte
Jawaban ini menggunakan salah satu dari bawaan faktorisasi utama Jelly, dan jawaban cepat untuk
repeat until the results are no longer unique
.Cobalah online!
sumber
1
adalah satu-satunya kasus di mana jumlah langkah yang dibutuhkan sama dengann
(yang baik-baik saja; dengan1
kita hanya perlu menjalankannya sekali), dan sepertinya tidak ada kasus di mana jumlah langkah lebih besar darin
(yaitu sepertinya tidak ada contoh tandingan). Ah well, aku sudah kalah besar: DMATL , 6 byte
Menggunakan gagasan scottinet untuk mengulang lebih dari yang dibutuhkan. Terima kasih juga kepada Shaggy untuk menunjukkan kesalahan, sekarang diperbaiki.
Cobalah online!
Penjelasan
sumber
4
.PowerShell , 124 byte
Cobalah online!
PowerShell tidak memiliki built-in faktorisasi utama, jadi ini menggunakan kode dari jawaban saya pada Prime Factors Buddies (baris teratas) untuk melakukan perhitungan faktorisasi.
Baris kedua adalah daging dari program ini. Kami mengambil masukan dari
$args
ke$x
, makafor
loop sampai$l
adalah-n
ote
qual untuk$x
. (Iterasi pertama,$l
adalah$null
dan$x
merupakan bilangan bulat, jadi kami akan mengulang setidaknya sekali).Di dalam loop, kami mengatur kami
$l = $x
untuk menentukan apakah kami telah mencapai ujung loop atau tidak. Kemudian kita mendapatkan faktor-faktor$x
denganf($x)
, faktor-faktor-join
bersama+
dan|iex
mereka (singkatanInvoke-Expression
dan mirip denganeval
). Itu disimpan kembali$x
. Jadi, kita telah mencapai "akhir" di mana faktorisasi utama yang dirangkum bersama kembali ke dirinya sendiri. Kemudian, kita cukup letakkan$x
di pipeline dan output tersirat.sumber
Mathematica, 35 byte
Cobalah online!
(Matematika tidak mendukung
Tr
. Saya harus menerapkannya secara manual)sumber
1##&
adalah kependekan dariTimes
danFixedPoint
hampir selalu dapat dipersingkat dengan//.
:#//.x_:>Tr[1##&@@@FactorInteger@x]&
Times
, tapi saya belum tahu tentangFixedPoint
triknya.Tr
Matematika beberapa waktu lalu .Ruby , 63 byte
Cobalah online!
Gunakan
-rprime
flag untuk +6 byte untuk menggunakan Prime # prime_division .prime_division
mengembalikan pasangan[prime, exponent]
(misalnya, untuk 24 kita memiliki faktor[2, 2, 2, 3]
sehingga memberi[[2, 3], [3, 1]]
) jadi dalam setiap langkah kita hanya mengalikan anggota pasangan tersebut bersama-sama dan menjumlahkan hasilnya.sumber
Javascript (ES6), 63 byte
Tidak Disatukan:
sumber
Java 8, 101 byte
Port of @ovs menakjubkan jawaban Python 2 .
Penjelasan:
Coba di sini.
sumber