プライム封じ込め番号(ゴルフ版)


21

これはシーケンスA054261です。

素数封じ込め番号番目は、第含ま最小数であるのサブストリングとして素数を。たとえば、番号は、サブストリングとして最初の3つの素数を含む最小の番号であり、3番目の素数格納番号になります。nn235

最初の4つの素数封じ込め番号があることを把握することは簡単です、、および、しかし、それはより面白いです。次の素数は11であるため、次の素数の包含番号はではありませんが、プロパティで最小の数として定義されているため、です。2232352357235711112357

ただし、11を超えると実際の課題が発生します。次の素数の包含番号はです。この数値では、部分文字列と が重複していることに注意してください。番号も番号と重複しています。1132571113313

次の番号は、その前にある番号のすべての基準を満たし、さらに1つのサブストリングを持つ必要があるため、このシーケンスが増加していることを証明するのは簡単です。ただし、n=10との結果が示すように、シーケンスは厳密には増加していませんn=11

入力

単一の整数n>0(0インデックスを付けてからを作成することもできますn>=0

出力

どちらのn目プライム封じ込め番号、または最初に含まれているリストnプライム封じ込め番号を。

私がこれまでに見つけた数字は次のとおりです。

 1 =>             2
 2 =>            23
 3 =>           235
 4 =>          2357
 5 =>        112357
 6 =>        113257
 7 =>       1131725
 8 =>     113171925
 9 =>    1131719235
10 =>  113171923295
11 =>  113171923295
12 => 1131719237295

はすべての数字を含む最小の数字であるが、も含むため、n = 10n = 11は同じ数字であることに注意してください。113171923295[2,3,5,7,11,13,17,19,23,29]31

これはコードゴルフとマークされているので、ゴルフを始めましょう!ブルートフォースソリューションは許可されますが、コードは理論上のあらゆる入力に対して機能する必要があります(つまり、最初のn個の素数を連結することはできません)。ハッピーゴルフ!

回答:


11

05AB1E、8バイト

∞.ΔIÅpåP

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

説明

           # from
∞          # a list of infinite positive integers
 .Δ        # find the first which satisfies the condition:
       P   # all
   IÅp     # of the first <input> prime numbers
      å    # are contained in the number

P演算子は、(数が素数の配列にあるかどうかをチェックする代わりに)数の素数をチェックするために明示的なマッピングを作成しますか?これは美しいソリューションです。より少ないコマンドを使用してソリューションを作成できるとは思いません。
maxb

@maxb Pは製品です。基本的に、リスト内のすべての値を乗算します。Åp最初のリストを作成するn素数の量は、n入力されI、この場合です。å彼らはそれが与える無限リストの現在の数、である場合、素数のこのリスト内のそれぞれの数をチェックします1truthyためと0falseyのために。したがって、製品は基本的にすべてが真実かどうかをチェックします。すべての素数が現在の数値内にある場合。いずれかが0の場合、P結果もfalseyになります。しかし、すべてがの1場合、P結果は真実になり、ループは停止します。
ケビンクルーイッセン

@KevinCruijssenなるほど、説明ありがとう!
maxb

1
新しいバージョンを使用した非常に素晴らしいソリューションです!8バイトもありましたが、レガシーバージョンの05AB1E:では1µNIÅpåP。05AB1Eを知らない人のために、私の説明も:-カウンター変数が1に達するまで(0から始まり、N1ずつ徐々に増加し、実行します)NIÅpåP-最初の<input>素数がすべて現れるかどうかを確認しN、もしそうなら、カウンター変数を自動的にインクリメントしますNの最終値を返します
Mr. Xcoder

@ Mr.Xcoder:それは実際に私の最初のバージョンでもありました(理由X1、代わりに)が、以前に使用する機会がなかったのでこれに切り替えました:)
Emigna

5

ゼリー、11バイト

³ÆN€ẇ€µẠ$1#

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

単純な総当たり。#のアリティがどのように機能するか完全にはわからないため、改善の余地があるかもしれません。

使い方

³ÆN€ẇ€µẠ$1#    Main link. Input: Index n.
         1#    Find the first natural number N that satisfies:
³ÆN€             First n primes...
    ẇ€           ...are substrings of N
      µẠ$        All of them are true

「すべての条件に当てはまる」の代わりに「条件付きのフィルターで修正」が機能する場合があります。
user202729

2
wⱮẠ¥1#ÆN€2バイト節約します。
デニス

5

Java 8、143バイト

n->{int r=1,f=1,c,i,j,k;for(;f>0;r++)for(i=2,f=c=n;c>0;c-=j>1?1+0*(f-=(r+"").contains(j+"")?1:0):0)for(j=i++,k=2;k<j;)j=j%k++<1?0:j;return~-r;}

オンラインでお試しください。
ノート:

  1. 上記のタイムアウトn=7
  2. 十分な時間とリソースが与えられるn=9と、サイズ制限int(最大2,147,483,647)のために最大でしか機能しません。
    • 変化する4つのバイトintにはlong、最大値は以下の出力を増加させ9,223,372,036,854,775,807(約n=20思います?)
    • java.math.BigInteger最大値を使用することで(理論上)任意のサイズに増やすことができますが、少なくともjava.math.BigIntegerメソッドの冗長性のために少なくとも+200バイト程度になります。

