過去の素数の思い出


34

素数考えるPベース10に書き込まれ、メモリpは厳密未満異なる素数の数として定義されるPのサブストリングとして含まれるP

チャレンジ

入力として負でない整数nが与えられた場合、pがメモリnを持つような最小の素数pを見つけます。つまり、正確にn個の厳密に小さい素数を部分文字列として持つ最小の素数を見つけます。

入力

入力は、任意の標準形式で取得できます。出力がオーバーフローしないように、最大nまでの入力をサポートする必要があります。参考として、4294967291は32ビットで最大の素数です。

出力

出力はSTDOUTに書き込まれるか、関数から返されます。

数値2にはサブストリングとして厳密に小さい素数が含まれていないため、メモリ0があります。

113という数字は、メモリ3を持つ最小の素数です。3、13、および11という数字が唯一の素数サブストリングであり、113より小さい素数には、サブストリングとして正確に3つの素数が含まれません。

n = 0で始まるシーケンスの最初の10項は次のとおりです。

2, 13, 23, 113, 137, 1237, 1733, 1373, 12373, 11317

注意

これは、OEISのA079397です。

リーダーボード

var QUESTION_ID=55406,OVERRIDE_USER=20469;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


実行時間に制限はありますか?
ベータ崩壊

@BetaDecayいいえ
アレックスA.

回答:


8

Pyth、22バイト

f&}TPTqQlf}YPY{sMP.:`T

デモンストレーションテストハーネス

説明:

f&}TPTqQlf}YPY{sMP.:`T
                          Implicit: Q = eval(input())
f                         Starting at T=1 and counting up, return the first T where
                    `T    repr(T)
                  .:      all substrings
                 P        except T itself
               sM         converted to integers
              {           unique examples only
         f                filter on
          }YPY            Y is in the prime factorization of Y, e.g. Y is prime.
      qQl                 Q == len of the above, that is, T has memory Q,
 &}TPT                    and T is prime, (is in its prime factorization.)

使用P_YしたP_Tことが}YPYあり}TPTますか?
エリックアウトゴルファー

7

CJam、33 31 30バイト

1{)__mp*{_mp2$s@s#)*},,easi^}g

これは、コマンドライン引数として入力を読み取る完全なプログラムです。

CJamインタープリターでオンラインで試してください。

試運転

$ time cjam <(echo '1{)__mp*,{_mp2$s@s#)*},,easi^}g') 9
11317
real    0m3.562s
user    0m4.065s
sys     0m0.177s

使い方

1       e# Push I := 1 on the stack.
{       e# Do:
  )__   e#   Increment I and push two copies.
  mp*   e#   Check the last copy for primality and multiply with the first copy.
        e#   This pushes R := I if I is prime and R := 0 if it is composite.
  {     e#   Filter; for each J in [0 ... R-1]:
    _mp e#     Push a copy of J and check for primality.
    2$s e#     Push a copy of I and cast to string.
    @s  e#     Rotate the original J on top of the stack and cast to string.
    #   e#     Find the index (-1 if not found) of the latter in the former.
    )*  e#     Increment the index and multiply it with the result from `mp'.
        e#     This yields 0 iff J is composite or not a subtring of I.
  },    e#   Keep J if the product is non-zero.
  ,     e#   Push the length of the filtered range.
  easi  e#   Cast the array of command-line arguments to string, then to integer.
  ^     e#   XOR it with the length of the filtered range.
}g      e# Repeat while theresult is non-zero.

6

CJam、40バイト

li2sa{_)\{1$\#)},,3$-}{i{)_mp!}gsa+}w]W=

オンラインで試す

これは大きな衝撃を与えるものと確信していますが、実際には、デニスが投稿したソリューションよりも長くなります。まあ、そうではありません。私は自分自身にあまり高い希望を持っていなかったからです。しかし、とにかく試してみたかったです。そして、それは機能しているので、私にはかなり合理的に見えます。そして、少なくとも興味があるものとは十分に異なると思います、とにかくそれを投稿すると思いました。

ここでの基本的な考え方は、ループで素数のリストを作成し、各ステップで次に大きい素数をリストに追加することです。終了を確認するために、リスト内の最後の要素以外の要素が最後の要素の部分文字列である数をカウントします。このカウントがinputと等しい場合n、完了です。

説明:

li    Get input and convert to integer.
2sa   Seed list of primes with ["2"]. The primes are stored as strings to make
      the later substring search more streamlined.
{     Start of while loop condition.
  _   Copy list of primes.
  )     Pop off last prime from list.
  \     Swap remaining list to top.
  {     Start of filter block for substring matches with all smaller primes.
    1$    Copy test prime to top.
    \     Swap the smaller prime to top to get correct order for substring search.
    #     Search.
    )     Increment to get truthy value (Search returns -1 if not found).
  },    End of filter. We have a list of smaller primes that are substrings now.
  ,     Count list entries.
  3$    Copy input n to top.
  -     Subtract the two for comparison. If they are different, continue loop.
}     End of while loop condition.
{     Start of while loop body. We need to generate the next prime.
  i     The largest prime so far is still on the stack, but as string.
        Convert it to integer.
  {     Start of loop for prime candidates.
    )     Increment current candidate value.
    _mp   Check if it is prime.
    !     Negate, loop needs to continue if it is not a prime.
  }g    End loop for prime candidates. On exit, next prime is found.
  sa+   Convert it to string, and add it to list of primes.
}w    End of while loop body.
]W=   Solution is at top of stack. Discard other stack entries.



2

JavaScript ES6、106バイト

