8675309までのn番目ごとの素数


8

混乱している場合は、こちらをお読みください。

チャレンジ:

このコードゴルフの目標は、数に基づいてい8675309ます...

目標は、2から8675309までのすべての素数を出力し、2から開始して、8つの素数をスキップし、6をスキップし、7をスキップすることです基本的に、次のシーケンス8675309。9に達したら8に循環します。

出力:

2
29

(8番目をスキップして10番目のプライムに到達)

59

(6番目をスキップして17番目のプライムに到達)

97

(7をスキップして25番目のプライムに到達)


例:(PHPのような疑似コードで、$primeはすべての素数を含む配列です。)

$tn=1;
$c=1;
$na=array(8,6,7,5,3,0,9);
l:
output($prime[$tn]);
if ($prime[$tn]>=8675309) {exit(8675309)};
$c+=1;
if ($c>=8) {$c=1};
$tn+=$na[$c];
goto l;

スキップと言うとき 8つの素数を、私は#1素数から#10素数に移動することを意味します(間にある8をスキップします)。

各番号は改行する必要があります。

0in 8675309に到達したら、何もスキップせずに次の素数を出力するだけです。

これはので、最短のコード(バイト単位)が優先されます。


2
固定出力を与えるだけですか?
Christian Sievers

1
100万チャレンジの素数リストに使用されている言語のいずれかのコードを使用して、100万を必要な数に変更できます。
trichoplax 2016

2
あなたの疑似コードはまだ説明よりも1つ少ないスキップをするようです、それ$c は早期に増加し、正確に8675309に達しない場合(そうですか?)、その値を超える最初の数値も出力します。
クリスチャンシーバーズ

1
ほとんどの課題には、準備が整う前に調整が必要なものがあります。今後のチャレンジのアイデアについては、投稿する前にフィードバックを得るためにサンドボックスが非常に役立つと思います。
trichoplax 2016

3
新しく追加されたルール:「シーケンスが上に来るかどうかに関係なく、出力の最後の行は8675209になるはずです。」私にはまったく適切ではないと感じます。IMOは、チャレンジに何も追加せず、OPが最初の計算で行ったエラーを偽装するためだけにあります。
zeppelin 2016

回答:


4

Mathematica 67バイト

ただし、8675309には到達しません。これに対するOPの意図が不明です。

Column@FoldList[NextPrime,2,Flatten@Array[{9,7,8,6,4,1,10}&,12937]]

1
素数にビルトインを使用しなかった場合は賛成票を投じます...
DepressedDaniel

7
これは私たちが話しているMathematicaです
Zwei

3

ワンダー、47バイト