説明:

n->{                   // Method with integer as both parameter and return-type
  int r=1,             //  Result-integer, starting at 1
      f=1,             //  Flag-integer, starting at 1 as well
      c,               //  Counter-integer, starting uninitialized
      i,j,k;           //  Index integers
  for(;f>0;            //  Loop as long as the flag is not 0 yet
      r++)             //    After every iteration, increase the result by 1
    for(i=2,           //   Reset `i` to 2
        f=c=n;         //   Reset both `f` and `c` to the input `n`
        c>0;           //   Inner loop as long as the counter is not 0 yet
        c-=            //     After every iteration, decrease the counter by:
           j>1?        //      If `j` is a prime:
            1          //       Decrease the counter by 1
            +0*(f-=    //       And also decrease the flag by:
                   (r+"").contains(j+"")?
                       //        If the result `r` contains the prime `j` as substring
                    1  //         Decrease the flag by 1
                   :   //        Else:
                    0) //         Leave the flag the same
           :           //      Else:
            0)         //       Leave the counter the same
      for(j=i++,       //    Set `j` to the current `i`,
                       //    (and increase `i` by 1 afterwards with `i++`)
          k=2;         //    Set `k` to 2 (the first prime)
          k<j;)        //    Inner loop as long as `k` is smaller than `j`
        j=j%k++<1?     //     If `j` is divisible by `k`
           0           //      Set `j` to 0
          :            //     Else:
           j;          //      Leave `j` the same
                       //    (If `j` is unchanged after this inner-most loop,
                       //     it means `j` is a prime)
  return~-r;}          //  Return `r-1` as result

5

JavaScript(ES6)、 105 ... 92  91バイト

n=>(k=1,g=(s,d=k++)=>n?k%d--?g(s,d):g(d?s:s+`-!/${n--,k}/.test(n)`):eval(s+';)++n'))`for(;`

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

どうやって?

n

"-!/2/.test(n)-!/3/.test(n)-!/5/.test(n)-!/7/.test(n)-!/11/.test(n)..."

n

eval('for(;' + <conditions> + ';)++n')

コメント済み

n => (                             // main function taking n
  k = 1,                           // k = current prime candidate, initialized to 1
  g = (s,                          // g = recursive function taking the code string s
          d = k++) =>              //     and the divisor d
    n ?                            // if n is not equal to 0:
      k % d-- ?                    //   if d is not a divisor of k:
        g(s, d)                    //     recursive call to test the next divisor
      :                            //   else:
        g(                         //     recursive call with s updated and d undefined:
          d ?                      //       if d is not equal to 0 (i.e. k is composite):
            s                      //         leave s unchanged
          :                        //       else (k is prime):
            s +                    //         decrement n and add to s
            `-!/${n--,k}/.test(n)` //         the next condition based on the prime k
                                   //       the lack of 2nd argument triggers 'd = k++'
        )                          //     end of recursive call
    :                              // else (n = 0):
      eval(s + ';)++n')            //   complete and evaluate the code string
)`for(;`                           // initial call to g with s = [ "for(;" ]


4

Pyth、14バイト

n>5

f@I`M.fP_ZQ1y`

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

f@I`M.fP_ZQ1y`     Full program. Q is the input.
f                  Find the first positive integer that fulfils the condition.
 @I`M.fP_ZQ1y`     Filtering condition, uses T to refer to the number being tested.
     .f   Q1       Starting at 1, find the first Q positive integers (.f...Q1) that
       P_Z         Are prime.
   `M              Convert all of those primes to strings.
  I                Check whether the result is invariant (i.e. doesn't change) when...
 @          y`     Intersecting this list with the powerset of T as a string.

Pyth、15バイト

わずかに高速ですが、1バイト長くなります。

f.A/L`T`M.fP_ZQ

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

f.A/L`T`M.fP_ZQ     Full program. Q is the input.
f                   Find the first positive integer that fulfils the condition.
 .A/L`T`M.fP_ZQ     Filtering condition, uses T to refer to the number being tested.
         .f   Q     Starting at 1, find the first Q positive integers (.f...Q) that
           P_Z      Are prime.
       `M           Convert all of those primes to strings.
 .A/L               And make sure that they all (.A) occur in (/L)...
     `T             The string representation of T.


3

、42バイト

≔¹ηW‹LυIθ«≦⊕η¿¬Φυ¬﹪ηκ⊞υη»≔¹ηWΦυ¬№IηIκ≦⊕ηIη

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

≔¹ηW‹LυIθ«≦⊕η¿¬Φυ¬﹪ηκ⊞υη»

n以前に見つかったすべての素数によるすべての整数の試行除算により、最初の素数を作成します。

≔¹ηWΦυ¬№IηIκ≦⊕η

すべての素数を部分文字列として含むものが見つかるまで、すべての整数をループします。

Iη

結果を文字列にキャストし、暗黙的に印刷します。

