Число является числом де Полиньяка тогда и только тогда, когда оно нечетное и не может быть представлено в виде p + 2 n, где n - неотрицательное целое число, а p - простое целое число.
задача
Напишите некоторый код, который принимает положительное целое число и определяет, является ли оно числом де Полиньяка. Вы можете вывести два разных значения, одно для истинного и одно для ложного. Вы должны стремиться минимизировать количество байтов.
Тестовые случаи
Для положительных случаев вот OEIS
1, 127, 149, 251, 331, 337, 373, 509, 599, 701, 757, 809, 877, 905, 907, 959, 977, 997, 1019, 1087, 1199, 1207, 1211, 1243, 1259, 1271, 1477, 1529, 1541, 1549, 1589, 1597, 1619, 1649, 1657, 1719, 1759, 1777, 1783, 1807, 1829, 1859, 1867, 1927, 1969, 1973, ...
Вот несколько негативных случаев:
22, 57
code-golf
number
number-theory
decision-problem
Мастер пшеницы
источник
источник
Ответы:
Japt ,
91413 байтПроверьте это онлайн! или Найти все целые числа де Полиньяка до 1000 .
Выходы
1
для ложных входов и0
для правдивых.объяснение
источник
false
но это не цифры де Полиньяка.3
исправлен, но сначала нам не приходилось обрабатывать даже случаи. Закрепление.3
не стоило ни одного байта, тогда я увидел исправление для2
- Ой!Желе ,
1110 байтСохранено 1 байт благодаря @Dennis
Попробуйте онлайн!
Как это устроено
источник
Ḷ2*⁸_ÆPS<Ḃ
сохраняет байт. tio.run/##ASQA2/9qZWxsef//4bi2Mirigbhfw4ZQUzzhuIL/…¬;ḂẠ
.S<Ḃ
Это далеко за пределами коробки, хотя, по крайней мере для меня :-)JavaScript (ES6),
56 5453 байтаВозвращает0 или 1 .
Попробуйте онлайн!
Как?
Начнем сp=1 . Мы проверяем, является ли y=n−p составным, и получаем логическое значение соответственно. Следующий тест выполняется с p×2 .
Как толькоp больше n , мы прекращаем рекурсию и возвращаем n .
Результаты всех итераций объединяются в AND и приводят логические значения к0 или 1 .
При условии, что все промежуточные результаты были правдивыми, мы получаем побитовый тест, такой как:
1 & 1 & 1 & n
Это дает1 тогда и только тогда, когда n нечетно, что является последним условием, необходимым для проверки ввода как числа де Полиньяка.
источник
n%2
или похож: PPython 2 ,
605756 байтПопробуйте онлайн!
источник
&n&
. Число 5 было бы ложноотрицательным, если бы оно было числом де Полиньяка, потому что 1 + 4 = 5, но это не проблема, потому что 2 + 3 = 5 в любом случае.Желе , 10 байт
Альтернативное 10-байтовое представление Jelly к уже опубликованному.
Монадическая ссылка, возвращающая 1 для чисел де Полиньяка и 0 в противном случае.
Попробуйте онлайн! или посмотрите те под 1000 .
Как?
источник
05AB1E ,
98 байт-1 байт благодаря Emigna
Выходы
0
для достоверных входов и1
ложных входов.Попробуйте онлайн!
источник
1å
может бытьZ
.Python 2 , 99 байт
Попробуйте онлайн!
-4 байта благодаря Лаки Нун
-2 байта благодаря Wondercricket
+8 байт, чтобы исправить ошибку
-1 байт благодаря мистеру Xcoder
-3 байта благодаря Einkorn Enchanter
+12 байт, чтобы исправить ошибку
источник
Регулярное выражение (ECMAScript), 97 байт
Эта проблема представляла интересный случай для решения проблемы отсутствия неатомарного взгляда. И пока единственный раз, когда у меня была веская причина поставить обе версии теста степени 2,
((x+)(?=\2$))*x$
и(?!(x(xx)+)\1*$)
в одном и том же регулярном выражении, и единственный раз, когда мне нужно было защитить основной тест от сопоставления. 1, как(?!(xx+)\1+$)xx
при использовании в большем регулярном выражении.^(?!(xx)*$|(x+)((?!(xx+)\4+$).*(?=\2$)((x+)(?=\6$))*x$|(?!(x(xx)+)\7*$).*(?=\2$)(?!(xx+)\9+$)xx))
Попробуйте онлайн!
Regex (ECMAScript + молекулярный взгляд),
5352 байта^(?!(xx)*$|(?*xx+(((x+)(?=\4$))*x$))\2(?!(xx+)\5+$))
Эта версия не только намного чище, но и намного быстрее, потому что вместо того, чтобы циклически обходить все возможные способы, которыми N является суммой двух чисел, она может просто циклически вычитать каждую степень 2 из N и проверять разницу на простое число. ,
Молекулярный взгляд может быть легко преобразован в взгляд с переменной длиной:
Regex (.NET или ECMAScript 2018),
5554 байта^(?!(xx)*$|xx+(((x+)(?=\4$))*x$)(?<=(?<!^\5+(x+x))\2))
Попробуйте онлайн! (.NET)
Попробуйте онлайн! (ECMAScript 2018)
источник
^(?!(x+)((?!(xx+)\3+$)x*(?!(x(xx)+)\4*$)|x(?!(x(xx)+)\6*$)x*(?!(xx+)\8+$)x)?\1$)
без особых проблем. Затем, с некоторой тщательной продуманностью, можно заняться гольфом дальше^(?!(x+)((x?)(?!(x(x\3)+)\4+$)x*(?!(x(xx)+|\3\3+)\6+$)\3)?\1$)
. Короче еще возможно(x(xx)+|\3\3+)
->(x\3?(xx)+)
Mathematica, 41 байт
источник
PrimeQ[#-2^Range[0,Log2@#]]
на,PrimeQ[#-2^Range[0,#]]
а затем наPrimeQ[#-2^Range@#/2]
.PHP , 75 байт
печатает 1 для правды и 0 для фальши
Попробуйте онлайн!
Попробуйте онлайн! Полиньяк целых чисел до 10000
источник
Par / GP , 34 байта
Попробуйте онлайн!
источник
Брахилог ,
1513 байтПопробуйте онлайн!
Выходные числа де Полиньяк до 1000.
Возвращает
false.
для чисел де Полиньяк и вtrue.
противном случае.Основано на удаленном ответе @ LeakyNun, с несколькими исправлениями ошибок (опубликовано с их разрешения).
(-2 байта, используя метод @Jonathan Allan, чтобы проверить, является ли число степенью двойки.)
Данный номер не является номером де Полиньяка, если:
источник
=h2
будет на 1 байт короче, но это не работает3
ни для одного.Желе , 13 байт
Попробуйте онлайн!
Выходы
1
для ложных и0
истинных.источник
Ḷ2*ạfÆRṆ
затем проверьте на четностьḶ2*ạfÆRṆo‘Ḃ
возвращается1
для обоих127
и22
; это не правильно. Если это не то, что вы предложили.0
за 149.ạ
чтобы_@
исправить это.Perl 6 , 55 байт
Попробуйте онлайн!
(1, 2, 4 ... * > $_)
является последовательностью степеней двойки до входного аргумента (Perl выводит геометрический ряд из предоставленных элементов).grep &is-prime, ^$_
список простых чисел до входного аргумента.[X+]
оценивает сумму всех элементов перекрестного произведения двух рядов.Я мог бы обойтись без
so
на два байта меньше, но тогда он возвращает два разных ложных значения (0
иFalse
).источник
Аксиома, 86 байт
тест и результаты
источник
Haskell,
104102 байтаобъяснение
(+)
примененной к 2 ^ частичной функции, которая применяется к списку [0..input]ОБНОВЛЕНИЕ: кричите Einkorn Enchanter для игры в гольф два байта!
источник
p x=[x]==[i|i<-[2..x],x`mod`i<1]
это более короткий тест на простотуfilter p[1..k]
вместоfilter(p)[1..k]
Common Lisp, 134 байта
Возврат,
NIL
если аргумент является числом Полиньяка, вT
противном случае.Попробуйте онлайн!
Ungolfed:
источник
APL (Dyalog Extended) , 12 байт
Попробуйте онлайн!
Анонимный префикс неявной функции. Возвращает 1 для правдивых, 0 для ложных.
В значительной степени основано на ответе Japt ETHProductions .
Спасибо @ Adám за помощь в игре в гольф, мой оригинальный ответ, и за создание Dyalog Extended в этом отношении.
Как:
источник
Python 2 , 98 байт
Попробуйте онлайн!
источник
Pyth , 14 байт
Попытайся!
источник
Юлия 0,4 , 31 байт
Попробуйте онлайн!
источник
APL (NARS) 80 символов, 160 байтов
Функция 0π - это функция, которая возвращает свой аргумент, простое или нет. Для меня эта функция не должна быть рекурсивной, поэтому она немного длиннее ... Тест:
для входа <= 0 или входа> = 9E9 возвращается ¯1 (ошибка)
источник
C # (интерактивный компилятор Visual C #) , 107 байт
Попробуйте онлайн!
Не самый эффективный код, но, похоже, работает. Мое оригинальное решение отфильтровывало простые числа перед проверкой их в формуле, и оно работало намного лучше. Текущая версия на 11 байт короче.
источник