Математика, 70 69 байт
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Безіменна функція, яка приймає і повертає ціле число. Він кидає помилку при введенні, 1але все ж обчислює правильний результат.
Пояснення
Як завжди, через увесь синтаксичний цукор порядок читання трохи смішний. &На право визначає неназвані функції і її аргументи посилаються #, #2, #3і т.д.
...FactorInteger@#...
Почнемо з факторного введення. Це дає список пар, {prime, exponent}наприклад, введення 12дає {{2, 2}, {3, 1}}. Дещо незручно, 1дає {{1, 1}}.
(...&)@@@...
Це застосовує функцію зліва до списку цілих чисел на рівні 1, тобто функція викликається для кожної пари, передаючи простим і експонентом окремі аргументи, а потім повертає список результатів. (Це схоже на відображення функції над списком, але отримання двох окремих аргументів зручніше, ніж отримання пари.)
...PrimePi@#...
Ми обчислюємо кількість праймерів до і включаючи (основний) вхід за допомогою вбудованого PrimePi. Це дає нам індекс простих.
...BitXor[...+1,1]-1...
Результат збільшується, XOR'ед 1і знову зменшується. Це свопи 1 <-> 2, 3 <-> 4, 5 <-> 6, ..., тобто всі індекси на основі 1. Зверніть увагу , що вхід 1буде вихід 0за PrimePiякий потім перетворюється в -1в цьому процесі. Ми з цим розберемося пізніше.
...Prime[...]^#2...
Тепер ми отримуємо n- е просте (де n - результат попереднього обчислення), яке є правильно заміненим простим, і піднімаємо його до сили вихідного простого при факторизації вхідних даних. У цей момент Prime[-1]буде видано помилку, але повернеться не оціненою. Потужність у цьому випадку 1така, що весь процес поки що дає {Prime[-1]}вхід 1і список правильних простих повноважень для всіх інших входів.
1##&@@...
Далі ми просто множимо всі прем'єр-сили. 1##&- це стандартний трюк для гольфу для Timesфункції. Дивіться цю пораду (розділ «Послідовність аргументів»), як це працює.
Нарешті, нам потрібно подбати про вклад, 1до якого призвело все вищезазначене Prime[-1]. Ми можемо це легко виправити за допомогою простого правила заміни. Пам'ятайте, що f@xце коротко f[x]. Ми просто хочемо співставити будь-яке вираження цієї форми (оскільки всі інші результати будуть цілими числами, тобто атомними виразами), і замінимо його на 1:
.../._@_->1
Ось, /.коротше ReplaceAll, _@_- це шаблон для будь-якої форми f[x](тобто будь-якого складового виразу з однією дитиною) і ->1говорить "замінити на 1".