Piの素数を見つける


30

プライムはどこにでもあります...

彼らはPiの中に隠れます

3.141592653 58979 3238 462643 3832 795028841 971693993751

それらの素数を取得しましょう!

チャレンジ

入力としてintegerが与えられるとn>0、の最初のn桁の内側に隠されている素数を見つけますPi

以下のためにn=3我々は素数を検索しなければなりません[3,1,4]。プライムは2つある(3,31)ため、コードは2
For を出力する必要n=10[3,1,4,1,5,9,2,6,5,3]あります。最初の10桁は出力され、隠されていた(そして見つかった!)12ため、コードが出力[2, 3, 5, 31, 41, 53, 59, 653, 4159, 14159, 314159, 1592653]されます。

テストケース

入力->出力

1->1  
3->2  
13->14  
22->28  
42->60  
50->93

150->197  
250->363  
500->895

ルール

あなたのコードが可能でなければならないため、少なくともすべての素数を見つけるn=50
あなたがすることができ、はい、最初の50桁ハードコーディングPi場合のように
エントリは答えをハードコーディングを無効です

これはです。バイト単位での最短の回答が勝ちです!


6
「必要に応じて、Piの最初の50桁をハードコードできます」。最初の問題は解決しました!今、最大50桁の整数でのゴルフの素数テストのために... O_o(これは素晴らしい挑戦ですが、堅実な数学の組み込みまたはライブラリがおそらく必要です。)
Arnauld

3
@totallyhuman OEISでもまだそのシーケンスはありません!名声を得るための時間ですか?
-Sanchises

3
最初の50個の値のハードコーディングを許可するIMOは、この課題に有害です。この課題は、基本的に2つの部分で構成されています。1)最初の50個の値を圧縮するか、2)実際に課題を実行します。
JAD

2
通常、計算が難しく/遅く/メモリ集約的になるこの種の課題では、任意のカットオフを設定してハードコーディング許可する代わりに、プログラムが理論的に機能するのに十分です。
JAD

3
@BillSteihnいくつかの回答があった後にルールを更新することは、このWebサイトの精神に反します。この質問をSandboxに投稿しましたか?あなたは、ハードコードの答えがでてくるだろうと本当に早いフィードバックがあっただろう。
オリヴィエ・グレゴワールに

回答:


20

05AB1E 10  8 バイト

-2バイト、Adnanのおかげ(pベクトル化)

<žsþŒÙpO

オンラインでお試しください!(n = 98413までは動作しますが、n = 50の場合でも、このような多数の素数をテストする必要があるため、非常に遅くなります。n= 50の場合、TIOは60秒でタイムアウトします。)

どうやって?

<žsþŒÙpO - implicitly push input, n
<        - decrement = n-1
 žs      - pi to that many decimal places (i.e. to n digits)
   þ     - only the digits (get rid of the decimal point)
    Π   - all sublists
     Ù   - unique values
      p  - is prime? (vectorises) 1 if so, 0 otherwise
       O - sum
         - implicitly print the top of the stack

<žsþŒÙpO8バイトのために働く必要があります
アドナン・

ああ、pありがとうございます!
ジョナサンアラン

2
はい!最後に、私が実際に理解している非常に短いコードのゴルフの答え!:D
ファビアンレーリング

11

Mathematica、76バイト

