非プライム番号の検索


17

あなたがそれを受け入れることを選んだなら、あなたの挑戦は、数字が以下の基準を満たしている場合にtrueまたはfalse(またはyesとnoの同様の意味のある表現)を返す関数をコードゴルフすることです:

  1. 整数自体は素数ですOR
  2. 隣接する整数のいずれかが素数

たとえば、次
の入力7 Trueを返します。
の入力8もTrueを返します。
の入力は15Falseを返します。(14、15、16のいずれも素数ではありません)

入力は2 ^ 0から2 ^ 20までの数値に対して正しく返される必要があるため、符号の問題や整数のオーバーフローを心配する必要はありません。


バッファオーバーフローではなく、32ビット数のオーバーフローです。
ユーザー不明

おっと、「整数オーバーフロー」を意味しました。脳は自動操縦に行きました。
ラマ氏

回答:


11

J、17

*/<:$&q:(<:,],>:)

プロセスのリターンコードとしてエンコードされたブール値を返します。trueの場合はゼロ、falseの場合はゼロ以外。使用例:

   */<:$&q:(<:,],>:) 7
0
   */<:$&q:(<:,],>:) 8
0
   */<:$&q:(<:,],>:) 15
3

*/0 p:<:,],>:は短く、適切な(ラムダ)関数は([:*/0 p:<:,],>:)
randomra


6

Python 85 80

def f(n):g=lambda n:all(n%i!=0for i in range(2,n));return g(n)or g(n-1)or g(n+1)

Code Golfで初めてなので、おそらく私が見逃しているいくつかのトリックがあります。


を削除でき[]ます。ジェネレータ式で作業することはすべて幸せです。あなたが醜いというあなたのコードを気にしない場合は、間にスペースを削除することができます0し、forと、)or
stranac

@stranac素晴らしい。どうもありがとうございました。
クリスハーパー

3
いくつかの簡単な変更を行いましたが、うまくいけばうまくいきます:f=lambda n:any(all(m%i for i in range(2,m))for m in[n,n-1,n+1])
Nabb

@Nabbとてもいい。よくやった。
クリスハーパー

5

どんな手段であれ、コードの短さの真の候補ではありませんが、正規表現によって素数決定することは多くの点でねじれているので、まだ提出しています!

Python(2.x)、85文字

import re
f=lambda n:any(not re.match(r"^1?$|^(11+?)\1+$","1"*x)for x in[n,n-1,n+1])

forループを削除して、「1」*(n + 1)をテストすることで正規表現に組み込むことができますが、^ 1?1?代わりに。
ハワード

4

Ruby(55、またはラムダとして50)

def f q;(q-1..q+1).any?{|n|(2..n-1).all?{|d|n%d>0}};end

またはラムダとして(使用 g[23]呼び出しに)

g=->q{(q-1..q+1).any?{|n|(2..n-1).all?{|d|n%d>0}}}

コーヒースクリプト(53)

p=(q)->[q-1..q+1].some (n)->[2..n-1].every (d)->n%d>0

<pedantic>「lambda」ではなく「proc」にする必要があります</ pedantic> ;-)
ドアノブ

3

退屈なMathematica、35のソリューション!

PrimeQ[n-1]||PrimeQ[n]||PrimeQ[n+1]

15
少なくともあなたはそれをゴルフすることができますOr@@PrimeQ/@{n-1,n,n+1}
ハワード

これは機能ではありません。
マーティンエンダー

@MartinBüttner:Mathematicaを知りません、ごめんなさい。
Ry-

