プラスプライムとマイナスプライム


35

私たちのほとんどは知っています...

すべての素数p>3ここに画像の説明を入力してください

しかし、特定の範囲内のプラスプライム6n+1)とマイナスプライム6n-1)はいくつありますか?

チャレンジ

整数を考えるとk>5、どのように多く数えprimes<=kているPlusPrimesと何があるMinusPrimes

以下のためにk=100、私たちは持っている
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89] 12 MinusPrimes

[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97] 11 PlusPrimesを

以下のためにk=149、私たちは持っている
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, 101, 107, 113, 131, 137, 149]
18 MinusPrimes

[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97, 103, 109, 127, 139]
15 PlusPrimesを

ルール

コードは2つの整数を出力する必要があります。1つはMinusPrimes用で、もう 1つはPlusPrimes用です(任意の順序で指定してください)。
これはです。バイト単位の最短回答が勝ちです!

テストケース

入力 -> 出力 [ MinusPrimesPlusPrimes ]

6->[1,0]  
7->[1,1]   
86->[11,10]  
986->[86,78]  
5252->[351,344]  
100000->[4806,4784]   
4000000->[141696, 141448]

45
知りませんでした!:(
Stewie Griffin

13
@StewieGriffin、モジュラスシーケンスを見ると簡単にわかります。6 0%6の倍数で1%6あるか、判別できません2%6。2 3%6の倍数であり、3 4%6の倍数であり、2の倍数であり、5%6決定できません。
zzzzBov

3
私はそれが素数のために何を意味するのか弾性率が順序を持っていた理由を知っていた、とあれば本当に便利だろう@zzzzBov ...私は...高校は数論を教えたい
ソクラテスのフェニックス

@SocraticPhoenix、モジュラスは「除算後の剰余」を意味します。0、6、12などはすべて、6で除算した後に0を生成します。1、7、13はすべて1を生成します。因子に分割できない数値を探しているので、数値が1より大きい整数で割り切れることは、その数値が素数でないことを示しています。
zzzzBov

回答:




6

Python 2、77バイト

ニールのおかげで-2バイト

lambda x:[sum(all(n%j for j in range(2,n))for n in range(i,x,6))for i in 7,5]

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

以前のソリューション、83 81 79バイト

Mr. Xcoderのおかげで-1バイト-Halvard
Hummelのおかげで2バイト

lambda x:map([all(n%i for i in range(2,n))*n%6for n in range(4,x)].count,[5,1])

オンラインでお試しください!
[MinusPrimes、PlusPrimes]としての両方の出力





JavaScript配列の内包表記が多すぎます-Pythonリストには[]s が必要ないことが多いことを忘れていました。
ニール

したがって、nをiからn-1までのすべての数で除算して素数であるかどうかを確認し、整数(5,11、...)および(7,13、...)をすべて生成して、問題の番号があり、それらを数えます。効率的なようです。;)
Yakk

5

ゼリー、7バイト

s6ÆPSm4

プラス、マイナス。

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

使い方

s6ÆPSm4  Main link. Argument: n

s6       Split [1, ..., n] into chunks of length 6.
  ÆP     Test all integers for primality.
    S    Sum across columns.
         This counts the primes of the form 6k + c for c = 1, ..., 6.
     m4  Take every 4th element, leaving the counts for 6k + 1 and 6k + 5.

5

Mathematica、51バイト

(s=#;Mod[Prime~Array~PrimePi@s,6]~Count~#&/@{5,1})&

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

@ngenisisはそれを打ち倒し、4バイトを節約しました

Mathematica、47バイト

sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}

Mod挿入語にすることもできます。最初の引数に名前を付ける場合はs、名前付き引数を使用しますsPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
。– ngenisis

5

Japt15 13 11バイト

出力順は[+,-]です。

õj ò6 yx ë4

試して

  • デニスのゼリーソリューションからインスピレーションを得ましたが、ゴルフの後は、港に近くなりました。
  • Oliverに感謝し、2バイトの節約になりました。これは、以前は知られていなかったë配列のメソッドに注意を向けてくれました。

