Це прем'єр Чен?


27

Число є простим Чен, якщо воно задовольняє двом умовам:

  • Це само по собі
  • Сам плюс два - це просто прем'єр, або напівпрем'єр.

Прем'єр - це число, де в ньому є рівно два дільника, і ці дільники складаються з себе та одного.

Напівпрості - це число, яке є добутком двох простих чисел. (Зверніть увагу, що 12 = 2 * 2 * 3 не є напівпросте, але 25 = 5 * 5 є).

Ваше завдання - визначити, чи число є простим Ченном. Ви повинні вивести будь-яке значення truthy для так і будь-яке хибне значення для no.

Вхід буде будь-яким цілим числом, більшим або рівним одиниці. Він також може прийматися як рядок, масив символів або масив або цифри.

Приклади:

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

Це OEIS A109611 .

Це частково натхнене Am I a Sophie Germain? який, на жаль, закрився як дублікат, тож я надсилаю дещо пов’язаний виклик, який не є дублікатом.


Можемо чи ми повернутися Trueдо truthy і 2чи Falseдля falsy (непослідовних falsy значень)?
Містер Xcoder

@ Mr.Xcoder Ніколи не говорив, що ви не можете
Okx

Чи вважає "рівно два простих чинника" кратність? Це 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, будь ласка, повідомте мене, якщо це відформатовано неправильно. Я розумію, що кількість байтів не є конкурентоспроможною. Це просто для задоволення.)



5

Pyth, 10 байт

&P_Q>3lP+2

Спробуйте в Інтернеті!

Як?

&P_Q>3lP+2  # input: Q
        +2  # Q + 2
       P    # prime factors
    >3l     # length lower than 3?
 P_Q        # Q is prime?
&           # and both results

>. <Перевершив>. <
Містер Xcoder

@ Mr.Xcoder насправді, я розмістив шахту за 5 хвилин до цього
Уріель

Так, не бачив цього через поганий зв’язок з Інтернетом
містер Xcoder

3

Пітон із симпатією ,  69  56 байт

-13 байт завдяки алефалфа (оновлення до симфії 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є простим або напівпримітним.


@Gryphon - я взяв на озброєння, але він може бути доступним без жодного імпорту.
Джонатан Аллан

Я перевершив! 3*isprime(n)Хитрість полягає в тому, що я шукав в очищенні умовного оператора.
Chase Vogeli

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

Я думаю, що симпатія виконує функцію 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 байти економить завдяки хитрості Кевіна Круїссена &.

Безумовно

Ω = (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 - це значення truthy / falsey у 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=, створення неназваної функції прекрасно для коду-гольфу.
Джонатан Аллан


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

Regex (ECMAScript), 31 байт

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

Спробуйте в Інтернеті! (показано всі прайми Чену ≤ 1000)

З огляду на рядок n x s, цей регулярний вираз буде відповідати тоді і лише тоді, коли n є простим числом Chen.

Він стверджує, що 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+)(\1+|..)$. Також акуратний збіг обставин, що ви намагалися скористатися цією проблемою з регулярним виразом в аналогічний для мене час :)
H.PWiz

Я вважаю, що ви можете використовувати .замість цього, .?оскільки вхід завжди не менше 1
H.PWiz



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.