P\tk582161P;(_>@(os tk1P;P\dp +1#0P))cyc8675309

おおおおお、これは時間が経つにつれてどんどん遅くなります...

説明

P\tk582161P;

無限素数リストから582161(素数<= 8675309)のアイテムを取り、P結果をとして再宣言しPます。

(_>@(...))cyc8675309

8675309の数字を無限に循環させ、結果のリストに対して時間をかけます。

os tk1P;P\dp +1#0P

の最初の項目を出力し、Pから要素をP削除して、cycle item + 1結果をとして再宣言しPます。この操作はP、takewhileの真理値としても機能します。リストが空/偽(8675309に達したことを意味する)の場合、循環リストからの取得を停止します。

より高速な実装(テスト用)

P\tk582161P;(_>@(os tk1P;P\dp +1#0P;#0))cyc8675309

まだ本当に遅いが、著しく速い。


3

ゼリー23 29 24 バイト

8675309を印刷するための要件を満たすための一時パッチの+6バイト
。これに対処するために、ゴルファー的ではあるが遅いアプローチに移行する-5バイト。

“⁹Ṁ:’©D‘ẋ“2Ṿ’R®ÆR¤ṁḢ€;®Y

TryItOnlineで実行するには遅すぎますが、ローカルで数分で実行され、その間にラインフィードを挟んで以下に示す数値が生成されます(以下の括弧内にスキップされた素数の数):

2, 29, 59, 97, 127, 149, 151, 199, 257, 293, 349, 383, 409, 419, ...
 (8) (6) (7) (5)  (3)  (0)  (9)  (8)  (6)  (7)  (5)  (3)  (0)

..., 8674537, 8674727, 8674867, 8675003, 8675053, 8675113, 8675137, 8675309
            (8)      (6)      (7)      (5)      (3)      (0)      (4)*

*最後は単にリストに追加されるため、4の有効なスキップのみです。

8675309の代わりに3659を使用するバージョンについては、ここをクリックしてください。4スキップの19セット(7の12937セットではなく)と3659(6の有効なスキップ)を追加したバージョンです。

どうやって?

“⁹Ṁ:’©D‘ẋ“2Ṿ’R®ÆR¤ṁḢ€;®Y - Main link: no arguments
“⁹Ṁ:’                    - base 250 number: 8675309
     ©                   - save in register
      D                  - convert to a decimal list: [8, 6, 7, 5, 3, 0, 9]
       ‘                 - increment: [9,7,8,6,4,1,10]
         “2Ṿ’            - base 250 number: 12937
        ẋ                - repeat: [9,7,8,6,4,1,10,9,7,8,6,4,1,10, ... ,9,7,8,6,4,1,10]
             R           - range (vectorises) [[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7], ...]
                 ¤       - nilad followed by link(s) as a nilad
              ®          - retrieve value from register: 8675309
               ÆR        - prime range [2,3,5,7, ... ,8675309]
                  ṁ      - mould the primes like the range list:
                               [[2,3,5,7,11,13,17,19,23],[29,31,37,41,43,47,53],...]
                   Ḣ€    - head €ach: [2,29,59,97,127,149,151,199, ..., 8675137]
                      ®  - retrieve value from register: 8675309
                     ;   - concatenate: [2,29,59,97,127,149,151,199, ..., 8675137, 8675309]
                       Y - join with line feeds
                         - implicit print

プログラムは、疑似コードのように、最後に8675309を出力する必要があります。
カスケードスタイルの

1
@ cascading-style OK、私は要件であるスペックから気づきませんでした(私はあなたの疑似コードを見るべきだったのです!)。私は今のところ素朴な方法でそれを修正しました、そしてこれをサイズを減らすためにある時点でメソッドを変更する可能性を見ていきます。
ジョナサンアラン

2

Ruby、121バイト

ファイルの終わりにある改行は不要で、スコアが付けられていません。

P=[]
(2..8675309).map{|c|s=1;P.map{|p|s*=c%p};P<<c if s!=0}
S=[9,7,8,6,4,1,10]*P[-1]
while y=P[0]
p y
P.shift S.shift
end

説明:Pは素数の配列です。c候補の素数です。sすべての小さい素数を法とする剰余の積です。そのような残差がゼロの場合(それcが複合であることを示します)、s)場合、ゼロになります(そしてとどまります)。

素数ジェネレータは遅いです。実行にはかなり時間がかかります。試験は置換することによって行われたP、より効率的な手段によって生成された配列(さえ分裂に特異的に、短絡を、そしてそれはまた、役立つ多くの平方根で停止試験のを)。


2

Haskell、122バイト

これは要求されるかもしれません:

s(a:b)=a:s[c|c<-b,c`mod`a>0]
f(a:b)(s:t)=a:f(drop s b)t
main=mapM print$takeWhile(<8675310)$f(s[2..])$cycle[8,6,7,5,3,0,9]

私は必要とされているどのように多くの数の事前計算、および交換することにより、いくつかのバイトを救うことができるtakeWhiletake。これにより、出力される最後の数値に関する決定にも適応できます。私のテストではごくわずかなメモリを使用して、すでに600000までの数値を出力しているため、すべての方法で使用できると思います。



3
彼らはランタイムに制限があるのでしょうか?たとえば、と置き換える86753108675、そこで機能します。そして、それは元の形で私のために機能します(コンパイルされ、最適化されて、なしでは試しませんでした)。最初のテストよりも遅い、より高速なマシンはすでに160万に達しています。
Christian Sievers

1
スタックスペースがオーバーフローします。大きなもので試してみます。代わりに、同じコードサイズになるより素朴な素数ジェネレータを使用できます。
Christian Sievers

2

Haskell、109バイト

(p:z)%(x:r)=print p>>(drop x z)%r
p%x=pure()
[n|n<-[2..8675309],all((>0).mod n)[2..n-1]]%cycle[8,6,7,5,3,0,9]

オンラインでお試しください!(に切り捨て8675309られます8675。それ以外の場合は、[ オンライン試す]でタイムアウトします

使用法:

* Main> [n | n0).mod n)[2..n-1]]%cycle [8,6,7,5,3,0,9]
2
29日
59
97
127
149
151
199
257
293
349
383
409
419
467
541
587
631
661
691
701
769
829
881
941
983
1013
...

2

Perl 6の 65の73  67バイト

$_=8675309;.[0].put for (2..$_).grep(*.is-prime).rotor(1 X+.comb)

(欠落しているため8675137を印刷できませんでした:partial

$_=8675309;.[0].put for ^$_ .grep(*.is-prime).rotor((1 X+.comb),:partial)
$_=8675309;.[0].put for ^($_+33) .grep(*.is-prime).rotor(1 X+.comb)

レンジの終わりを上にシフトする:partialことで、缶を取り除くことができます。

それを試してみてください(5秒の制限が追加された)仕上げ、それを参照してください。

最初の例は、52分41.464秒で計時されました。

拡張:

$_ = 8675309;

  .[0]              # get the first value out of inner list
  .put              # print with trailing newline

for                 # for every one of the following

  ^($_+33)          # the Range ( add 33 so that 「.rotor」 doesn't need 「:partial」 )
  .grep(*.is-prime) # the primes
  .rotor(
    1 X+ .comb      # (1 X+ (8,6,7,5,3,0,9)) eqv (9,7,8,6,4,1,10)
  )

rotor呼び出しの結果は次のシーケンスです

(
 (  2   3   5   7  11  13  17  19  23)     #  9 (8)
 ( 29  31  37  41  43  47  53)             #  7 (6)
 ( 59  61  67  71  73  79  83  89)         #  8 (7)
 ( 97 101 103 107 109 113)                 #  6 (5)
 (127 131 137 139)                         #  4 (3)
 (149)                                     #  1 (0)
 (151 157 163 167 173 179 181 191 193 197) # 10 (9)

 (199 211 223 227 229 233 239 241 251)     #  9 (8)
 (257 263 269 271 277 281 283)             #  7 (6)
 (293 307 311 313 317 331 337 347)         #  8 (7)
 (349 353 359 367 373 379)                 #  6 (5)
 (383 389 397 401)                         #  4 (3)
 (409)                                     #  1 (0)
 (419 421 431 433 439 443 449 457 461 463) # 10 (9)

 ...
)

いい答えです。完了するまでにどのくらいかかりますか?
カスケーディングスタイルの

1
@ cascading-style実行が完了するまで約53分かかります。:partial呼び出しの副詞を忘れた.rotor
ので、最後

1

Befunge、136バイト

p2>:1>1+:"~"%55p:"~"/45p:*\`!v
1+^<+ 1<_:#!v#%+g55@#*"~"g54:_\:!#v_1-\
p00%7+1: ,+64g00.:_^#!`***"'(CS":$<^0-"/"g4
>5g#*^#"~"g5<
8675309

オンラインでお試しください!、ただし、最後に到達するかなり前にタイムアウトになることに注意してください。私のローカルマシンでコンパイルされたバージョンは、10秒未満で完了します。

説明

素数性をテストするために、2からsqrt(n)までの範囲で繰り返し、nかどうかを確認しますがこれらの値のいずれかの倍数であるかます。そうでない場合は、素数です。このプロセスは、反復された値を一時的な「変数」に格納する必要があるという事実によって複雑になり、Befungeのメモリセルはサイズが限られているため、そのストレージを2つのセルに分割する必要があります。スキップされた素数を処理するには、ルックアップ「テーブル」(5行目で確認できます)を使用して、スキップする必要のあるさまざまな範囲を追跡します。

スペースを節約するために、さまざまなコードパス間でコマンドを共有するインターリーブコードが非常に多いため、コードの詳細な分析は行いません。これは、物事を理解するのをかなり難しくし、Befungeにまだ詳しくない人にとっては特に興味深いとは思いません。

出力例

2
29
59
97
127
149
151
199
...
8674397
8674537
8674727
8674867
8675003
8675053
8675113
8675137

1

Bash(+ coreutils)、 98、94バイト

編集:

  • 最適化された行フィルター1ビット、-4バイト

ゴルフ

seq 8675309|factor|grep -oP "^.*(?=: \S*$)"|sed 1b\;`printf '%d~45b;' {10,17,25,31,35,36,46}`d

テスト

>seq 8675309|factor|grep -oP "^.*(?=: \S*$)"|sed 1b\;`printf '%d~45b;' {10,17,25,31,35,36,46}`d| head -25
2
29
59
97
127
149
151
199
257
293
349
383
409
419
467
541
587
631
661
691
701
769
829
881
941

オンラインでお試しください!(N <1000に制限され、高速に実行されます)

フルバージョンは私のマシンで完了するまでに約15秒かかります。


coreutilsに「ファクター」を入れたのは誰か。
Jasen

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