Mathematica, 70 69 byte
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Fungsi tanpa nama yang mengambil dan mengembalikan integer. Itu melempar kesalahan pada input 1
tetapi masih menghitung hasil yang benar.
Penjelasan
Seperti biasa, karena semua gula sintaksis, urutan bacaannya agak lucu. Sebuah &
pada mendefinisikan kanan fungsi yang tidak disebutkan namanya dan argumen yang disebut dengan #
, #2
, #3
, dll
...FactorInteger@#...
Kami mulai dengan memfaktorkan input. Ini memberikan daftar pasangan {prime, exponent}
mis. Input 12
memberi {{2, 2}, {3, 1}}
. Agak nyaman, 1
memberi {{1, 1}}
.
(...&)@@@...
Ini menerapkan fungsi di sebelah kiri ke daftar bilangan bulat di level 1, yaitu fungsi dipanggil untuk setiap pasangan, melewati bilangan prima dan eksponen sebagai argumen yang terpisah, dan kemudian mengembalikan daftar hasil. (Ini mirip dengan memetakan fungsi di atas daftar, tetapi menerima dua argumen terpisah lebih nyaman daripada menerima pasangan.)
...PrimePi@#...
Kami menghitung jumlah bilangan prima hingga dan termasuk input (prima) menggunakan built-in PrimePi
. Ini memberi kita indeks prima.
...BitXor[...+1,1]-1...
Hasilnya bertambah, XOR'ed dengan 1
dan dikurangi lagi. Ini swap 1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, yaitu semua indeks berbasis 1. Perhatikan bahwa masukan 1
akan menghasilkan 0
untuk PrimePi
yang kemudian dipetakan ke -1
dalam proses ini. Kami akan mengatasinya nanti.
...Prime[...]^#2...
Kita sekarang mendapatkan perdana ke- n (di mana n adalah hasil dari perhitungan sebelumnya), yang merupakan perdana yang ditukar dengan benar, dan menaikkannya ke kekuatan prime asli dalam factorisation dari input. Pada titik ini Prime[-1]
akan terjadi kesalahan tetapi akan kembali sendiri tidak dievaluasi. Kekuatan dalam hal ini adalah 1
sehingga seluruh proses sejauh ini menghasilkan {Prime[-1]}
input 1
dan daftar kekuatan utama yang benar untuk semua input lainnya.
1##&@@...
Selanjutnya, kita gandakan semua kekuatan utama. 1##&
adalah trik golf standar untuk Times
fungsinya. Lihat tip ini (bagian "Urutan argumen") untuk cara kerjanya.
Akhirnya, kita perlu berhati-hati terhadap masukan 1
yang menghasilkan semua hal di atas Prime[-1]
. Kami dapat dengan mudah memperbaikinya dengan aturan penggantian yang sederhana. Ingat itu f@x
kependekan dari f[x]
. Kami hanya ingin mencocokkan ekspresi apa pun dari bentuk itu (karena semua hasil lainnya akan berupa bilangan bulat, yaitu ekspresi atomik), dan ganti dengan 1
:
.../._@_->1
Di sini, /.
kependekan dari ReplaceAll
, _@_
adalah pola untuk segala bentuk f[x]
(yaitu setiap ekspresi majemuk dengan anak tunggal) dan ->1
mengatakan "ganti dengan 1
".