첸 프라임?


27

두 조건을 만족하는 경우 숫자는 첸 소수입니다.

  • 그 자체가 프라임
  • 자체 + 2는 프라임 또는 세미 프라임입니다.

소수는 정확히 2 개의 제수가 있고 그 제수가 자체와 하나로 구성되는 숫자입니다.

세미 프라임은 두 소수의 곱인 숫자입니다. (12 = 2 * 2 * 3은 세미 프라임이 아니라 25 = 5 * 5입니다).

당신의 임무는 숫자가 첸 소수인지 확인하는 것입니다. yes의 경우 true 값과 no의 경우 false 값을 출력해야합니다.

입력은 1 이상의 정수입니다. 문자열, 문자 배열 또는 배열 또는 숫자로도 사용할 수 있습니다.

예 :

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

OEIS A109611 입니다.

이것은 부분적 으로 소피 제르맹 (Sophie Germain) 프라임 에서 영감을 얻은 것 입니까? 불행히도 중복으로 폐쇄되었으므로 중복이 아닌 다소 관련된 도전 과제를 게시하고 있습니다.


우리는 반환 할 수 Truetruthy과 2또는 Falsefalsy (일관성 falsy 값)에 대한?
Mr. Xcoder

@ Mr.Xcoder 결코 당신이 할 수 없다고
말하지

세미 프라임의 경우 "정확히 두 가지 주요 요소"가 다중성을 계산합니까? 가 2 * 2 * 2 * 3 * 3반 프라임은? 무엇에 대해 5 * 5?
나무가 아님

@Notatree 5*5는 세미 프라임 2*2*2*3*3입니다. 나는 정확히 두 가지를 말했다 .
Okx

그렇다면 다중성을 계산합니까? (당신은 그 주장 할 수 있습니다 2*2*2*3*3즉, 정확히 두 개의 소인수를 가지고 23, 그리고 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

sympy를 가진 파이썬 ,  69  56 바이트

alephalpha 덕분에 -13 바이트 (sympy 1.1로 업그레이드하고를 사용 primeomega(n+2)하여 대체 sum(factorint(n+2).values()))

... Gryphon의 삭제 된 제출물을 인수합니다.

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

TrueChen 프라임 등을 위해 반환되는 명명되지 않은 함수 False.

n+2소인수의 다중성을 합산하여 의 계수를 계산합니다 .

참고 3곱하여 isprime(n)전과 <때문에 비 프라임을위한 비교가 이루어진다 n경우 코드 테스트 n+2미만 갖는다 0(항상 산출 요인 False프라임하면서) n그 여부를 확인 n+2프라임 또는 반 소수.


@Gryphon-인수했지만 수입 없이는 이길 수 있습니다.
Jonathan Allan

나는 outgolfed되었습니다! 3*isprime(n)트릭 내가 조건문을 청소에서 찾고 있었던 것입니다.
체이스 보글 리

아, @icosahedron, 나는 당신을 눈치 채지 못했습니다, 죄송합니다-이것은 당신이 당신을 향상시키는 데 도움을주기 위해 방금 언급 한 것과 비슷합니다. 이 답변을 자유롭게 처리하고 알려 주시면이 답변을 삭제하겠습니다.
Jonathan Allan

나는 sympy가 primomega 기능을 가지고 있다고 생각 합니다.
alephalpha

@alephalpha 감사합니다. 1.1로 업그레이드하여 바이트를 절약했습니다!
Jonathan Allan


3

자바 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;}

@ OlivierGrégoire 덕분 에 재귀 대신 반복 접근 방식을 사용하여 -1 바이트 .

설명:

여기에서 시도하십시오.

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;}.
Olivier Grégoire


2

자바 스크립트 (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밝혀 졌는가에 매우 만족 합니다. 그것은 소수의 주요 요소의 수를 계산합니다.

Kevin Cruijssen의 &트릭 덕분에 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 이후 JS에서도 진실 / 거짓 값입니까?
Kevin Cruijssen

@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

SymPy가 포함 된 Python 3 , 73 71 바이트

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

온라인으로 사용해보십시오!


이것은 이전에 게시 된 답변의 골치 아픈 버전이지만 삭제 된 것 같습니다.


2 바이트를 절약 한 @JonathanAllan에게 감사합니다!


1
... 또한 f=이름이없는 함수를 만드는 것은 코드 골프에 적합합니다.
Jonathan Allan


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 의 문자열이 주어지면 이 정규 표현식은 n 이 Chen 소수 인 경우에만 일치합니다 .

n 이 2보다 크고 문자열이 형식 ((xx+)(\2(xx))*)(\1\4)+
이 아님을 주장합니다. 이 정규식 (\2(xx))은 반복 횟수에 따라 두 가지 의미를 갖습니다 .
0 번 반복하면 정규식을로 단순화 할 수 있으며 (xx+)\1+이는 복합 숫자와 일치합니다.
양의 횟수를 반복하면 정규식은((xx+)(\2xx)+)(\1xx)+

그 정규 표현식에는 약간의 설명이 필요하지만 약간의 통찰력을 제공 할 것입니다.
대수를 살펴보면 where ((xx+)(\2xx)+)(\1xx)+형식의 숫자와 일치합니다 . 따라서 n +2에 2 개 이상의 주요 요인이 있을 때마다 (거의) 일치 합니다. (즉 프라임 또는 세미 프라임) 6, 16 또는 25와 일치하지 않지만 모두 합성이므로 중요하지 않습니다.a*b*c-2a≥4,b≥2,c≥2

따라서 n 이 합성이 아니고 n +2가 소수 또는 반 프라임 (?!((xx+)(\2(xx))*)(\1\4)+$)이면 일치 합니다. 불행히도 여기에는 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}

온라인으로 사용해보십시오!

-8 바이트를위한 감사합니다 H.PWiz

방법?

먼저 'l'n + 2 번 반복 되는 문자열을 얻으십시오 . 그런 다음 정규식을 적용하여 다음을 확인하십시오.

  • 길이는 2 또는 3입니다 (.?)(..)
  • 길이는 복합 수에 2를 더한 값입니다 ((..+)\1)(..)
  • 길이는 3 자리 이상의 곱입니다 ((..+)\2)\1+

두 정규 표현식 부분은 의미가 없으며 무시해도 안전한 네 번째 경우를 생성 (.?)\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))


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.