Это премьер Чен?


27

Число является простым числом Чена, если оно удовлетворяет двум условиям:

  • Само по себе
  • Само плюс два - это либо простое, либо полуматальное число.

Простое число - это число, в котором у него ровно два делителя, и эти делители состоят из самого себя и одного.

Полупростое число - это число, которое является произведением двух простых чисел. (Обратите внимание, что 12 = 2 * 2 * 3 не является полупростым, а 25 = 5 * 5).

Ваша задача - определить, является ли число простым числом Чена. Вы должны вывести любое истинное значение для yes и любое ложное значение для no.

На входе будет любое целое число, большее или равное единице. Это может также быть взято как строка, символьный массив или массив или цифры.

Примеры:

101 -> truthy
223 -> falsy
233 -> truthy
1 -> falsy

Это OEIS A109611 .

Отчасти это вдохновлено тем, что я премьер Софи Жермен? который, к сожалению, был закрыт как дубликат, поэтому я публикую несколько связанных задач, которые не являются дубликатами.


Можем ли мы вернуться Trueза правдой 2или Falseложью (противоречивые ложные значения)?
г-н Xcoder

@ Mr.Xcoder Никогда не говорил, что не
сможешь

Для полупростого числа «ровно два простых фактора» учитывают кратность? Является 2 * 2 * 2 * 3 * 3пол-премьер? Как насчет 5 * 5?
Не дерево

@Notatree 5*5полу-простое, 2*2*2*3*3нет. Я сказал ровно два.
Okx

Так значит ли это кратность? (Можно утверждать , что 2*2*2*3*3имеет ровно два простых фактор, а именно 2и 3, и 5*5имеют один простой множитель, а именно 5.) Может быть , вы могли бы изменить , что в этот вопрос?
не дерево

Ответы:




6

ArnoldC , 1339 байт

LISTEN TO ME VERY CAREFULLY q
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE p
GIVE THESE PEOPLE AIR
HEY CHRISTMAS TREE c
YOU SET US UP 0
HEY CHRISTMAS TREE d
YOU SET US UP 0
HEY CHRISTMAS TREE l
YOU SET US UP p
STICK AROUND l
GET TO THE CHOPPER d
HERE IS MY INVITATION p
I LET HIM GO l
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE d
BULLSHIT
GET TO THE CHOPPER c
HERE IS MY INVITATION c
GET UP 1
ENOUGH TALK
YOU HAVE NO RESPECT FOR LOGIC
GET TO THE CHOPPER l
HERE IS MY INVITATION l
GET DOWN 1
ENOUGH TALK
CHILL
I'LL BE BACK c
HASTA LA VISTA, BABY
IT'S SHOWTIME
HEY CHRISTMAS TREE p
YOU SET US UP 0
GET YOUR ASS TO MARS p
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
HEY CHRISTMAS TREE n
YOU SET US UP 0
GET YOUR ASS TO MARS n
DO IT NOW q p
HEY CHRISTMAS TREE g
YOU SET US UP 42
GET TO THE CHOPPER g
HERE IS MY INVITATION n
YOU ARE NOT YOU YOU ARE ME 2
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE g
GET TO THE CHOPPER p
HERE IS MY INVITATION p
GET UP 2
ENOUGH TALK
GET YOUR ASS TO MARS n
DO IT NOW q p
GET TO THE CHOPPER g
HERE IS MY INVITATION 5
LET OFF SOME STEAM BENNET n
ENOUGH TALK
BECAUSE I'M GOING TO SAY PLEASE g
TALK TO THE HAND "t"
BULLSHIT
TALK TO THE HAND "f"
YOU HAVE NO RESPECT FOR LOGIC
BULLSHIT
TALK TO THE HAND "f"
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

Попробуйте онлайн!

(Это мой первый пост на codegolf.SE, пожалуйста, дайте мне знать, если он отформатирован неправильно. Я понимаю, что это число байтов неконкурентное, это просто для удовольствия.)




3

Python с симпой ,  69  56 байт

-13 байтов благодаря alephalpha (путем обновления до sympy 1.1 и использования primeomega(n+2)для замены sum(factorint(n+2).values()))

... принимая от удаленного представления Грифон.

from sympy import*
lambda n:primeomega(n+2)<3*isprime(n)

Безымянная функция, возвращающая Trueпростые числа Чена и Falseдругие.

Считает факторы n+2путем суммирования кратностей его главного фактора.

Обратите внимание, что 3умножается на isprime(n)до того, как <будет выполнено сравнение, поэтому для не простого nкода тесты кода, если он n+2имеет меньше 0факторов (всегда дает False), в то время как для простого nон проверяет, n+2является ли простое число или полу простое число.