プログラムの速度は、最後≦⊕ηをに置き換えることにより1バイトのコストで2倍にできますが、≦⁺²η計算するには遅すぎますn>6


3

Perl 6の63の 59バイト

nwellnhofのおかげで-4バイト

{+(1...->\a{!grep {a~~!/$^b/},(grep &is-prime,2..*)[^$_]})}

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

5を超える数のTIOでタイムアウトするブルートフォースソリューションですが、正しく機能することは間違いありません。最初のn素数を含む最初の正の数を見つけます。タイムアウトしないソリューション次に示しn=6ます。

説明:

{                                                             } # Anonymous code block
 first                                                    2..*  # Find the first number
       ->\a{                                            }       # Where:
            !grep     # None of
                                                   [^$_]  # The first n
                              (grep &is-prime,2..*)       # primes
                  {a~~!/$^b/},   # Are not in the current number

大きな数値の出力を確認する方法はありますか、または説明を追加しますか?私はPerlに堪能ではありませんし、ゴルフPerlにも堪能ではありません。入力5のTIOでタイムアウトが発生するため、素数を連結しただけではないことを実際に確認することはできません。
maxb

@maxb繰り返しではなく、事前に素数を生成するソリューションへのリンクと説明を追加しました。
ジョーキング


2

Python 2、91バイト

n=input();l=[]
P=k=1
while~-all(`x`in`k`for x in(l+[l])[:n]):P*=k*k;k+=1;l+=P%k*[k]
print k

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


あなたのコードが素数を生成することを知らなかったなら、それが起こったことを理解することはできなかったでしょう。よくやった!
maxb

2

SAS、149バイト

data p;input n;z:i=1;a=0;v+1;do while(a<n);i+1;do j=2 to i while(mod(i,j));end;if j=i then do;a+1;if find(cat(v),cat(i))=0 then goto z;end;end;cards; 

次のように、cards;ステートメントの後に入力が入力されます。

data p;input n;z:i=1;a=0;v+1;do while(a<n);i+1;do j=2 to i while(mod(i,j));end;if j=i then do;a+1;if find(cat(v),cat(i))=0 then goto z;end;end;cards; 
1
2
3
4
5
6
7

p結果とともにデータセットを出力し、v各入力値の出力行を出力します。技術的には、指定されたすべてのテストケースで機能するはずです(SASの最大精度の最大整数は9,007,199,254,740,992です)が、n = 8で5分間考えさせた後、gaveめました。

説明:

data p;
input n; /* Read a line of input */

z: /* Jump label (not proud of this) */
    i=1; /* i is the current value which we are checking for primality */
    a=0; /* a is the number of primes we've found so far */
    v+1; /* v is the final output value which we'll look for substrings in */ 

    do while(a<n); /* Loop until we find the Nth prime */
        i+1; 
        do j=2 to i while(mod(i,j));end; /* Prime sieve: If mod(i,j) != 0 for all j = 2 to i, then i is prime. This could be faster by only looping to sqrt(i), but would take more bytes */
        if j=i then do; /* If i is prime (ie, we made it to the end of the prime sieve)... */
            a+1;
            if find(cat(v),cat(i))=0 then goto z; /* If i does not appear as a substring of v, then start all over again with the next v */
        end;
    end;

/* Input values, separated by newlines */
cards; 
1
2
3
4
5
6
7

1

Haskell、102バイト

import Data.List
f n|x<-[2..n*n]=[a|a<-[2..],all(`isInfixOf`show a).take n$show<$>x\\((*)<$>x<*>x)]!!0

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

説明/ゴルフなし

すでにData.Listインポートしているので、それを使用することtake n[p|p<-[2..],all((>0).mod p)[2..p-1]]もできます。古き良きものの代わりに、必要なすべての素数を生成する別の方法を使用できます。つまり、十分な量の複合材料を生成し、これらを以下と組み合わせて使用​​し(\\)ます。

[2..n*n] \\ ( (*) <$> [2..n*n] <*> [2..n*n] )

n*nπ(n)<n2log(n2)

[ a | a <- [2..], all (`isInfixOf` show a) . take n $ enoughPrimes ] !!0

1

Japt、20 18バイト

私の最高の仕事とは程遠い、私は一日を過ごした後、それを機能させて幸せでした。私は後でそれをブザーの下で叩いてしまうと確信しています!

_õ fj ¯U e!øZs}aUÄ

試してみてください -の入力のために実行するのに13秒かかります。7その後、ぐらついた音をスローします(更新されたバージョン5は私にはがたつきますが、それは単なる私の電話かもしれません)。


@オリバー、うーん...私も。私が投稿したときは間違いなく機能していました。F.h()単独で使用してテストを実行しただけで、壊れているようです。ETHは何かを変えたに違いありません。
シャギー

@Oliver、いや、最後のコミットは2日前だったので、これを投稿してから何も変わっていません。変だ!
シャギー

それは今働いています!¯\ _(ツ)_ /¯–
オリバー

@Oliver、まだ私のために働いていません。奇妙で奇妙な!
シャギー

職場のコンピューターから自宅のコンピューターに行って以来、私にとってはうまくいっています。本当に奇妙です!
オリバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.