説明

integerの暗黙的な入力U

õj

õ1〜の整数の配列()を生成し、Uそれぞれが素数(j)かどうかを確認して、ブールの配列を提供します。

ò6

配列を長さ6のサブ配列に分割します。

yx

転置(y)して列を合計します。

ë4

配列の4番目の要素をすべて取得し、暗黙的に出力します。


オリジナル、19 17 16 15バイト

õ fj
5â £è_%6¥X

試して

  • 1バイトを、15を配列に分割して月桂樹で休んだ後、5の除数を使用するというオリバーからのインスピレーションを受けた提案に感謝します。


3

網膜53 51バイト

.+
$*
1
$`1¶
G`1111
A`^(11+)\1+$
1{6}

*M`111
\b1\b

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

.+
$*

単項に変換します。

1
$`1¶

1からまでカウントしnます。

G`1111

4未満の数字を削除します。

A`^(11+)\1+$

合成番号を削除します。

1{6}

6を法とする剰余を取る。

*M`111

3から5の間の剰余で数字の数を印刷します。

\b1\b

残りの1の数を出力します。


3

Ruby、61 60バイト

(52バイト+ -rprimesフラグの場合は8 )

->n{[1,5].map{|x|(4..n).count{|i|i.prime?&&i%6==x}}}

[プラスプライム、マイナスプライム]の形式の配列を返します。

GBのおかげで1バイト節約できました!

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


私はあなたの答えに触発され、鉱山を更新しました(Haskellで)!
-jferard

@jferardそれを聞いてとてもうれしいです!:)
クリスチャンルパスク

countsplat演算子なしで範囲で使用できます(1バイト保存)。
GB

3

Perl 6、42バイト

無駄なスペースを削除して1バイトを節約しました...

@Joshuaのおかげで呼び出しを再編成して2バイトmap を節約しました。

.round 等しい ため3バイトを節約しました.round: 1

実際、複雑な指数関数はクールですが、文字通り非常に高価です。それを捨てるだけで10バイトを節約しました...

{[+] map {.is-prime*($_%6-1??i!!1)},5..$_}

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

これは、複雑な指数関数を持つバージョンでした。(私はそれを削除するにはあまりにも好きです。)新しいバージョンはまったく同じように機能します。複雑な指数だけがはるかに短い三項演算子に置き換えられます。

{[+] map {.is-prime*exp(π*($_%6-1)i/8).round},5..$_}

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

出力は複素数(PlusPrimes) + (MinusPrimes)iです。ルールに反しすぎないことを望みます。


説明:これは、1つの整数引数を取る関数です。5から引数((5..$_))までのすべての整数を反復処理します。これらのそれぞれについて、.is-prime(これは$_マップされたブロックの引数で呼び出されます)評価し、(数値True == 1, False == 0化されている場合)にexp(0) = 1(for $_%6 = 1)またはexp(iπ/2) = i(for $_%6 = 5)になる複素指数を乗算し、最後に丸めます最も近い整数。それらをまとめる[+]結果得ます。

最後に:それは非常に効率的であるため、高い数値の出力を取得する前にTIOがタイムアウトしないかどうかはわかりません(1e5の場合、私のマシンでは26秒かかり、TIOは多少遅くなる傾向があります)。


それはいいです。よくやった!

私はあなた効率的に意味すると思いますか?いい方法だ!
ジョナサンアラン

それは皮肉なことに粗野な試みでした:—)。
Ramillies

