Некоторое время назад я взглянул на основную факторизацию 27000:
27000 = 2 3 × 3 3 × 5 3
В этом есть две особые вещи:
- последовательное простое число : простые числа последовательные: 2 - это первое простое число, 3 - второе простое число, 5 - третье простое число.
- показатель постоянной : показатель степени одинаков для каждого простого числа (всегда 3)
Математически выражено:
Целое число х является последовательно-простое число / с постоянным показателем , если существуют строго положительные целые числа п , к , м такой , что х = р п м × р п + 1 м × ... × р п + к м , где р j - это j-е простое число
Ваша задача - проверить, удовлетворяет ли положительное целое число этим условиям.
Входные данные:
Целое положительное число> 1 в любой разумной форме.
Выход:
Одно из двух значений, по крайней мере, одно из которых должно быть постоянным, указывая, является ли входное число последовательным простым / постоянным показателем степени.
Краевые случаи:
- простые числа являются truthy, так как разложение для простого р является р -
- другие числа, которые можно записать как p m, где p - простое число, также верны.
Правила:
- Применяются стандартные лазейки.
- Не беспокойтесь о целочисленном переполнении, но числа до 255 должны работать.
- Самый короткий код в байтах побеждает.
Тестовые случаи:
Truthy:
2
3
4
5
6
7
8
9
11
13
15
27000
456533
Falsy:
10
12
14
72
10000000
Вот скрипт Python, генерирующий несколько тестовых случаев.
x = Pn^m
части. Я предполагаю, что вы имели в виду, что Pn - это n-е простое числоОтветы:
05AB1E , 4 байта
Попробуйте онлайн!
объяснение
источник
ÎÓKË
это все, о чем я могу думать, кроме этого, милый ... Я думал,ß
но это противоположно тому, что я думал.Regex (ECMAScript),
276205201193189 байтСравнение кратностей (показателей степени) различных простых факторов представляет собой интересную проблему для решения с помощью регулярного выражения ECMAScript - отсутствие обратных ссылок, сохраняющихся в течение итераций цикла, затрудняет подсчет чего-либо. Даже если подсчет рассматриваемой числовой черты возможен, часто более косвенный подход делает гольф лучше.
Как и в других моих статьях по регулярному выражению в ECMA, я дам предупреждение: я настоятельно рекомендую научиться решать унарные математические задачи в регулярном выражении в ECMAScript. Для меня это было увлекательное путешествие, и я не хочу испортить его тем, кто потенциально может попробовать его сами, особенно тем, кто интересуется теорией чисел. См. Этот более ранний пост для списка последовательно рекомендованных спойлером рекомендованных проблем, чтобы решить одну за другой.
Так что не читайте дальше, если вы не хотите, чтобы какая-то продвинутая магия унарных регулярных выражений была испорчена для вас . Если вы действительно хотите сами разобраться в этой магии, я настоятельно рекомендую начать с решения некоторых проблем в регулярном выражении ECMAScript, как описано в этом посте, связанном выше.
Основная полезная нагрузка от ранее разработанного мной регулярного выражения оказалась очень подходящей для этой задачи. Это регулярное выражение, которое находит простые числа наибольшей кратности . Мое первое решение для этого было очень долгим, и позже я постепенно продвинулся вперед, сначала переписав его, чтобы использовать молекулярный взгляд , а затем перенес его обратно на простой ECMAScript, используя продвинутую технику, чтобы обойти отсутствие молекулярного взгляда , и впоследствии игра в гольф будет намного меньше, чем оригинальное простое решение ECMAScript.
Часть из этого регулярного выражения, которая относится к этой проблеме, является первым шагом, который находит Q, наименьший фактор из N, который разделяет все его основные факторы. Как только мы получим это число, все, что нам нужно сделать, чтобы показать, что N - «число с постоянной экспонентой», - это делить N на Q, пока мы не сможем больше; если результат равен 1, все простые числа имеют одинаковую кратность.
Отправив ответ, используя мой ранее разработанный алгоритм поиска Q, я понял, что его можно рассчитать совершенно по-другому: найти наибольший множитель без квадратов для N (используя тот же алгоритм, что и для регулярного выражения моего числа Кармайкла ). Как выясняется, это вовсе не представляет никаких трудностей * с точки зрения обхода отсутствия молекулярного предвзятого взгляда и заднего вида переменной длины (нет необходимости использовать продвинутый ранее метод) и на 64 байта короче! Кроме того, это исключает сложность обработки N без квадратов и простых N как различных особых случаев, исключая еще 7 байтов из этого решения.
(По-прежнему существуют другие проблемы, которые требуют использования продвинутой техники, ранее использовавшейся здесь, для упрощения вычисления Q, но в настоящее время ни одна из них не представлена в моих сообщениях PPCG.)
Я поставил тест множественности перед тестом последовательных простых чисел, потому что последний намного медленнее; размещение тестов, которые могут быстрее провалиться, сначала ускоряет регулярные выражения для равномерно распределенного ввода. Гольф также лучше поставить первым, потому что он использует больше обратных ссылок (что стоило бы больше, если бы они были двузначными).
Мне удалось отбросить 4 байта из этого регулярного выражения (193 → 189), используя трюк, найденный Грими, который может дополнительно сократить деление в случае, когда коэффициент гарантированно будет больше или равен делителю.
^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))
Попробуйте онлайн!
* Это все еще чище с молекулярным взглядом, без специального случая для N, являющегося свободным от квадратов. Это дает 6 байтов, в результате получается решение
195187183 байта :^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))
Здесь он перенесен в вид сзади переменной длины:
Regex (ECMAScript 2018),
198195194186182 байта^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))
Попробуйте онлайн!
источник
.*$\2
на\2^
^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
Желе ,
1365 байтПопробуйте онлайн!
Все еще переиграл ... (спасибо Эрику за -1 байт)
объяснение
источник
œl
->t
. Нет никаких причин для того, чтобы конечные нули присутствовали в выходных данных ÆE.JavaScript (ES6), 87 байт
Возвращает 0 для истинности или ненулевое целое для ложных.
Попробуйте онлайн!
комментарии
источник
j||i
наi
. Теперь он дает много ложных срабатываний.CJam ,
3029 байтПопробуйте онлайн!
Мой первый ответ после почти 2 (!) - годичного перерыва, так что, вероятно, можно больше играть в гольф. Это блок, который принимает входные данные как целое число (может также отображаться для массивов целых чисел).
объяснение
источник
Stax ,
56 байтЗапустите и отладьте его
Распакованный, размазанный и прокомментированный, это выглядит так.
Изменить:
это не работает наЭто работает сейчас.512
. Я подумаю над этим и, надеюсь, исправлю позже.источник
Stax , 9 байт
1 правдиво, 0 фальшиво
Запустите и отладьте его
объяснение
Вероятно, можно больше играть в гольф, но это покрывает случаи, которые я пропустил в последнем решении.
источник
MATL ,
12 1110 байтПопробуйте это в MATL Online!
Спасибо Луису Мендо за часть удаления ведущих нулей. Он также указал, что обмен истинными значениями разрешен, поэтому он возвращает 0 для чисел, которые удовлетворяют требованиям вызова, и любое положительное значение в противном случае.
Grosso Modo, это генерирует показатели последовательной простой факторизации, удаляет начальные нули и вычисляет стандартное отклонение.
источник
0iYFhdz
работает для 7 байтов: добавьте 0 к показателям последовательной факторизации, последовательные различия, количество ненулевых. Результат -1
если вход удовлетворяет требованиюJava 10,
223191178176168 байтВозвращается
1
как правдивый и>=2
как фальси.Попробуйте онлайн.
Объяснение:
Некоторые примеры входов:
n=15
:1
для первого простого 2 (потому что 15 не делится на 2).1
к,0
как только мы находимся наn
вершине 3. Поскольку 15 делится на 3, становится 5 (15/3 1 ), и Сет становится[] → [1]
.n
становится 1 (5/5 1 ), а множество остается тем же ([1] → [1]
).n=1
мы остановим внешний цикл. Set ([1]
) содержит только один элемент,1
из двух смежных простых чисел 3 и 5, поэтому мы возвращаем true.n=14
:1
к0
для первого простого 2 (потому что 14 делится на 2).n
становится 7 (14/2 1 ), и Набор становится[] → [1]
.n
остается тем же самым, и множество становится[1] → [1,0]
.n
остается тем же самым, и множество остается тем же самым ([1,0] → [1,0]
).n
становится 1 (7/7 1 ), и множество остается тем же ([1,0] → [1,0]
).n=1
мы остановим внешний цикл. Set ([1,0]
) содержит два элемента,1
из несмежных простых чисел 2 и 7, и0
из простых чисел 3 и 5, поэтому мы возвращаем false.n=72
:1
к0
для первого простого 2, потому что 72 делится на 2 (несколько раз). Такn
становится 9 (72/2 3 ), и Набор становится[] → [3]
.n
становится 1 (9/3 2 ), и множество становится[3] → [3,2]
.n=1
мы остановим внешний цикл. Set ([3,2]
) содержит два элемента,3
из простого 2 и2
из простого 3, поэтому мы возвращаем false.источник
<2
и вернуть int (укажите, что вы возвращаете 1 для истинного).1
правдиво и /2
или выше - ложь. Спасибо.J , 16 байт
Большое спасибо FrownyFrog за -8 байт!
Попробуйте онлайн!
Мое старое решение:
J , 24 байта
Попробуйте онлайн!
Объяснение:
_&q:
простые показатели{.@I.}.]
удаляет начальные нули, находя первый ненулевой элемент:1=[:#@~.
проверяет, равны ли все остальные числа:источник
Шелуха , 11 байт
Попробуйте онлайн!
Выводит 0, если не число последовательных простых / постоянных экспонент.
источник
MATL , 7 байт
Результат -
1
если ввод удовлетворяет требованию.Попробуйте онлайн! Или проверьте все тестовые случаи
объяснение
источник
Октава , 67 байт
Попробуйте онлайн!
Я считаю, что это единственное решение, которое использует гистограмму.
Объяснение:
Это создает гистограмму, где подсчитываемая переменная является факторами входных данных и помещается в ячейки
primes(x)
, которые на все простые числа меньше входных. Затем мы находим расположение основных факторов, берем разницу между каждым из индексов и вычитаем один. Если есть какие-либо элементы, которые не равны нулю (т. Е. Разница индексов простых чисел не равна 1), то это приведет к ложному значению, в противном случае оно вернет истинное значение.Затем мы проверяем, что все ненулевые элементы в гистограмме равны максимальному элементу. Если есть значения, которые не равны, то это приведет к ложному значению, в противном случае он вернет истинное значение.
Если оба эти блока являются правдивыми, то наш вход представляет собой последовательное число экспонент простого числа!
источник
APL (Dyalog Extended) , 28 байт
Попробуйте онлайн!
Как:
источник
Wolfram Language (Mathematica) , 65 байт
Попробуйте онлайн!
источник
Par / GP , 63 байта
Попробуйте онлайн!
источник
J , 14 байт
1 в выходных данных указывает последовательный показатель степени.
Попробуйте онлайн!
источник
Чисто , 127 байт
Попробуйте онлайн!
Определяет функцию,
? :: Int -> Bool
используемую$ :: Int -> [Int]
для факторизации и@ :: Int -> Bool
проверки простоты.источник
APL (NARS) 41 символ, 82 байта
{π⍵} - функция факторизации аргумента ⍵ в списке простых факторов (повторите, если одно простое число появляется больше времени);
{1π⍵} - функция, следующая за простым числом (обратите внимание, что в этом случае ее аргумент - не скаляр, а один массив целых чисел). тест:
источник