100万未満の素数のリスト


56

これは私の最初のコードゴルフの質問であり、非常に簡単な質問です。コミュニティガイドラインに違反した可能性がある場合は、事前に謝罪します。

タスクは、100万未満のすべての素数を昇順で印刷することです。出力形式は、出力の行ごとに1つの数字にする必要があります。

目的は、ほとんどのコードゴルフの提出と同様に、コードサイズを最小限にすることです。ランタイムの最適化もボーナスですが、副次的な目的です。


12
これは、正確な複製ではないが、それは基本的に既存の質問の数の構成要素であるだけで素数判定テスト、(例えばあるcodegolf.stackexchange.com/questions/113codegolf.stackexchange.com/questions/5087codegolf.stackexchange。 com / questions / 1977)。FWIWは、(さらに良く知っておくべき人で)十分に続かない1つの指針は、メタサンドボックスに質問を事前に提案することであるmeta.codegolf.stackexchange.com/questions/423それがいかにの批判や議論のために人々がそれに答え始める前に改善されました。
ピーターテイラー

ああ、はい、私はこの質問が既に存在する素数関連の質問のあまりにも似ていることを心配していました。
デランアザバニ

2
@ GlennRanders-Pehrsonなぜなら10^6、もっと短いからです;)
ɐɔıʇǝɥʇuʎs14年

1
数年前、私はCで68文字だけの素数を印刷するIOCCCエントリを提出しました-残念ながら、100万をはるかに下回っ
Computronium

1
@ɐɔıʇǝɥʇuʎsどうですか1e6:-D
タイタス

回答:


33

Mathematica17 24

比較のためだけに:

Prime@Range@78498

コメントで述べたように、1行につき1つの素数を提供できませんでした。補正:

Column@Prime@Range@78498

4
Prime~Array~78498また17 :)
チャノグ14年

リリースされる場合、mthmcaでは9バイトになります。
マイケルスターン

これは、出力の行ごとに1つの素数の条件に違反します。で修正された長いリストの出力を防ぐための接頭辞Print/@と終了で、8文字余分にコストがかかります。;Null
celtschk

@celtschk 5年前にそれを見逃したか無視したかはわかりません。
ミスターウィザード

1
まあ、私は間違いなく5年前からだったことを逃した:
celtschk

27

Python 3、46バイト

k=P=1
while k<1e6:P%k and print(k);P*=k*k;k+=1

ループがテストkに到達するまでに、二乗要因を繰り返し計算しましたP=(k-1)!^2kが素数である場合、積は表示され1 * 2 * ... * (k-1)ないため、の要因ではありませんP。しかし、それが複合材料である場合、その主な要因はすべて製品内で小さくなります。平方は、実際k=4にはプライムと呼ばれるのを止めるためにのみ必要です。

より強く、ウィルソンの定理から、いつkが素数であるかP%kはに等しいことがわかり1ます。ここで必要なのはゼロ以外の値だけですが、一般的にP%kは、それkが素数であるかどうかの指標変数です。


23

C、61文字

ほぼ正確に同じこの1(質問があまりにもほとんど同じです)。

n=2;main(m){n<1e6&&main(m<2?printf("%d\n",n),n:n%m?m-1:n++);}

ガットSEG-FAULT印刷後881
manav mnの

7
@Manav、おそらく最適化なしでコンパイルしました。再帰を削除する優れたオプティマイザーに依存しています。
ウゴレン14

4
はい、追加-O3gccて問題を解決しました!!
manav mn 14

この方法は非常識です。大好きです。
トッドリーマン

2
57バイトを取得できますn=2;main(m){n<1e6&&main(m<2?printf("%d\n",n),n:m-++n%m);}
アルバートレンショー

22

MATLAB (16)(12)

残念ながら、これは1行で出力します。

primes(1000000)

しかし、それは単純な行列転置によって解決されます。

primes(1000000)'

そして、コメントで示唆されているように、指数表記を使用していくつかの文字を切り取ることができます:

primes(1e6)'

5
ここでも1e6代わりに使用すると1000000役立ちます。
オリオン

その11文字になるだろう@orion
Axoren

含まれていません@Axoren '終わりに
スタン・ストラム

20

バッシュ(37文字)

seq 2 1e6|factor|sed 's/.*: //g;/ /d'

(60文字)

seq 2 1000000|factor|sed -e 's/[0-9]*: //g' -e '/^.* .*$/ d'

私のコンピューター(2.0 GHz CPU、2 GB RAM)では14秒かかります。


