Geçmiş Asalların Düşkün Anıları


34

Asal bir sayı düşünün s temel 10 yazılmış, bellek bölgesinin p kesinlikle daha az belirgin asal sayısı olarak tanımlanır p oluşan altdizgelerin olarak içerdiği p .

Meydan okuma

Negatif olmayan bir tamsayı Verilen n girdi olarak, en küçük asal bulmak p öyle ki p hafıza vardır n . Diğer bir deyişle, en küçük prime tam olarak n farklı kesinlikle daha az primerlerle alt dizge olarak bulun.

Giriş

Giriş herhangi bir standart formatta alınabilir. Çıkışın taşmayacağı şekilde en büyük n değerine kadar olan girişi desteklemelisiniz . Başvuru için, 4294967291 32 bitin en büyük değeridir.

Çıktı

Çıktı STDOUT'a yazılabilir veya bir işlevden döndürülebilir.

Örnekler

2 sayısının hafızası 0'dır, çünkü alt dizinler olarak kesinlikle daha az primer içermez.

113 sayısı, hafızanın 3 olduğu en küçük asal sayıdır. 3, 13 ve 11 sayıları yalnızca asal alt dizilerdir ve 113'ten küçük hiçbir asıl alt öğe olarak tam olarak 3 asal içermez.

Dizinin ilk 10 terimi, n = 0 ile başlayanlar

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

Not

Bu, OEIS’deki A079397 .

Liderler Sıralaması

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>


Çalışma süresinde bir sınır var mı?
Beta Çürüğü

@ BetaDecay Hayır.
Alex A.

Yanıtlar:


8

Pyth, 22 bayt

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

Gösterme , Test Kablo Demeti

Açıklama:

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

Eğer kullanılan olamazdı P_Yve P_Tyerine }YPYve }TPTo zamanlar?
Outgolfer Erik,

7

CJam, 33 31 30 bayt

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

Bu, girişi komut satırı argümanı olarak okuyan tam bir programdır.

CJam tercümanında çevrimiçi olarak deneyin .

Test sürüşü

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

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin

Bunun büyük bir şok edici olacağına eminim, ama aslında Dennis’in yayınladığı çözümden daha uzun. Pek sayılmaz, çünkü kendimi çok fazla ümit etmemiştim. Ama yine de bir şans vermek istedim. İşe yaradığı için benim için oldukça makul gözüküyor ve en azından bazı ilgi alanlarına göre yeterince farklı olduğuna inanıyorum, yine de göndereceğimi düşündüm.

Buradaki temel fikir, her adımda listeye bir sonraki büyük asal sayıyı ekleyerek bir döngüde asal sayıların bir listesini oluşturmamdır. Sonlandırmayı kontrol etmek için, listedeki son öğeden başka kaç öğenin son öğenin alt öğesi olduğunu sayıyorum. Bu sayı girişe eşitse n, işimiz biter.

Açıklama:

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 bayt

Yuvalanmış filtre, hafızayı hesaplamak için iç, dış bulması gereken hafızaya sahip ilk bulmak için.

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

Test Takımı .


r2TyerinetStT
Jakube

2

Octave / Matlab, 126 bayt

function p=f(n)
p=1;t=1;while t
p=p+1;t=~isprime(p)|sum(arrayfun(@(x)any(strfind(num2str(p),num2str(x))),primes(p)))~=n+1;end

Çevrimiçi deneyin


2

JavaScript ES6, 106 bayt

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}

İşte açıklama ile ungolfed versiyonu:

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

Tabii ki bu hızlı bir şekilde oldukça korkunç bir şekilde yavaşlıyor. Ancak OP, zamanın sınırı olmadığını belirtti.


Güzel bir çözüm, ustaca kullanımı ave üstünlüğü i%ckontrol etmesi. İki bayttan tasarruf {return i}else{a.push(i)}yaparak, return i;else a.push(i)anonim işlevlere de izin verildiğine inanıyorum, bu da başlangıçta iki bayt daha tasarruf eder.
ETHProductions

