(В продолжение моего вопроса об обмене битами со своими соседями .)
задача
Если дано положительное целое число x = (2 a · 3 b ) · (5 c · 7 d ) · (11 e · 13 f ) ·… , выведите целое число, полученное путем замены показателей степени в этой факторизации для каждой последующей пары простых чисел, у = (2 б · 3 а ) · (5 д · 7 с ) · (11 ф · 13 э ) ·…
A061898 в ОЕИС . Это код-гольф , поэтому выигрывает самая короткая (в байтах) программа!
Контрольные примеры
1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871
Ответы:
Желе , 10 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
Желе,
171611 байт5 байтов благодаря Денису.
Попробуйте онлайн!
объяснение
Предыдущая 16-байтовая версия
Попробуйте онлайн!
объяснение
Предыдущая 17-байтовая версия:
Попробуйте онлайн!
объяснение
источник
Mathematica,
7069 байтБезымянная функция, которая принимает и возвращает целое число. Выдает ошибку при вводе,
1
но все равно вычисляет правильный результат.объяснение
Как обычно, из-за всего синтаксического сахара, порядок чтения немного забавен.
&
На право определяет неназванные функции и ее аргументы ссылаются#
,#2
,#3
и т.д.Мы начнем с факторинга ввода. Это дает список пар,
{prime, exponent}
например, ввод12
дает{{2, 2}, {3, 1}}
. Несколько неудобно,1
дает{{1, 1}}
.Это применяет функцию слева к списку целых чисел на уровне 1, то есть функция вызывается для каждой пары, передавая простое и экспоненту в качестве отдельных аргументов, а затем возвращает список результатов. (Это похоже на отображение функции по списку, но получение двух отдельных аргументов удобнее, чем получение пары.)
Мы вычисляем количество простых чисел вплоть до (простого) ввода с использованием встроенного
PrimePi
. Это дает нам индекс простого числа.Результат увеличивается, XOR
1
и снова уменьшается. Это перестановки1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, т.е. все индексы, основанные на 1. Обратите внимание, что входные данные1
дадут,0
дляPrimePi
которых затем отображается-1
в этом процессе. Мы разберемся с этим позже.Теперь мы получим n- е простое число (где n - результат предыдущего вычисления), которое является правильно переставленным простым, и возведем его в степень исходного простого числа при факторизации входных данных. В этот момент
Prime[-1]
выдаст ошибку, но вернет себя без оценки. Мощность в этом случае такова,1
что весь процесс до сих пор дает данные{Prime[-1]}
для ввода1
и список правильных простых степеней для всех других входов.Далее мы просто умножаем все основные силы.
1##&
стандартная игра в гольф для этойTimes
функции. Смотрите этот совет (раздел «Последовательности аргументов»), чтобы узнать, как это работает.Наконец, нам нужно позаботиться о том,
1
что привело ко всему вышеперечисленномуPrime[-1]
. Мы можем легко исправить это с помощью простого правила замены. Помните, чтоf@x
это сокращение отf[x]
. Мы просто хотим сопоставить любое выражение этой формы (поскольку все остальные результаты будут целыми числами, то есть атомарными выражениями) и заменить его на1
:Здесь,
/.
сокращенноReplaceAll
,_@_
это шаблон для чего-либо в формеf[x]
(то есть для любого составного выражения с одним дочерним элементом ), и он->1
говорит «заменить на1
».источник
Python 2,
149139 байт10 байтов благодаря Денису.
источник
input()
работает в Python 2?eval(input())
в Python 3.MATL , 17 байт
Попробуйте онлайн!
объяснение
Это не использует экспоненты напрямую. Вместо этого он меняет каждый (возможно повторяющийся) простой фактор на следующий или предыдущий простой.
источник
Юлия, 64 байта
Попробуйте онлайн! Последний тест требует слишком много памяти для TIO, но я проверил это локально.
Как это устроено
Чтобы избежать ввода в специальном регистре 1 - произведение пустого словаря не определено - мы умножаем вход n на 2 и делим конечный результат на его пару 3 .
factor(2n)
дает в качестве словаря все положительные показатели простых множителей 2n . При переборе словаря мы получим пары ключ-значение / простое-экспонента. Функцияprod
будет принимать эти пары, применять к ним анонимную функциюt->...
и возвращать произведение результатов.Для каждой пары т = (р, е) ,
endof(~t[1])
илиendof(primes(t[1]))
возврата к , число простых чисел , которые меньше или равны р , а это означает , что р является к е простое число.+1$1-1
увеличит k , XOR k + 1 с 1 и уменьшит результат. Если k нечетно, k + 1 является четным, поэтому XOR увеличивается, и окончательный результат равен k + 1 . Если k четное, k + 1 нечетное, поэтому XOR уменьшается, и в результате получается k - 1 .Наконец, мы вычисляем все простые числа, меньшие или равные 3n, с помощью
(~3n)
илиprimes(3n)
(наибольший простой множитель 2n меньше или равен n, если n> 2 , и всегда есть простое число между n и 2n ), выбираем одно с индексом k + 1 или к - 1 , и поднять его на е - й мощности с^t[2]
.источник
Python 2,
1121091089594 байтаПроверьте это на Ideone .
Как это устроено
Когда вызывается f , сначала вычисляется 1 / n . Если результат не равен нулю, n равно 1 и f возвращает 1 .
Если n> 1 , происходит следующее.
Если n не делится на p [1] (изначально 2 ),
n%p[1]
то получится истинное значение ивызывается.
Эта ветвь генерирует простое число, пока предпоследняя не разделит п равномерно . Для этого он использует следующее следствие из теоремы Вильсона .
Во всех случаях m равен факториалу k - 1 (первоначально 6 = 3! И 4. В каждой итерации результат перед
m*m%k*[k]
добавлением к списку простых чисел p добавляется . По следствиюm*m%k
равен 1, если k простое и 0 если нет, то это добавляет k к p тогда и только тогда, когда k - простое число.Если n делится на p [1] ,
n%p[1]
получим 0 иисполняется.
Если p содержит четное количество простых чисел, то
len(p)*2%4
получится 0, а первый множитель примет значение p [0] . Если p содержит нечетное количество простых чисел,len(p)*2%4
получим 2, а первый множитель примет значение p [2] .В любом случае это простое число, показатели которого должны поменяться местами с показателем p [1] , поэтому мы делим n на p [1] (уменьшая показатель степени на 1 ) и умножаем результат
f(n/p[1])
на соответствующее простое число (увеличивая показатель степени на 1 ).Обратите внимание, что
f(n/p[1])
сбрасывает k , m и p к значениям по умолчанию.f(n/p[1],k,m,p)
повысит эффективность за счет шести дополнительных байтов.источник
Pyth, 25 байт
Тестирование.
объяснение
источник
Юлия,
155131127 байтЭто анонимная функция, которая принимает целое число и возвращает целое число. Чтобы вызвать его, присвойте его переменной. Требуется версия Julia <0.5, потому что основная функциональность была удалена из Base в 0.5.
Ungolfed:
Попробуйте онлайн! (Включает все тестовые случаи)
источник
На самом деле 15 байтов
Попробуйте онлайн!
Объяснение:
источник
05AB1E, 22 байта
Разъяснения
Попробуйте онлайн
источник
J, 21 байт
Получает простые показатели n как простые степени с нулями. Затем разбейте их на неперекрывающиеся подсписки размером 2, заполняя их дополнительным нулем. Затем переверните каждый подсписок и сведите их в список. Наконец, преобразовать обратно из простых показателей в число.
использование
объяснение
источник