Математика, 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
".