、ゴルフの方法フォームを使用している場合mapgrep、時にはあなたにいくつかの文字を要することができます。これにより2文字が節約さ{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
ジョシュア

ここでそれをするのを忘れてしまった、私の注意を喚起してくれてありがとう!
ラミリーズ

2

実際には、21バイト

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜

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

最初にPlusPrimesを出力し、次にMinusPrimesを出力します

説明:

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜
u5x                    range(5, n+1)
   `p░                 primes in range
      ⌠6@%1=;`╖*ƒ⌡M    for each prime:
       6@%               mod 6
          1=             equal to 1
            ;`╖*ƒ        execute ╖ if p%6==1 (add 1 to register 0, consuming p)
                   l   length of resulting list (MinusPrimes)
                    ╜  push value in register 0 (PlusPrimes)


2

MATLAB 2017a、29バイト

sum(mod(primes(k),6)'==[5,1])

説明:primes(k)kまでのすべての素数を取得します。mod(primes(k),6)'は、すべての素数のモジュラス6を取得して転置し、合計が正しい次元に沿って実行されるようにします。==[5,1]最初の列で5つすべて(minusPrimes)を1に設定し、2番目の列ですべて1(plusPrimes)を1に設定します。sum()各列を合計します。

この出力 [minusPrime, plusPrime]


2

Japt18 16バイト

@Oliverのおかげで-2バイト

õ_j ©Z%6
5â £è¥X

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

形式で出力します[PlusPrimes, MinusPrimes]


うーん...デスクに戻って、17バイトまで掘り下げて、あなたがこれを投稿したのを見ました...両方のソリューションの核心がマッピングされているので、投稿するべきかどうかわからない[5,1]カウントを取得し、最初にそこに着きました。
シャギー

@Shaggy IMOのソリューションには、別の投稿を残すのに十分な違いがあります。filterと文字列を使用しました。のマッピング関数õと配列を使用しました。その上、私は[5,1]別の答えからアイデアを得ました。
ジャスティンマリナー

少し考えます。同様の方法を使用した異なる言語のソリューション(一方が他方から「借用」した場合でも)は問題ありませんが、同じ言語で2つのソリューションを実行すると、完全にうまくいきません。私は今のところ、代替として投稿に編集しました。
シャギー

私はそれで走ることに決め、それからもう1バイト削りました。
シャギー

あなたが取得するために使用することができます[1,5]
オリバー

2

C位、202 179 174のバイト

Xcoder氏のおかげで-23バイト

チョイスのおかげで-5バイト

長さ2の配列を返す関数、を[MinusPrimes, PlusPrimes] 呼び出して実行しa(n)ます。

int[]a(int n){int[]r={0,0};for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}

Try It Onlineで適切にフォーマットされたコード:ここ


TIOリンクを追加できますか?
氏Xcoder

申し訳ありませんがゴルフのバイトツーバイト、194バイト:public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i<=Math.Sqrt(n)+1;i+=2)if(n%i<1)return 0;return 1;}
氏Xcoder

193バイト:public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}
ミスターXcoder

lmao youreがこのarentあなたを愛して;)
MysticVagabond

1
すべての助けに感謝します。別の回答を投稿し、私のゴルフだと述べたので、私はそのまま私のものを離れて、次の挑戦にレッスンを取るつもりです:P
MysticVagabond


1

Pyth、15バイト

/K%R6fP_TSQ5/K1

テストスイート。

Pyth、16バイト

m/%R6fP_TSQd,1 5

テストスイート。


どうやって?

説明#1

/ K%R6fP_TSQ5 / K1-完全なプログラム。

     fP_TSQ-範囲[1 ... input]で素数をフィルタリングします。
  %R6-それぞれのMod 6。
 K-それらを変数Kに割り当てます。
/ 5-Kの5の出現をカウントします。
            / K1-Kの1の出現をカウントします。
                -結果を暗黙的に出力します。

説明#2

m /%R6fP_TSQd、1 5-完全なプログラム。

     fP_TSQ-範囲[1 ... input]で素数をフィルタリングします
  %R6-それぞれのMod 6。
            、1 5-リストをプッシュ[1、5]
m / d-それぞれの数を数えます。  
                 -結果を暗黙的に出力します。 

代替案:

/ K%R6fP_TSQ5 / KhZ(16バイト)
K%R6fP_TSQ / K5 / K1(16バイト)
m /%R6fP_TSQdj15T(16バイト)
m /%R6fP_TSQd [1 5(16バイト)   
m /%R6fP_TSQdsM`15(17バイト)
m /%R6.MP_ZSQd、1 5(17バイト)
m /%R6.MP_ZSQdj15T(17バイト)
m /%R6.MP_ZSQd [1 5(17バイト)

2
10kおめでとうございます!!
ルイスメンドー

@LuisMendoどうもありがとう:-)
Xcoder氏

1

ゼリー 12 11  10バイト

@cairdcoinheringaahingにチャットのヒントをありがとう。チャットで1バイトを保存してくれた@Dennisに感謝します。

ÆR%6ċЀ1,5

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

ゼリー、11バイト

ÆR%6µ1,5=þS

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

ゼリー、11バイト

ÆR%6µċ5,ċ1$

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


これはどのように作動しますか?

説明#1

ÆR%6ċЀ1,5   As usual, full program.

ÆR           Get all the primes in the range [2...input].
  %6         Modulo each by 6.
       1,5   The two-element list [1, 5].
    ċЀ      Count the occurrences of each of ^ in the prime range.

説明#2

ÆR%6µ1,5=þS   As usual, full program.

ÆR            Get all the primes in the range [2...input].
  %6          Modulo each by 6.
    µ         Chain separator.
     1,5      The two-element list [1, 5].
        =     Equals?   
         þ    Outer product.     
          S   Sum.

説明#3

ÆR%6µċ5,ċ1$   As usual, full program.

ÆR            All the primes in the range [2...input].
  %6          Modulo each by 6.
    µ     $   Some helpers for the chains.
       ,      Two element list.
     ċ5       The number of 5s.
        ċ1    The number of 1s.

1

ジャワ8、141 140 138 106 101の 100 96 94 81バイト

n->{int r[]={0,0},c;for(;n-->4;r[n%6/4]+=c)for(c=n;c>1;c=c-1&~n%c>>-1);return r;}

チャレンジの説明と比較して逆の順序で、2つの値を持つ整数配列を返します
[plusPrime, minusPrime]

私が39 40 42バイトをゴルフした後の@XynosのC#回答のポート。@Nevay からのさらに大きな助けは、なんと-55バイトです。

説明:

ここで試してみてください。(最終的なテストケース4000000は、60秒の制限時間をわずかに超えています。)

n->{                   // Method with integer parameter and integer-array return-type
  int r[]={0,0},       //  Return integer-array, starting at [0,0]
      c;               //  Temp integer
  for(;n-->4;          //  Loop (1) as long as the input is larger than 4
                       //  and decrease `n` by 1 before every iteration
      r[n%6/4]+=c)     //    After every iteration, increase the plus or minus prime by `c`
                       //    (where `c` is either 0 or 1)
    for(c=n;           //   Reset `c` to `n`
        c>1;           //   And inner loop (2) as long as `c` is larger than 1
      c=               //    Change `c` to:
        c-1&~n%c>>-1;  //     inverting the bits of `n`,                    [~n]
                       //     modulo-`c` that result,                       [%c]
                       //     then bit-shift right that by -1,              [>>-1]
                       //     and then bitwise-AND that result with `c-1`   [c-1&]
    );                 //   End of inner loop (2)
                       //  End of loop (1) (implicit / single-line body)
  return r;            //  Return result integer-array
}                      // End of method

1
106バイト:n->{int r[]={0,0},i=4,j,c;for(;i++<n;){for(j=c=1;j*j<i;)c=i%(j+=2)<1?0:c;if(i%2*c>0)r[i%6%5]++;}return r;}
Nevay

1
101バイト:n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]-=-i%2*c>>-1)for(j=c=1;j*j<i;)c|=i%(j+=2)-1;return r;}
Nevay