Tr[1^Union@Select[FromDigits/@Subsequences@#&@@RealDigits[Pi,10,#],PrimeQ]]&

ああ、フェアではない、私はMathematicaゴルフに精通していない。:P(+1)
完全に人間

@totallyhuman同時に投稿しました。これはとても奇妙です!
J42161217

私はいくつかの構文上のトリックを使用して答えをゴルフしましたが、以前使用した機能はそのままにしました。気にしないでください。
完全に人間

Tr[1^...]これはリストの長さを見つける賢い方法です、いいですね!
-numbermaniac

6

Mathematica、104 97 90バイト

Length@DeleteDuplicates@Select[FromDigits/@Subsequences@First@RealDigits[Pi,10,#],PrimeQ]&

ハハハハ、私はなんとかこの作品を作ることができました。Mathematicaの使い方がわかりません。XD

入力:

[50]

1
あなたは私の数秒先に投稿しました。私たちの答えは非常に似ています!+1
J42161217

投稿した数字について確かですか(数字の丸めを再確認してください)Pythonとsympyを使用する
ジョナサンアラン

@JonathanAllan 50 96OPは、50桁には93の素数が含まれているため、Sympyの精度がオフになる可能性があると言っています。
完全に人間

@JonathanAllan Sympyは確率的または決定論的な素数性テストを使用していますか?(MathematicaのPrimeQのために同じ質問。)
アルノー

@Arnauldの良い点、わかりません。
ジョナサンアラン

3

Pythonの3274の 237 207 194 189バイト

ウィートウィザードのおかげで-37バイト!Mr.Xcoderのおかげで-14バイト。

piの最初の50桁をハードコードしますが、それ以外はすべて手動で計算します。

x=int(input());l="31415926535897932384626433832795028841971693993751"[:x]
print(sum(all(i%m for m in range(2,i))for i in{int(i)for w in range(x)for i in[l[j:j-~w]for j in range(x-w)]}-{1}))

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



l=list("31415...)40文字まで保存する必要があります。そして、その変更によりmap(str,i)、単にに置き換えることができますi
-AShelly


奇妙なコードを削除して195バイト
ミスターXcoder

宣言による194バイトlen(l)
Mr. Xcoder

1

R、156 123バイト

cat(cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))[scan()])

非常に興味深いソリューション。適切なものに取り組んでいます。

@Giuseppeのおかげで33バイト節約されました。

R(+数字とgmp)、198バイト

function(n,x=unique(gmp::as.bigz(unlist(sapply(1:n,function(x)substring(gsub("[.]","",numbers::dropletPi(50)),x,x:n))))))min(length(x),sum(sapply(sapply(x[x>0&!is.na(x)],gmp::factorize),length)==1))

適切なソリューション。テイクn、入力として。

numbers::dropletPi(50)piの最初の50の小数点以下を生成するために使用します。gsub小数点を削除します。substringpiのすべての可能な部分文字列(サプライズ驚き)を取りnます。

返されたリストはフラット化され、gmpbigz形式に変換されます。この形式は、長さ50の整数を格納するために必要ですunique。そのベクトルの一意の値を取ります。この結果はに保存されxます。

次に、素数性をチェックします。これには注意が必要です。エッジケースとイライラがたくさんあるからです。

  • high nには、0piがあります。これにより、先行ゼロの部分文字列が作成されます。削除する必要があるsをas.bigz生成NAします。

  • 同様の注意で、部分文字列"0"がクラッシュしますgmp::factorizeするため、同様に削除する必要があります。

  • 。それ自体は大丈夫ですが、の表現は反復可能であるため、混乱して16の素数を報告します。このために、ベクトルの長さの最小値とその中の素数を取ります。n=1x = 3bigz3sapplyx

  • gmp::isprime多数を確実に処理できるとは思えません。したがって、代わりに使用gmp::factorizeして、出力の長さが1であることを確認します。

したがって、全体で0NAから削除しxます。すべてを因数分解xし、長さをチェックします。の出現回数をカウントし、1を返しますmin(occurences, length(x))


そこにいる!ここで、誰かがもっと面白い解決策でこれを打ち負かすことができるかどうか見てみましょう。あなたかもしれません!

cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))123バイトのベクトルの代わりに使用:)
ジュゼッペ

@ジュゼッペいいね。その「圧縮」は間違いなく合法的なソリューションを打ち負かすでしょう。
JAD

Rには32ビット整数しかなく、これは確かに50桁の整数を表さないため、ハードコーディングまたは別のパッケージを導入しないとRでは不可能だと思います。
ジュゼッペ

1
Yeah, I may think about this some more as well. 82 hardcoded bytes
Giuseppe

0

Jelly, 59 32 bytes

-27 bytes thanks to Erik the Outgolfer.

“!⁶⁷¬,6½ạEC.wʠ€Ẉ!+Ẉfṭ¡’Ṿḣ³ẆVQÆPS

Try it online!

Explanation

“...’Ṿḣ³ẆVQÆPS

“...’           compressed string that evaluates to first 50 digits of pi (314159...)
     Ṿ          uneval; stringify
      ḣ³        first n characters of the string where n is the first command-line argument
        Ẇ       all sublists
         V      convert all elements to integers
          Q     deduplicate
           ÆP   convert all prime elements to 1 and others to 0
             S  sum

Why did you spam this with answers?
Zacharý

Because nobody else was answering, and I hit rep cap anyways. :P
totallyhuman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.