@ Грифон - я взял на себя, это может быть побито без какого-либо импорта, однако.
Джонатан Аллан

Я был вне игры! 3*isprime(n)Хитрость заключается в то , что я искал в очистке условного оператора.
Погоня Фогели

Ах, @icosahedron, я не заметил твоего, извини - это так похоже, я бы просто прокомментировал, чтобы помочь тебе улучшить свой. Не стесняйтесь рассматривать этот ответ как таковой, просто дайте мне знать, и я удалю этот.
Джонатан Аллан

Я думаю, что у sympy есть функция primeomega .
алефальфа

@alephalpha Спасибо, просто обновился до версии 1.1, чтобы сэкономить байты!
Джонатан Аллан


3

Java 8, 85 84 83 байта

n->{int a=n+2,b=0,c=0,i=1;for(;i++<n;b+=n%i<1?1:0)c+=a%i<1?1:0;return n>1&b<2&c<3;}

-1 байт благодаря @ OlivierGrégoire с использованием итеративного подхода вместо рекурсивного.

Объяснение:

Попробуй это здесь.

n->{            // Method with integer parameter and boolean return-type
  int a=n+2,    //  Start `a` at the input + 2
      b=0,c=0,  //  Start `b` and `c` at 0
      i=1;      //  Start `i` at 1
  for(;i++<n;   //  Loop from 1 to `n` (and raise `i` immediately by 1)
    b+=n%i<1?   //   If the input is divisible by `i`
        1       //    Raise `b` by 1
       :        //   Else:
        0)      //    Leave `b` as is
    c+=a%i<1?   //   If the input + 2 is divisible by `i`:
        1       //    Raise `c` by 1
       :        //   Else:
        0;      //    Leave `c` as is
                //  End of loop (implicit / single-line body)
  return n>1    //  Return if the input is larger than 1
         &b<2   //   And `b` is now smaller than 2
         &c<3;  //   And `c` is now smaller than 3
}               // End of method

Итеративный версия только байт короче: n->{int N=n+2,f=0,F=0,d=1;for(;d++<n;f+=n%d<1?1:0)F+=N%d<1?1:0;return n>1&f<2&F<3;}.
Оливье Грегуар


2

JavaScript (ES6), 63 61 байт

g=(e,i=e)=>i--<3?1:e%i?g(e,i):g(i)+1
f=e=>e>1&g(e)<2&g(e+2)<3
Test cases:<br><textarea id=i rows=6 oninput="go()">101&#10;223&#10;233&#10;1</textarea><br><pre id=q></pre><script>window.onload=function go(){document.getElementById('q').innerHTML=document.getElementById('i').value.split('\n').map(e=>e+' -> '+f(+e)).join('\n')}</script>

Определяет функцию, fкоторая принимает в nкачестве аргумента и возвращает результат. Я очень доволен тем, как gполучилось; он считает количество простых факторов в числе.

2 байта экономят благодаря трюку Кевина Круйссена &.

Ungolfed

Ω = (n,          // Ω(n) = number of n's prime factors, n > 1.
    i = n) =>    // Start iterating from i = n - 1. Since we'll immediately
                 // decrement i, n is used here.
    --i          // Immediately decrement i.

    < 2          // If i = 0 or i = 1, n is a prime at this point.
    ? 1 :        // Therefore Ω(n) = 1.

    n % i != 0 ? // If n is not divisible by i,
    Ω(n, i)      // try again with i := i - 1 (immediately decremented, so use i).

    : Ω(i) + 1   // n is divisible by i. Since we're counting down from n - 1
                 // and i is the first such number, i is n's largest non-trivial
                 // divisor, and thus n/i is a prime.
                 // Therefore Ω(n) = Ω(i) + Ω(n/i) = Ω(i) + 1.

is_chen = n =>     // An integer n ≥ 1 is a Chen prime if and only if:
    n > 1          // n > 1,
    & Ω(n) < 2     // Ω(n) = 1 < 2, i.e. n is a prime, and
    & Ω(n + 2) < 3 // Ω(n + 2) < 3, i.e. n + 2 is a prime or a semiprime.

Разве вы не можете изменить как &&к &? Поскольку 0/1 являются значениями истина / фальси в JS?
Кевин Круйссен

@KevinCruijssen Это похоже на работу. Жаль |и &не закорачивает, это может сэкономить еще больше байтов g.
PurkkaKoodari


2

PHP, 64 байта

for($i=$n=$argn+2;--$i;$argn%$i?:$q++)$n%$i?:++$p;echo$p<4^--$q;