1
96バイト:n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}(-1に感謝しますj++,++j
Nevay

1
94バイト:n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6/4]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}[plusPrime, minusPrime])。
ネヴァイ

1
81バイト:n->{int r[]={0,0},c;for(;n-->4;r[n%6/4]+=c)for(c=n;c>1;)c=c-1&~n%c>>-1;return r;}
Nevay

1

JavaScript(ES6)、83 82 80 68 66バイト

完全に再帰的なソリューションは、配列をマッピングするよりもはるかに短いことが判明しました!

出力順は[-,+]です。3490付近でオーバーフローエラーが発生します。

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

それを試してみてください

o.innerText=(

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

)(i.value=6);oninput=_=>o.innerText=i.value>5?f(+i.value):[0,0]
<input id=i min=6 type=number><pre id=o>


0

CJam、19バイト

ri){mp},6f%_5e=p1e=

STDINから入力を受け取り、STDOUTを介して改行で区切られた2つの数値を出力するプログラム。

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

説明

ri){mp},6f%_5e=p1e=

ri                        Read integer k
  )                       Add 1
       ,                  Filter the (implicit) array [0 1 ... k] ...
   {mp}                   ... on the function "is prime"
         f                Map over the resulting array...
          %               ... the function "modulus" ...
        6                 ... with extra parameter 6
           _              Duplicate the resulting array
             e=           Count occurrences ...
            5             ... of number 5
               p          Print with newline
                 e=       Count occurrences ...
                1         ... of number 1. Implicitly display

