チェンプライムですか?


27

数値は、次の2つの条件を満たす場合、陳素数です。

  • プライムそのものです
  • それ自体に2を加えたものは、素数または半素数です。

素数とは、正確に2つの除数があり、それらの除数がそれ自体と1つで構成される数です。

準素数は、2つの素数の積である数値です。(12 = 2 * 2 * 3はセミプライムではありませんが、25 = 5 * 5はセミプライムです)。

あなたの仕事は、数が陳素数であるかどうかを判断することです。yesの場合は真実の値を、noの場合は偽の値を出力する必要があります。

入力は1以上の任意の整数になります。また、文字列、文字配列、または配列または数字として取得することもできます。

例:

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

これはOEIS A109611です。

これは、一部、私はソフィー・ジェルマンの素数に触発されていますか?残念ながら、これは重複として閉じられたため、重複ではない、やや関連するチャレンジを投稿しています。


私たちは、返すことができTruetruthy用及び2またはFalsefalsy(矛盾falsy値)のために?
ミスターXcoder

@ Mr.Xcoderあなたができないと言ったことはありません
Okx

半素数の場合、「正確に2つの素因数」は多重度をカウントしますか?ある2 * 2 * 2 * 3 * 3半プライム?どう5 * 5
木ではない

@Notatree 5*5は準素数ですが、そうで2*2*2*3*3はありません。ちょうど 2つ言った。
Okx

それでは、多重度はカウントされますか?(あなたはそれ2*2*2*3*3が正確に2つの素因数、すなわち235*5持ち、1つの素因数、つまりを持つと主張することが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+20要素がより小さいかどうかをテストし(常に降伏しますFalse)、素数の場合は素数か半素数かをnチェックしますn+2


@Gryphon-私が引き継いだ、しかしそれはインポートなしで打ち負かされるかもしれない。
ジョナサンアラン

私はアウトゴルフされました!3*isprime(n)トリックは、私は条件文をクリーンアップで探していたものです。
チェイスヴォーゲリ

ああ、@ icosahedron、私はあなたのことに気づかなかった、ごめんなさい-これは非常に似ているので、あなたがあなたのものを改善するのを助けるためにコメントしたでしょう。この回答を自由に扱ってください。お知らせください。削除します。
ジョナサンアラン

sympyには、primeomega関数があると思います。
-alephalpha

@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;}

@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

反復バージョンは1バイト短くなっています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判明したことに非常に満足しています。数の中の素因数の数を数えます。

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の真偽値でもありますか?
ケビン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;

プリント1truthyためと0falsyため。


1

Pythonの3 SymPyと、73の 71バイト

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

オンラインでお試しください!


これは以前にここに投稿された回答のよりゴルフバージョンですが、削除されたようです。


2バイトを節約してくれた@JonathanAllanに感謝します!


1
...またf=、コードゴルフでは名前のない関数を作成する必要はありません。
ジョナサンアラン


1

APL NARS、23文字

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

ここで、π⍵は1と異なるofの因子の配列を返します。いくつかのテスト:

  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))繰り返される回数に応じて2つの意味があります。
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}

オンラインでお試しください!

-8バイトのH.PWizに感謝

どうやって?

まず、'l'n + 2回繰り返される文字列を取得します。次に、正規表現を適用して次のことを確認します。

  • 長さは2または3です (.?)(..)
  • 長さは、合成数に2を加えたものです ((..+)\1)(..)
  • 長さは少なくとも3つの数字の積です ((..+)\2)\1+

2つの正規表現部分は4番目のケースを生成しますが、これは意味がなく、無視しても安全です:は空である(.?)\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))


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.