печатает 0для правдивых, другие целые для ложных. Запустите как трубу с -nRили попробуйте онлайн .

сломать

for($i=$n=$argn+2;--$i; # loop $i from N+1 to 1
    $argn%$i?:$q++)         # if $i divides N, increment $q
    $n%$i?:++$p;            # if $i divides N+2, increment $p
echo$p<4                # $p is 1 for a prime, 3 for a semiprime
    ^--$q;              # $q is 2 for prime; so this is 1^1 (==0) for a Chen Prime

согласованное ложное значение, 65 байт:

for($i=$n=2+$k=$argn;--$i;$k%$i?:$q++)$n%$i?:++$p;echo$p<4&$q==2;

отпечатки 1для правдивых и 0ложных.


1

Python 3 с SymPy, 73 71 байт

lambda n:(sum(factorint(n+2).values())<3)&isprime(n)
from sympy import*

Попробуйте онлайн!


Это более точная версия ответа, размещенного здесь ранее, но, похоже, он был удален.


Спасибо @JonathanAllan за сохранение 2 байта!


1
... также обратите внимание, что вам не нужно f=, создание безымянной функции отлично подходит для code-golf.
Джонатан Аллан


1

APL NARS, 23 символа

{1≥⍵:0⋄(1=⍴π⍵)∧3>⍴π⍵+2}

Здесь π⍵ возвращает массив факторов ⍵, отличных от 1; какой-то тест:

  f←{1≥⍵:0⋄(1=⍴π⍵)∧3>⍴π⍵+2}
  f 101
1 
  f 223
0 
  f 233
1 
  f 1
0
  f ¯10
0

1

Регулярное выражение (ECMAScript), 31 байт

^(?!((xx+)(\2(xx))*)(\1\4)+$)xx

Попробуйте онлайн! (показаны все простые числа Чена ≤ 1000)

Для заданной строки n x s это регулярное выражение будет соответствовать тогда и только тогда, когда n - простое число Чена.

Он утверждает, что n больше 2 и что строка не имеет формы. ((xx+)(\2(xx))*)(\1\4)+
Это регулярное выражение имеет два значения, в зависимости от того, сколько раз (\2(xx))повторяется.
Когда это повторяется 0 раз, регулярное выражение может быть упрощено (xx+)\1+, что соответствует составным числам.
Когда это повторяется положительное число раз, регулярное выражение эквивалентно((xx+)(\2xx)+)(\1xx)+

Это регулярное выражение требует некоторого объяснения, однако я мало расскажу.
Если вы пройдете через алгебру, то обнаружите, что она ((xx+)(\2xx)+)(\1xx)+соответствует номерам вида a*b*c-2где a≥4,b≥2,c≥2.
Таким образом, он будет соответствовать (почти) всякий раз, когда n +2 имеет более 2 простых факторов. (т.е. ни простое, ни простое простое)
Обратите внимание, что оно не соответствует 6, 16 или 25, но это не имеет значения, потому что все они составные.

Таким образом, (?!((xx+)(\2(xx))*)(\1\4)+$)будет совпадать, пока n не является составным, а n +2 является простым или полупростым.
К сожалению, это включает в себя 1 (и 0), поэтому мы проверяем, что n по крайней мере 2 сxx

Пара разных «31 байтов»:

^xx(?!((x*)(\2xx)+)\1?(\1xx)*$)
^(?!(xx((x*)(\3xx)+))\2?\1*$)xx

1

Рубин , 49 41 байт

->n{/^(.?|((..+)\3+))(\2+|..)$/!~?l*n+=2}

Попробуйте онлайн!

Спасибо H.PWiz за -8 байт

Как?

Во-первых, получить строку 'l'повторяется n + 2 раза. Затем примените регулярное выражение, чтобы проверить:

  • Длина 2 или 3 (.?)(..)
  • Длина составного числа плюс 2 ((..+)\1)(..)
  • Длина - произведение не менее 3-х чисел ((..+)\2)\1+

2 части регулярного выражения генерируют четвертый случай, который не имеет смысла и его можно игнорировать: он (.?)\2+разрешает пустую строку или один символ, потому что \2пуст.


Вы можете объединить две половинки вашей |ближе друг к другу: ^((..+)\2+)(\1+|..)$. Кроме того, удачное совпадение, что вы пытались решить эту проблему с помощью регулярного выражения в то же время, что и я :)
H.PWiz

Я считаю, что вы можете использовать .вместо, .?так как ввод всегда по крайней мере 1
H.PWiz

0

Юлия, 59 байт

x->((0∉x%(2:x-1))&(length(find(x->x==0,(x+2)%(2:x)))<=2))


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.