@ETHproductions Teşekkürler bunu düşünmedim. Yine de 7 byte'ı tıraş etmeyi ve tüm if...elsemantığı bir for döngüsüne sararak kaldırmayı başardım .
George Reith

Vay, bu akıllı! Ya i++ile birleştirirsen i%c?
ETHproductions

@ETHporoductions işe yaramaz çünkü bu her değer için yinelenir ave bir sonraki çağrının yanlış olması gerekir, iörneğin, 10 priming bulduğumuzda her dış döngü yinelemesi için 10 kez yinelendi.
George Reith

@ETHproductions Ah evet Başlangıçta özyinelemeyi kullanmak istedim ancak OP'nin minimum gereksinimlerine ulaşmadan önce istif sınırına ulaşmış olacaktı. Şimdi onun gibi yeniden yapılandırılmış olması mümkün olmalı ... üzerinde ...
George Reith

2

Brachylog (2), 12 bayt, dil kayıt sonrası mücadelesi

~{ṗ≜{sṗ}ᵘkl}

Çevrimiçi deneyin!

Bu daha önce 13 bayt kullanıyordu. ᶠd , ama şimdi kısaltılmış , 12'ye düşürüyordu. Dil yine de mücadeleyi yayınladığı için ve özellikle bu meydan okuma için eklenmemiş olan özellik, özellikle de kullan.

Brachylog'da her zaman olduğu gibi, bu tam bir program değil, bir fonksiyondur.

açıklama

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

Bu bize ilk önce 0'a yakın değerleri kontrol ettiğimiz için istediğimiz özellik ile en küçük değeri veriyor .


1

Python 2, 163 154 Bayt

Golf oynamaktan çok yoruldum .. Umarım yarın uyandığımda bunu geliştirebilirim.

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 bayt

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

Neredeyse kendi kendini açıklayıcı. Tüm pozitif tamsayılar üzerinde döngü yapın ve her bir asal sayı bulunduğunda, asal dizinin geçerli dizinden daha az olan dizinin geçerli dizinin alt dizilimi olup olmadığını belirten bir boolean dizisi toplayın. Gerekli eşleşme sayısına sahip birini bulursa, bu değeri döndür.

Çalışma süresi n = 11 için durgunlaşıyor ve 11'den yüksek değerlerin çoğu için büyük olasılıkla - özellikle dizüstü bilgisayarımda n = 11 yaklaşık 33 saniye sürüyor.


Temiz ve zarif bir çözüm, yalnızca 64 bit sistemde çalışmasına rağmen (bunun için Julia tipi sistemi suçla - 32 bit platformda 2^63değerlendirir 0, çünkü Julia Int3232 bit sistemde tamsayı değişmezleri için varsayılandır ). Çözümün 32 bit sistemde çalışmasını sağlayacak en kısa deyim for i=1:uint(-1)o zaman olur, ancak 2 bayta daha mal olur. Bununla birlikte, tüm platformlarda golflü çözümler denenmesi zor, yani +1.
pawel.boczarski 28:15

@ pawel.boczarski - Bit kaydırmayı kullanarak düzeltebilirim. Bir göz atın ...
Glen O

Ayrıca "haritayı" da kaldırdım, çünkü toplamın toplamadan önce her terime uygulanan bir işlevi alabileceği için fazlalık içseldir.
Glen O

0

Haskell, 149 147 144 bayt

(127 bayt importbildirimi saymaz ).

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> harita f [0..20]
[2,13,23,113,137,1237,1733,1373,12373,11317,23719, Kesildi.

Yukarıdaki çıktı daha uzun tanımla üretildi

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

Yeni, 3 karakter daha kısa, tanım çok daha yavaş, sabrı kaybetmeden ve iptal etmeden önce sadece 5 ilk sayıyı alabildim.



0

PHP, 124 bayt

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

komut satırı argümanından girdi alır; ile koş -r.

Yıkmak

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
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.