これはに改善することができる: seq 2 1000000|factor|sed 's/[0-9]*: //g;/^.* .*$/ d'
Delan Azabani

はい、あなたが正しい。私はゴルフではなく、クリーンなsedコマンドを書きました:P
saeedn

3
seq 1e6|factor|awk '$0=$2*!$3'少し短いです。
デニス14

1
seq、factor、およびsedは外部プログラムです。これはc p、cがcatへのシンボリックリンクであり、pが100万までの素数を持つテキストファイルである場合もあります。シェル組み込みコマンドで実行できますか?
テクノサウルス

7
@technosaurus seqfactorはにcoreutilsあるので、正当です。sedかなり遍在しています。 coreutils組み込みのように扱うことができます。coreutilsを使用しないBashは、STLを使用しないC ++に似ています。

16

J、21文字

1[\p:i.(_1 p:1000000)

に短縮することができます

1[\p:i.78498

1000000未満の素数がわかっている場合。


2
,.文字を保存するために、1 [\\ではなくenfileアイテムを使用します。不要な括弧を削除し、指数表記を使用します1e6
オマー

これに,.i.&.(p:^:_1)1e6気付いた:(@Omarの提案を適用した後)短くはないが、私はunderの使用が面白いことに気付いた。
kaoD

10

PowerShell、47 44バイト

非常に遅いが、私が思いつくことができる最短。

$p=2..1e6;$p|?{$n=$_;!($p-lt$_|?{!($n%$_)})}

PowerShell、123バイト

これははるかに高速です。最適とはほど遠いが、効率と簡潔さの間の良い妥協点。

 $p=2..1e6;$n=0
 while(1){$p=@($p[0..$n]|?{$_})+($p[($n+1)..($p.count-1)]|?{$_%$p[$n]});$n++;if($n-ge($p.count-1)){break}}
 $p


9

バッシュ、30バイト

saeednは私の提案(彼のアプローチよりも短くて速い)に基づいて行動しないので、私は自分の答えを投稿したいと思いました。

seq 1e6|factor|awk '$0=$2*!$3'

使い方

seq 1e6

最大1,000,000までのすべての正の整数をリストします。

factor

それらを一つずつ因数分解します。最初の10の出力は次のとおりです。

1:
2: 2
3: 3
4: 2 2
5: 5
6: 2 3
7: 7
8: 2 2 2
9: 3 3
10: 2 5

最後に、

awk '$0=$2*!$3'

行全体($0)を2番目のフィールド(最初の素因数)と3番目のフィールドの論理否定の積に変更します(1それが1つの素因数以下の0場合)。

これにより、素数に対応する行が数値自体に置き換えられ、他のすべての行がゼロに置き換えられます。awkは真理値のみを出力するため、素数のみが出力されます。


4
awk '$0=$2*!$3'かっこいい!
イエティ

8

ルビー50 41

require'mathn'
p (2..1e6).select &:prime?

2
Enumerableには既に含ま.to_aいるため、必要はありませんselect。また、Symbol#to_procの短縮表記を使用して、さらに短縮することもできます。p (2..1e6).select &:prime?(1は素数ではありません)
-Ventero

@Venteroどうもありがとう!Symbol#to_procについては知りませんでした。Rubyが提供するショートカットにもっと注意を払わなければなりません。
クリスチャンルパスク

2
短いバージョンrequire'prime';p Prime.take 78498
-Hauleth

よろしくお願いします!それは非常に異なるので、別の回答として投稿できると思います。
クリスティアンルパスク

古き良き「田舎の少年mathn」を上手に利用
DoctorHeckle

8

バッシュ、37

できればもっとゴルフします...

このほとんどは、factorの厄介な出力形式を解析しようとしています。

seq 1e6|factor|grep -oP "(?<=: )\d+$"

私のマシンで5.7秒ほどで完了します。

(たまたま私の投稿が2ページ目の回答の最初のページであったため、だれもそれを見ることはありません...)

古いソリューション

これは長く、遅くなります(10秒かかります)。

seq 1e6|factor|egrep ':.\S+$'|grep -oE '\S+$'

2
うわー-私はfactor前に出会ったことはありませんが、coreutilsにあります!
デジタル外傷

1
:1つの文字剃り落とすseq 1e6|factor|grep -oP "(?<=: )\d+$"のperl-はgrepの後読みで
デジタルトラウマ

@DigitalTraumaその仕事どうするか

1
-Pperlスタイルの正規表現を有効にします。 (?<=: )ある正の後読み文字列の「:」。基本的に、これは「:」\d+$が一致するものの前に来る必要がありますが、実際には一致の一部ではないため、-oオプションはコロンの後に一致する数字を1つだけ与えます。
デジタル外傷

@DigitalTrauma追加

8

Python 3.x:66文字

for k in range(2,10**6):
 if all(k%f for f in range(2,k)):print(k)

より効率的なソリューション:87文字

エラトステネスのふるいに基づいています。

p=[];z=range(2,10**6)
while z:f=z[0];p+=[f];z=[k for k in z if k%f]
for k in p:print(k)

1
最初のものは誤って印刷01ます。代わりにを使用して、これを修正できますrange(2,10**6)。また、ifステートメントはoutとは別の行にあるfor必要があります。そうしないと、エラーが発生します。
xnor

@xnor:それを修正しました。
dan04 14

8

ハスケル、51

mapM print [n|n<-[2..10^6],all((>0).rem n)[2..n-1]]

あなたは変更することができますmapM_mapM、戻り値は印刷されませんが、これはコードのゴルフです。;)
ドグバート

印刷後に(> 0)に余分なスペースがあるのはなぜですか?
誇りに思ってhaskeller 14

ナイスキャッチ!感謝
pt2121

999999を10 ^ 6に置き換えることができます。また、バイトカウントを更新してください-63は正しくない可能性があります。
user2845840

@ user2845840わかった、ありがとう。良いアイデア!
pt2121

8

APL、15

p~,p∘.×p←1↓⍳1e6

私の通訳はメモリの問題に遭遇しましたが、理論的には機能します。


どうやって?デスクリプションをお願いできますか?
ラスマスダンガードニールセン

行ごとに1つの番号を作成するために前にが必要であり、を必要としません,
アダム

@RasmusDamgaardNielsen は最初の整数です。1↓最初のものをドロップします。p←pに割り当てます。p∘.×p乗算表を作成します。p~pから右側にあるものをすべて削除します。(,必要ではありません。テーブルをリストに分解します。)
アダム

8

Perl、49バイト

正規表現のカンフー:)

for(1..1E6){(1x$_)=~/^(11+?)\1+$/ or print"$_\n"}

ゴルフされていないバージョン:

for(1 .. 1_000_000) { 
    (1x$_) =~ /^(11+?)\1+$/ or print "$_\n";
}

この投稿を入力している間、10%も進歩していません!

正規表現のソース:http : //montreal.pm.org/tech/neil_kandalgaonkar.shtml


2
perl6バージョンを書くようになりました。また、1000000書くことができます10**6
パボ14

1
また、1000000は1E6と書くことができます
mob

私の答えを更新しました。おかげ@mob
Gowtham

常に私のお気に入りの正規表現でしたが、大きな数字を取得すると、巨大な数字を単項に変換しているという事実のため、それが劇的に失敗することを覚えておく必要があります。この正規表現は、言語(およびご使用のマシン)の構成によっては、数十万以上の素数を見つけるために機能しない場合があります
。– Codefun64

7

ジュリア、11

primes(10^6)

ビルトインが賛成票を獲得しているように見えますが、さらに長い回答を得るにはもっと言葉が必要でした。


7

J(15または9)

私はこれがMathematicaを破ったとは信じられません(たとえそれがたった1文字x 2文字であっても)

a#~1 p:a=:i.1e6

または:

p:i.78498

1
... The output format should be one number per line of output.それが私の答えがで始まる理由1[\ です。
ガレス

6

gs2、5バイト

CP437でエンコード:

∟)◄lT

1C 29100万プッシュ、11 6C以下の素数、54ショーラインです。


5

GolfScript、22/20(20/19)バイト

n(6?,:|2>{(.p|%-.}do:n

速度を犠牲にして、コードを2バイト短くすることができます。

n(6?,:|2>.{|%2>-}/n*

編集された質問で指定された出力形式を無視する場合(これは既存の回答の多くが行うことです)、高速バージョンでは2バイト、低速バージョンでは1バイトを保存できます。

n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`

これは、高速バージョンの素数の後に追加のLFを出力し、低速バージョンの素数を配列として出力します。

使い方

両方のバージョンは、エラトステネスのふるいの実装です。

高速バージョンは次のことを行います。

  1. 設定A = [ 2 3 4 … 999,999 ]| = [ 0 1 2 … 999,999 ]ます。

  2. 設定N = A[0]して印刷しますN

  3. からすべてのN番目の要素を収集|Cます。これらはの倍数ですN

  4. 設定しA = A - Cます。

  5. A空でない場合は、2に戻ります。

n(6?   # Push "\n".pop() ** 6 = 1,000,000.
,:|    # Push | = [ 0 1 2 … 999,999 ].
,2>    # Push A = [ 2 3 4 … 999,999 ].
{      #
  (    # Unshift the first element (“N”) of “A”.
  .p   # Print “N”.
  |%   # Collect every N-th element from “A” into a new array, starting with the first.
  -    # Take the set difference of “A” and the array from above.
  .    # Duplicate the set difference.
}do    # If the set difference is non-empty, repeat.
:n     # Store the empty string in “n”, so no final LF will get printed.

スローバージョンも同様の方法で機能しますが、最小「A」の倍数(常に素数)を連続して削除する代わりに、1,000,000未満のすべての正の整数の倍数を削除します。

競争力

素因数分解またはチェックする組み込み数学関数がない場合、すべてのGolfScriptソリューションは非常に大きいか、非常に非効率的です。

まだ効率的とはほど遠いですが、私はまともな速度対サイズ比を達成していると思います。提出時点では、このアプローチは前述の組み込みのいずれも使用していないアプローチの中で最も短いようです。私が言っているようだ、私は答えの一部がどのように機能するか分からないので...

提出された4つのGolfScriptソリューションすべてをベンチマークしました:w0lf(トライアル部門)、他の回答(Wilsonの定理)、およびこの回答の2つ。これらは結果でした:

Bound     | Trial division     | Sieve (slow)       | Wilson's theorem | Sieve (fast)
----------+--------------------+--------------------+------------------+----------------
1,000     | 2.47 s             | 0.06 s             | 0.03 s           | 0.03 s
10,000    | 246.06 s (4.1 m)   | 1.49 s             | 0.38 s           | 0.14 s
20,000    | 1006.83 s (16.8 m) | 5.22 s             | 1.41 s           | 0.38 s
100,000   | ~ 7 h (estimated)  | 104.65 (1.7 m)     | 35.20 s          | 5.82 s
1,000,000 | ~ 29 d (estimated) | 111136.97s (3.1 h) | 3695.92 s (1 h)  | 418.24 s (7 m)

「遅い」ふるいはエラトステネスの単なるふるいですか?
ドルカハン

両方です。遅いバージョンは、ひどい実装です。
デニス

5

NARS2000 APL、7文字

⍸0π⍳1e6

3
プログラミングパズルとコードゴルフへようこそ!
デニス

4

Golfscript 26 25 24

編集(ピーターテイラーのおかげでもう1つの文字を保存):

10 6?,{:x,{)x\%!},,2=},`

古いコード:

10 6?,{.,{)\.@%!},,2=*},`

このコードは、信じられないほど遅く、非効率的であるため、理論的な価値しかありません。実行には数時間かかると思います。

あなたがそれをテストしたいなら、例えば100までの素数だけを試してください:

10 2?,{:x,{)x\%!},,2=},`

で置き換えること\;でキャラクターを保存できます*。(また、最初の除数を見つけるのではなく、それらのすべてで現在の文字カウントのためにはるかに高速に取得することができます:10 6?,2>{.),2>{1$\%!}?=},`
ピーター・テイラー

@PeterTaylorありがとう、乗算を使用すると非常に巧妙なトリックがあります。
クリスチャンルパスク

変数と1つの以上のcharの節約があります:交換する.,:x,して\.@x\ (空白があるため、コメントにMDの問題をエスケープするのである)、および削除します*
ピーターテイラー14

@PeterTaylor良いもの、ありがとう!コードを編集しました。
クリスチャンルパスク14

4

CJam-11

1e6,{mp},N*

1e6,-0〜999999の配列
{mp},-プライムを選択
N*-改行で結合


1
CJamはこの質問よりも最近ではありませんか?
ピーターテイラー

@PeterTaylorああ、はい、それはある
aditsu

4

GolfScript、25(24)バイト

!10 6?,2>{.(@*.)@%!},n*\;

編集された質問で指定された出力形式が無視される場合、1バイトを保存できます。

!10 6?,2>{.(@*.)@%!},`\;

これにより、プライムは1行に1つではなく、配列として(他の多くのソリューションと同様に)印刷されます。

使い方

一般的な考え方は、使用することですウィルソンの定理と述べ、nは > 1が素数であるとし、場合にだけ

                                                      (n-1)! = -1(mod n)

!     # Push the logical NOT of the empty string (1). This is an accumulator.
10 6? # Push 10**6 = 1,000,000.
,2>   # Push [ 2 3 4 … 999,999 ].
{     # For each “N” in this array:
  .(  # Push “N - 1”.
  @   # Rotate the accumulator on top of the stack.
  *   # Multiply it with “N - 1”. The accumulator now hold “(N - 1)!”.
  .)  # Push “(N - 1)! + 1”
  @   # Rotate “N” on top of the stack.
  %!  # Push the logical NOT of “((N - 1)! + 1) % N”.
},    # Collect all “N” for which “((N - 1)! + 1) % N == 0” in an array.
n*    # Join that array by LF.
\;    # Discard the accumulator.

ベンチマーク

トライアル部門よりは速いが、エラトステネスのふるいよりは遅い。私の他の答えをご覧ください。


4

Java、110バイト

void x(){for(int i=1;i++<1e6;)System.out.print(new String(new char[i]).matches(".?|(..+?)\\1+")?"":(i+"\n"));}

素数性テストとして正規表現による単項除算を使用します。


1
いいアプローチ。前にそのプライム正規表現を見たことがない。私から+1。ただし、ネストされたforループをプライムチェックに使用する方が若干短くなります。:)
ケビンクルーイッセン

3

C、91 88 85 82 81 80 76 72文字

main(i,j,b){for(;i++<1e6;b++&&printf("%d\n",i))for(j=2;j<i;)b=i%j++&&b;}

アルゴリズムはひどく非効率的ですが、コードゴルフをしているので問題ではありません。


1
簡単に短縮できます:main(i,j,b){for(;i++<1e6;b++&&printf("%d\n",i))for(j=2;j<i;)b=i%j++&&b;}または、このようなアイデア(実際にコンパイルしなかったため)
-Ali1S232

どうしてi0になるのでしょうか?私はあなたが提供する場合は、と思うの任意の引数を、それは失敗します。また、j何らかのタイプのエラーがあると思います。しかし、よくわかりませんb
エリックアウトゴルファー16

3

Mathematica 25

10 ^ 6未満の素数の数がわからないと仮定します。

Prime@Range@PrimePi[10^6]

3

J、16文字

1]\(#~1&p:)i.1e6

出力形式の要件がなければ、これは13文字に減らすことができます。

(#~1&p:)i.1e6

1]\ ランク1の素数の配列を取得し、それをランク2の配列に変換し、各素数を独自の行に配置します。したがって、インタープリターのデフォルトの出力形式は、1行のリストを1行につき1つの素数に変換します。

(#~ f) yは基本的にfilter、のf各要素のブール値を返しますyi.1e6は整数の範囲[0,1000000)であり1&p:、素数に対して1を返すブール関数です。


3

R、45 43文字

for(i in 2:1e6)if(sum(!i%%2:i)<2)cat(i," ")

2から1e6までの各数値xについて、0に等しいx mod 2からxの数が2未満の場合、単純に出力します。


このコードによって生成される最初の数は1ですが、1は素数ではありません。
スベンホーエンシュタイン

@SvenHohensteinありがとう、訂正。
プランナパス

3

バッシュ(433643)

私の(それほど賢くない)試みは、ファクターを使用して製品をファクタリングすることでした。

factor ${PRODUCT}

残念ながら、多数の製品はもちろん巨大です。また、実行に12時間以上かかりました。私はそれがユニークだと思ったので、私はそれを投稿することにしました。

完全なコードは次のとおりです。

6未満の素数であれば、それは合理的です。

  factor 30

まあ、私は試しました。


+1この答えは本当に悪魔的なものです。かなり事前に計算された結果ではなく(かなりの文字数を節約できます)、計算するのははるかにひどいです:)これfactorは、基本的な試行除算アルゴリズムよりも最適化されたパフォーマンスがはるかに悪い例です。
オリオン

3

C#、70

Enumerable.Range(1,1e6).Where(n=>Enumerable.Range(2,n).All(x=>x%n!=0))

長い間ここではあまり見ないでしょう...


これが間違っている理由はいくつかあります。(1)からに暗黙的に変換することはできませんdouble 1e6が、intではint必須ですRange。(2)内部には、Range最大でも取る必要がありn-2そうでないかをテストします、用語n % n明らかにしています0。(3)x%n必要なときに書き込みますn%x。これらの問題を修正すると、次のように機能します。Enumerable.Range(2,999999).Where(n=>Enumerable.Range(2,n-2).All(x=>n%x!=0))ただし、これでも数値は出力されません。要件は1行に1つでした。
スティグニールセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.