2
ハワードのバージョンを使用Or@@PrimeQ@{#-1,#,#+1}&します(彼のコードのスラッシュは不要です)
Martin Ender

3

C、112 82 72文字

Ilmari Karonenのコメントに従って、を削除して30文字を節約しmainPtrue / falseを返すようになりました。また、ループを再帰に置き換え、さらにいくつかの調整を行いました。

p(n,q){return++q==n||n%q&&p(n,q);}P(n){return p(-~n,1)|p(n,1)|p(~-n,1);}

元のバージョン:

p(n,q,r){for(r=0,q=2;q<n;)r|=!(n%q++);return!r;}
main(int n,int**m){putchar(48|p(n=atoi(*++m))|p(n-1)|p(n+1));}

で2文字保存できますmain(n,m)int**m;
イルマリカロネン

...さらに、チャレンジは「機能をコードゴルフ」と言います。
イルマリカロネン

3

Mathematica、24バイト

今日、この古い投稿が私のリストに載った理由はわかりませんが、ここでMathematicaが競争力があることに気付きました。

Or@@PrimeQ/@{#-1,#,#+1}&

整数の引数を取り、Trueまたはを返す名前のない関数False。直接実装。


PrimeQリスト上のスレッド、したがってOr@@PrimeQ@{#-1,#,#+1}&(またはOr@@PrimeQ[#+{-1,0,1}]&)-1バイトの場合も動作します。(ただし、PrimeQ2012年にリストにスレッド化されたかどうかはわかりません。)
Misha Lavrov


2

JavaScript(71 73 80

n=prompt(r=0);for(j=n-2;p=j++<=n;r|=p)for(i=1;++i<j;)p=j%i?p:0;alert(r)

デモ:http : //jsfiddle.net/ydsxJ/3/

編集1:(感謝)に変更for(i=2;i<j;i++)し ます。文を三項に変換します。内側の中括弧をなくすために外側に移動しました。7文字を保存しました。for(i=1;++i<j;)@minitechifr|=pp=1for

編集2:結合しp=1j++<=np=j++<=n、2文字を保存(ありがとう@ugoren)。


for(i=1;++i<j;)代わりにfor(i=2;i<j;i++)を使用して、さらに1文字を保存できます。
Ry-

1
@minitech:!j%i優先順位が理由で機能しません。代替案はj%i<1です。
ナブ

@ナブ:うん、そうだね。それはばかげている。
-Ry-

どうp=j++<=n?ここでJavascriptがCのようであれば、動作するはずです。
ウゴレン

@ugoren:うまくいったようです、ありがとう!
mellamokb

2

正規表現(ECMAScript)、20バイト

^x?x?(?!(x+)(x\1)+$)

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

上記のバージョンはゼロを正しく処理しませんが、余分な1バイトしかかかりません。

^x?x?(?!(x+)(x\1)+$)x

追加のボーナスとして、ここでは1、1つ未満の素数、1つの2素数、および31つ以上の素数のリターンマッチを提供するバージョンがあります。

^x?x??(?!(x+)(x\1)+$)x

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


質問がそれについて話す範囲は「2 ^ 0と2 ^ 20の間」なので1..2 ^ 20なので0はありません
...-RosLuP

@RosLuPこれがまさに私の答えが20バイトであり、0を正しく処理しない理由です。質問の正確な仕様を超えて、質問の仕様に最小限に一致する回答とともに、より堅牢な回答を提供する価値があります。
デッドコード

時々私は同じことをします(「不要な」テストを書きます)が、これはコードゴルフの考え方に反するようで、それらを書く人は「深刻」とは見なされません
...-RosLuP

1
@RosLuPしかし、最小の答えを主たる答えとして与える限り、害は何ですか?そして、実際にそのように考えている人々の例を挙げることができますか?堅牢なものとして唯一の答えを与えた場合、それを理解できましたが、私はそうしていません。
デッドコード

1

C#、96

trueの場合は-1,0,1を返し、それ以外はfalseを返します。

それを短くするための提案は素晴らしいでしょう!

int p(int q){var r=q-1;for(var i=2;i<r&r<q+2;i++){if(i==r-1)break;if(r%i==0)r+=i=1;}return r-q;}

拡張フォーム:

int p(int q){
    var r=q-1;
    for(var i=2;i<r&r<q+2;i++){
        if(i==r-1)break;
        if(r%i==0)r+=i=1;
    }
    return r-q;     
}

よくわかりませんが、を削除しif(i==r-1)break;forループの中央をからi<rに変更できると思いますi<r-1。82にダウンします
。– Ciaran_McCarthy

1

GolfScript:26

)0\{.:i,{i\%!},,2=@|\(}3*;

説明:最も内側のブロック {.:i,{i\%!},,2=@|\(}は、スタックの最上部より正確に2因子少ないかどうかをチェックすることにより、スタックの最上部が素数であるかどうかを判別します。次に、これをスタック上の2番目のアイテムと分離します。これは、プライムがまだ表示されているかどうかの状態を保持します。最後に、スタックの一番上にある数字を減らします。

入力をインクリメントし、prime-seen状態を初期化することから始め、ブロックを3回繰り返します。これは2回デクリメントしますが、インクリメントすることから始めたため、とをカバーn+1n-1ます。



1

CJam、12バイト

CJamはこの課題よりもはるかに若いため、この回答は緑色のチェックマークの対象にはなりません(これはランダムな回答に更新する必要があります)。しかし、これを実際にゴルフするのはとても楽しかったです-私は17バイトから始めてから、アプローチを完全に3回変更し、毎回1または2バイトを節約しました。

{(3,f+:mp:|}

これはブロックであり、CJamの関数に最も近いものであり、スタックに入力を期待し、スタックに1(真)または0(偽)を残します。

ここでテストしてください。

仕組みは次のとおりです。

(3,f+:mp:|
(          "Decrement the input N.";
 3,        "Push an array [0 1 2].";
   f+      "Add each of those to N-1, to get [N-1 N N+1].";
     :mp   "Test each each element for primality, yielding 0 or 1.";
        :| "Fold bitwise OR onto the list, which gives 1 if any of them was 1.";

1

F#、68バイト(非競合)

let p n=Seq.forall(fun x->n%x>0){2..n-1}
let m n=p(n-1)||p n||p(n+1)

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

これが、私がコードゴルフが好きな理由です。私はまだF#に非常に精通していますが、言語がどのように機能し、この種の課題から何ができるかについて多くを学びます。


なぜ競合しないのですか?
NIT

1
2012年に質問された頃ではなかったF#で何かを使用しているかどうかわからないからです。しかし、私は生計のための製薬ソフトウェアを書いています。パラノイアは健康です。;)
Ciaran_McCarthy

1
ウィキペディアでF#のバージョンテーブル。必要なバージョンによっては、質問よりも古い場合があります。



1

Java 8、83バイト

n->n==1|p(n-1)+p(n)+p(n+1)>0int p(int n){for(int i=2;i<n;n=n%i++<1?0:n);return--n;}

true/ falseをtrue / falsey値として返します。

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

説明: "

n->                    // Method with integer parameter and boolean return-type
  n==1                 //  Return whether the input is 1 (edge-case)
  |p(n-1)+p(n)+p(n+1)>0//  Or if the sum of `n-1`, `n`, and `n+1` in method `p(n)` is not 0

int p(int n){          // Separated method with integer as both parameter and return-type
  for(int i=2;i<n;     //  Loop `i` in the range [2, `n`)
    n=n%i++<1?         //   If `n` is divisible by `i`
       0               //    Change `n` to 0
      :                //   Else:
       n);             //    Leave `n` as is
                       //  (After the loop `n` is either 0, 1, or unchanged,
                       //   if it's unchanged it's a prime, otherwise not)
  return--n;}          //  Return `n` minus 1

したがってint p(int n)-1for n=0および非素数になり、n-1for n=1または素数になります。p(0)+p(1)+p(2)-1+0+1 = 0falseを返すため(2素数であるにもかかわらず)、n=1このアプローチを使用するエッジケースです。


分離メソッドのない単一ループは85バイトになります

n->{int f=0,j=2,i,t;for(;j-->-1;f=t>1?1:f)for(t=n+j,i=2;i<t;t=t%i++<1?0:t);return f;}

1/ 0をtrue / falsey値として返します。

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

説明:

n->{              // Method with integer as both parameter and return-type
  int f=0,        //  Result-integer, starting at 0 (false)
      j=2,i,      //  Index integers
      t;          //  Temp integer
  for(;j-->-1;    //  Loop `j` downwards in range (2, -1]
      f=          //    After every iteration: Change `f` to:
        t>1?      //     If `t` is larger than 1 (`t` is a prime):
         1        //      Change `f` to 1 (true)
        :         //     Else:
         f)       //      Leave `f` the same
    for(t=n+j,    //   Set `t` to `n+j`
        i=2;i<t;  //   Inner loop `i` in the range [2, t)
      t=t%i++<1?  //    If `t` is divisible by `i`:
         0        //     Change `t` to 0
        :         //    Else:
         t);      //     Leave `t` the same
                  //   (If `t` is still the same after this inner loop, it's a prime;
                  //   if it's 0 or 1 instead, it's not a prime)
  return f;}      //  Return the result-integer (either 1/0 for true/false respectively)


0

R、68文字

f=function(n){library(gmp);i=isprime;ifelse(i(n-1)|i(n)|i(n+1),1,0)}

使用法(TRUEの場合は1、FALSEの場合は0):

f(7)
[1] 1
f(8)
[1] 1
f(15)
[1] 0

1
Rがどのように機能するかはよくわかりませんが、i(n-1)|i(n)|i(n+1)代わりにできますifelse(i(n-1)|i(n)|i(n+1),1,0)か?
Ry-

あなたは正しい:g = function(n){library(gmp); i = isprime; i(n-1)| i(n)| i(n + 1)}-56文字まで!;-)
パオロ

0

C ++

k=3;cin>>i;i--;
while(k)
{l[k]=0;
  for(j=2;j<i;j++)
   if(!(i%j))
     l[k]++;
  k--;
  i++;
}
if(!l[1]|!l[2]|!l[3])
     cout<<"1";
else cout<<"0";

CodeGold.SEへようこそ。他の回答を見ると、[code-golf]の質問への回答に使用される一般的な形式に気付くでしょう。あなたもあなたの答えにそれを適用したいかもしれません。
dmckee

0

Q、43文字 36

{any min each a mod 2_'til each a:x+-1 0 1}
{any(min')a mod 2_'(til')a:x+-1 0 1}

0

J、16文字

   (_2&<@-4 p:]-2:)

   (_2&<@-4 p:]-2:) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1


0

ルビー、47文字、非常に読みやすい

require'Prime'
f=->x{[x-1,x,x+1].any? &:prime?}

0

C ++ 97

ウゴレンは賢い解決策に私を打ち負かしたようです。したがって、彼はループ3回アプローチの短めのバージョンです。

P(int k){int j=1;for(int i=2;i<k;){j=k%i++&&j;}return j;}
a(int b){return P(b)|P(b+1)|P(b-1);}

0

Forth(gforth)、104バイト

: p dup 1 > if 1 over 2 ?do over i mod 0> * loop else 0 then nip ;
: f dup 1- p over 1+ p rot p + + 0< ;

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

説明

プライムチェック(p)

dup 1 > if          \ if number to check if greater than 1
   1 over 2 ?do     \ place a 1 on the stack to act as a boolean and loop from 2 to n
      over i  mod   \ take the modulo of n and i
      0> *          \ check if greater than 0 (not a divisor) and multiply result by boolean
   loop             \ end the loop, result will be -1 if no divisor was found (prime)
else                \ if n is less than 2
   0                \ put 0 on the stack (not prime)
then                \ end the loop
nip                 \ drop n from the stack

主な機能(f)

dup 1- p             \ get n-1 and check if prime
over 1+ p            \ get n+1 and check if prime
rot p                \ rotate stack to put n on top and check if prime
+ + 0<               \ add the three results and check if less than 0 (at least 1 was prime)


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