Schöne Erinnerungen an vergangene Primes


34

Man betrachte eine Primzahl p , die in der Basis 10 geschrieben ist. Der Speicher von p ist definiert als die Anzahl verschiedener Primzahlen, die streng kleiner als p sind und als Teilzeichenfolgen von p enthalten sind .

Herausforderung

Wenn eine nicht negative ganze Zahl n als Eingabe gegeben wird, finde die kleinste Primzahl p, so dass p den Speicher n hat . Das heißt, finden Sie die kleinste Primzahl mit genau n verschiedenen streng weniger Primzahlen als Teilzeichenfolgen.

Eingang

Die Eingabe kann über jedes Standardformat erfolgen. Sie müssen die Eingabe bis zum größten n unterstützen , damit die Ausgabe nicht überläuft. Als Referenz ist 4294967291 die größte Primzahl in 32 Bits.

Ausgabe

Die Ausgabe kann in STDOUT geschrieben oder von einer Funktion zurückgegeben werden.

Beispiele

Die Nummer 2 hat Speicher 0, da sie keine streng kleineren Primzahlen als Teilzeichenfolgen enthält.

Die Zahl 113 ist die kleinste Primzahl mit Speicher 3. Die Zahlen 3, 13 und 11 sind die einzigen Primteilzeichenfolgen, und keine Primzahl kleiner als 113 enthält genau 3 Primzahlen als Teilzeichenfolgen.

Die ersten 10 Terme der Sequenz, die mit n = 0 beginnen, sind

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

Hinweis

Dies ist A079397 in OEIS.

Bestenliste

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>


Gibt es eine Laufzeitbeschränkung?
Beta Decay

@ BetaDecay Nein.
Alex A.

Antworten:


8

Pyth, 22 Bytes

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

Demonstration , Testgeschirr

Erläuterung:

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.)

Konnten Sie nicht verwendet haben P_Yund P_Tstatt }YPYund }TPTdamals?
Erik der Outgolfer

7

CJam, 33 31 30 Bytes

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

Dies ist ein vollständiges Programm, das die Eingabe als Befehlszeilenargument liest.

Probieren Sie es online im CJam-Interpreter aus .

Testlauf

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

Wie es funktioniert

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 Bytes

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

Probieren Sie es online aus

Ich bin mir sicher, dass dies ein großer Schock ist, aber es ist in der Tat länger als die Lösung, die Dennis gepostet hat. Naja, nicht wirklich, da ich selbst keine großen Hoffnungen hatte. Aber ich wollte es trotzdem versuchen. Und da es funktioniert, für mich ziemlich vernünftig aussieht und ich glaube, es ist ausreichend anders, um zumindest von Interesse zu sein, dachte ich, ich würde es trotzdem posten.

Die Grundidee hier ist, dass ich eine Liste von Primzahlen in einer Schleife erstelle und der Liste in jedem Schritt die nächstgrößere Primzahl hinzufüge. Um auf Terminierung zu prüfen, zähle ich, wie viele andere Elemente als das letzte Element in der Liste eine Teilzeichenfolge des letzten Elements sind. Wenn diese Anzahl der Eingabe entspricht n, sind wir fertig.

Erläuterung:

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.

4

Pyth - 25 Bytes

Geschachtelter Filter, inner, um den Speicher zu berechnen, äußer, um zuerst den Speicher zu finden, der benötigt wird.

f&!tPTqlf&!tPY}`Y`TtStTQ2

Test Suite .


r2TstatttStT
Jakube


2

JavaScript ES6, 106 Bytes

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}

Hier ist eine ungolfed Version mit Erklärung:

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;
}

Natürlich wird das ziemlich schnell schrecklich langsam. Das OP hat jedoch erklärt, dass es keine zeitliche Begrenzung gibt.


Schöne Lösung, genialer Einsatz von aund i%cÜberprüfung auf Primität. Sie könnten zwei Bytes sparen, indem Sie, {return i}else{a.push(i)}wie return i;else a.push(i)ich glaube, auch anonyme Funktionen zulassen, wodurch am Anfang zwei weitere Bytes gespart würden.
ETHproductions