n=>{for(a=[],i=2;a.filter(c=>(''+i).search(c)+1).length-n-1;a.push(i))while(!a.every(c=>i%c))i++;return i}

ここに説明のないバージョンがあります:

n=>{
  /**
   * a = list of primes
   * i = current integer
   * Iterate until number of members in a that are substring of i == n-1
   * After each iteration push the current value of i onto a
   */
  for(a=[],i=2; a.filter(c=>(''+i).search(c)+1).length-n-1; a.push(i)) {
    // Iterate until no member of a exactly divides i and increment i per iteration
    while(!a.every(c=>i%c)) i++;
  }
  return i;
}

もちろん、これはかなり遅くなります。しかし、OPは時間に制限がないと述べています。


すてきな解決策、巧妙な使用法、aおよびi%cプライムネスの確認。匿名関数も許可されると信じる{return i}else{a.push(i)}ようreturn i;else a.push(i)に変更すると、2バイトを節約できます。これにより、最初にさらに2バイト節約できます。
ETHproductions

@ETHproductionsありがとう、それは考えていませんでした。私は7バイトを削りif...else、forループでラップすることですべてのロジックを削除することができましたが。
ジョージリース

うわー、それはスマートです!あなたは何を組み合わせた場合i++i%c
ETHproductions

@ETHproductionsは動作しません。なぜなら、それはすべての値に対して繰り返されa、次の呼び出しは間違っているからです。i例えば、10個の素数が見つかった場合、各外側ループの繰り返しに対して10回繰り返されます。
ジョージリース

@ETHproductionsああ、私はもともと再帰を使用したかったのですが、OPの最小要件に達する前にスタック制限に達していました。今、その...それは可能なはず...それに次のようにリファクタリング
ジョージReithの

2

Brachylog(2)、12バイト、言語ポストデートチャレンジ

~{ṗ≜{sṗ}ᵘkl}

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

これは以前は13バイトでしたᶠdが、現在は略語が付けられており、12に削減されています。言語はとにかくチャレンジを後回しにしているため、このチャレンジのために特に追加されていない機能です。これを使って。

Brachylogで通常行われているように、これは関数であり、完全なプログラムではありません。

説明

~{ṗ≜{sṗ}ᵘkl}
~{         }  Find a value for which the following is true:
  ṗ             The value is prime;
   ≜            (evaluation strategy hint; avoids an infinite loop)
    {  }ᵘ       The set of unique
     sṗ         substrings which are prime
          l     has a length equal to {the input}
         k      when one element is removed.

これにより、最初に0に近い値をチェックするため、必要なプロパティを持つ最小の素数が得られます。


1

Python 2、163 154バイト

私はゴルフに疲れすぎています。明日目が覚めたら、これを改善できることを願っています。

p=lambda n:all(n%x for x in range(2,n))
g=input()
s=2
while not(p(s)and len([l for l in[str(x)for x in range(2,s)if p(x)]if l in str(s)])==g):s+=1
print s

1

ジュリア、86バイト

n->for i=1:~0>>>1 isprime(i)&&sum(j->contains("$i","$j"),primes(i-1))==n&&return i;end

それは実質的に自明です。すべての正の整数をループし、素数が見つかるたびに、現在の素数より小さい素数のセットが現在の素数の部分文字列であるかどうかを示すブール配列を合計します。必要な数の一致を持つものが見つかった場合、その値を返します。

n = 11の場合、実行時間は遅くなり、11を超えるほとんどの値ではおそらくそうです-特に、私のラップトップでは、n = 11には約33秒かかります。


クリーンでエレガントなソリューション、それは64ビットシステムでのみ動作しますが(そのための非難Julia型システム-32ビットプラットフォームで2^630、Julia Int32は32ビットシステムの整数リテラルのデフォルトとして評価します-sic!)。ソリューションを32ビットシステムで動作させるための最も短いイディオムはfor i=1:uint(-1)そのときですが、2バイト多くかかります。ただし、すべてのプラットフォームでゴルフソリューションのテストを要求するのは難しいため、+ 1です。
pawel.boczarski

@ pawel.boczarski-ビットシフトを使用して修正できます。一見...持っている
グレンO

sumは加算前に各項に適用される関数を取ることができるため、「map」も削除されました。
グレンO

0

ハスケル、149の 147 144バイト

(127バイトはimport宣言をカウントしません)。

import Data.List
i x=x`elem`nubBy(((>1).).gcd)[2..x]
f n=[p|p<-[2..],i p,n==length(nub[x|x<-[read b|a<-tails$show p,b<-tail$inits a],i x])-1]!!0

Prelude Data.List> map f [0..20]
[2,13,23,113,137,1237,1733,1373,12373,11317,23719、Interrupted。

上記の出力は、より長い定義で生成されました

i x=and$[x>1]++[rem x n>0|n<-[2..x-1]]

新しい、3文字短く、定義がはるかに遅くなり、忍耐力を失い中断する前に、シーケンスの最初の5つの数字しか取得できませんでした。



0

PHP、124バイト

for($p=1;;){for($i=$c=0;$i-1;)for($i=++$p;$p%--$i;);$m[]=$p;foreach($m as$q)$c+=!!strstr($p,"$q");$c-1-$argv[1]?:die("$p");}

コマンドライン引数から入力を受け取ります。で実行し-rます。

壊す

for($p=1;;)
{
    for($i=$c=0;$i-1;)for($i=++$p;$p%--$i;);    // find prime $p
    $m[]=$p;                                    // remember that prime
    foreach($m as$q)$c+=!!strstr($p,"$q");      // count memory primes
    $c-1-$argv[1]?:die("$p");                   // if memory==N, exit
}

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