0

R + 番号66 60 58 40バイト

Jarko Dubbeldamのおかげで-16バイト!その後、さらに2バイトのゴルフをしました。

cat(table(numbers::Primes(4,scan())%%6))

プリントPlusPrimes MinusPrimesstdoutに。stdinから読み取ります。

table入力ベクトル内の値の各出現回数を、値の昇順で表にします。したがって、2つの値、つまり1and 5(mod 6)しかないため、これはnumbers::Primes、との間のすべての素数を返すとともに、まさに必要な関数4です。

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

ベースR97 91 89 86 65バイト

ここでもJarkoによって保存された大量のバイト

function(n)table((5:n)[sapply(5:n,function(x)all(x%%2:x^.5))]%%6)

これは上記とほぼ同じですが、パッケージを使用するのではなくベースRのすべての素数を計算し、それを出力するのではなく関数の出力で返します。出力で、名前15、以下のカウントを持つテーブルを返すことがわかります。

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



(デニスはTIOに数字を追加したので、今ではうまくいきます:))
JAD


all(x%%2:x^.5>0)、何もゼロでないので、すでにtruthyですall(x%%2:x^.5)あまりにも動作します
JAD

@JarkoDubbeldamとても素敵です!すべての値は4私たちが取り除くことができるものよりも大きい>4ので、私たちは2もはやプライムとしてそこにいないので、結局、このゴルフは40バイトになります。
ジュゼッペ


0

JavaScript(SpiderMonkeyの)151140、131のバイト

n=>[...Array(n+1).keys()].splice(5).filter(a=>!/^1?$|^(11+?)\1+$/.test("1".repeat(a))).reduce((r,a)=>(a%6<2?r[1]++:r[0]++,r),[0,0])

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

バグ修正とゴルフを手伝ってくれたシャギーに感謝します。

説明:

n=>                                                   // Create a lambda, taking n
    [...Array(n+1).keys()]                            // Create a list from 0 to n+1
        .splice(5)                                    // remove first five elements
        .filter(a=>                                   // filter the list to get primes
             !/^1?$|^(11+?)\1+$/.test("1".repeat(a))) // using the famous regex here: https://stackoverflow.com/questions/2795065/how-to-determine-if-a-number-is-a-prime-with-regex 
        .reduce((r,a)=>                               // reduce the list
           (a%6<2?r[1]++:r[0]++,r),                   // by counting plus primes
           [0,0])                                     // and minus primes

1
17,15149の返品(する必要があります18,15)。アレイのサイズを1:TIO増やす必要があります。ちなみに、これは単なる「バニラ」ES6であり、SpiderMonkey固有のものではありません。また、TIOではなくJSのスタックスニペットを使用できます。また、削除できるスペースはたくさんあります。
シャギー

1
131バイトまで減らすためのもう1つの簡単な節約方法です。
シャギー

@Shaggy私はあなたがそのようなreduceを使用できることに気づきませんでした。
Pureferret
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.