@ETHproductions Danke, daran habe ich nicht gedacht. Obwohl ich es geschafft habe, 7 Bytes zu sparen und die gesamte if...elseLogik zu entfernen, indem ich sie in eine for-Schleife einpacke.
George Reith

Wow, das ist schlau! Was ist, wenn Sie das i++mit kombinieren i%c?
ETHproductions

@ETHproductions Funktioniert nicht, da dies für jeden Wert von iteriert aund der nächste Aufruf den falschen Wert ihat. Wenn wir beispielsweise 10 Primzahlen gefunden haben, wird dies für jede Iteration der äußeren Schleife 10 Mal iteriert.
George Reith

@ETHproductions Ah ja, ich wollte ursprünglich die Rekursion verwenden, aber sie hätte das Stack-Limit erreicht, bevor die Mindestanforderungen des OP erfüllt waren. Jetzt ist es so
George Reith

2

Brachylog (2), 12 Bytes, Sprachnachstellung

~{ṗ≜{sṗ}ᵘkl}

Probieren Sie es online!

Früher waren es 13 Bytes, ᶠdaber jetzt wurde eine Abkürzung verwendet , die es auf 12 reduziert. Da die Sprache die Herausforderung sowieso datiert und die Funktion nicht speziell für diese Herausforderung hinzugefügt wurde, kann ich das auch benutze es.

Wie in Brachylog üblich, ist dies eine Funktion, kein vollständiges Programm.

Erläuterung

~{ṗ≜{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.

Dies gibt uns die kleinste Primzahl mit der gewünschten Eigenschaft, da zuerst Werte nahe 0 überprüft werden.


1

Python 2, 163 154 Bytes

Ich bin zu müde, um Golf zu spielen. Hoffentlich kann ich das verbessern, wenn ich morgen aufwache.

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

Julia, 86 Bytes

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

Es ist praktisch selbsterklärend. Durchlaufen Sie alle positiven Ganzzahlen und addieren Sie jedes Mal, wenn eine Primzahl gefunden wird, ein boolesches Array, das angibt, ob die Menge der Primzahlen, die kleiner als die aktuelle ist, Teilzeichenfolgen der aktuellen sind. Wenn es eine mit der erforderlichen Anzahl von Übereinstimmungen findet, geben Sie diesen Wert zurück.

Die Laufzeit wird für n = 11 langsam, und wahrscheinlich für die meisten Werte über 11 - speziell bei meinem Laptop dauert n = 11 ungefähr 33 Sekunden.


Saubere und elegante Lösung, auch wenn sie nur auf 64-Bit-Systemen funktioniert (Schuld daran ist das Julia-Typ-System - auf der 32-Bit-Plattform 2^63ergibt sich 0, dass Julia Int32auf 32-Bit-Systemen standardmäßig ganzzahlige Literale verwendet - sic!). Die kürzeste Zeit, um die Lösung auf einem 32-Bit-System zum Laufen zu bringen for i=1:uint(-1), wäre dann, aber es kostet 2 Bytes mehr. Es ist jedoch schwierig, Golf-Lösungen auf allen Plattformen zu testen, also +1.
pawel.boczarski

@ pawel.boczarski - Ich kann es mit Bit-Shifting beheben. Schauen Sie mal ...
Glen O

Ich habe auch die "Map" entfernt, da es sich um eine redundante Innensumme handelt, da sum eine Funktion annehmen kann, die vor dem Summieren auf jeden Term angewendet wird.
Glen O

0

Haskell, 149 147 144 Bytes

(127 Bytes ohne importDeklaration).

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.

Die obige Ausgabe wurde mit der längeren Definition erzeugt

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

Die neue, 3 Zeichen kürzere Definition ist viel langsamer, ich konnte nur 5 erste Zahlen in der Sequenz erhalten, bevor ich die Geduld verlor und abbrach.



0

PHP, 124 Bytes

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");}

Nimmt Eingaben vom Kommandozeilenargument entgegen; renn mit -r.

Nervenzusammenbruch

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
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.