Memórias de Primes Passados


34

Considere um número primo p , escrito na base 10. A memória de p é definida como o número de primos distintos estritamente menores que p que estão contidos como substrings de p .

Desafio

Dado um número inteiro não negativo n como entrada, encontre o menor primo p tal que p tenha memória n . Ou seja, encontre o menor primo com exatamente n primos distintos estritamente menores como substrings.

Entrada

A entrada pode ser obtida através de qualquer formato padrão. Você deve suportar a entrada até o maior n , de forma que a saída não transborde. Para referência, 4294967291 é o maior número primo em 32 bits.

Saída

A saída pode ser gravada em STDOUT ou retornada de uma função.

Exemplos

O número 2 tem memória 0, pois não contém números primos estritamente menores como substrings.

O número 113 é o menor primo da memória 3. Os números 3, 13 e 11 são os únicos substrings primos e nenhum primo menor que 113 contém exatamente 3 primos como substrings.

Os 10 primeiros termos da sequência, começando com n = 0, são

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

Nota

Este é A079397 no OEIS.

Entre os melhores

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>


Existe um limite no tempo de execução?
Beta Decay

@BetaDecay Nope.
Alex A.

Respostas:


8

Pitão, 22 bytes

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

Demonstração , Arnês de Teste

Explicação:

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

Não poderia tê-lo usado P_Ye P_T, em vez de }YPYe }TPTnaquela época?
Erik the Outgolfer

7

CJam, 33 31 30 bytes

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

Este é um programa completo que lê a entrada como um argumento da linha de comandos.

Experimente online no intérprete CJam .

Execução de teste

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

Como funciona

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=

Experimente online

Tenho certeza de que isso é um choque, mas na verdade é mais longo que a solução que Dennis postou. Bem, na verdade não, já que eu nem tinha grandes esperanças. Mas eu queria tentar de qualquer maneira. E, como está funcionando, parece bastante razoável para mim e acredito que seja suficientemente diferente para pelo menos ter algum interesse, pensei em publicá-lo de qualquer maneira.

A idéia básica aqui é que eu construa uma lista de números primos em um loop, adicionando o próximo número primo maior à lista em cada etapa. Para verificar a terminação, conto quantos elementos, exceto o último elemento da lista, são uma substring do último elemento. Se essa contagem for igual à entrada n, terminamos.

Explicação:

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

Oitava / Matlab, 126 bytes

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

Experimente online


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}

Aqui está uma versão ungolfed com explicação:

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

É claro que isso fica terrivelmente lento e rapidamente. No entanto, o PO declarou que não há limite de tempo.


Solução agradável, uso engenhoso ae i%cverificação de excelência. Você pode salvar dois bytes mudando {return i}else{a.push(i)}para return i;else a.push(i)Creio que funções anônimas também são permitidas, o que salvaria mais dois bytes no início.
ETHproductions

@ETHproductions Obrigado, não pensei nisso. Embora eu tenha conseguido raspar 7 bytes e remover toda a if...elselógica, envolvendo-a em um loop for.
George Reith

Uau, isso é inteligente! E se você combinasse o i++com i%c?
ETHproductions 29/08/2015

@ETHproductions Não funcionaria porque isso iteraria para todos os valores de ae a próxima chamada teria o erro errado i, por exemplo, quando encontramos 10 primos, iteraria 10 vezes para cada iteração do loop externo.
George Reith

@ETHproductions Ah, sim, originalmente eu queria usar a recursão, mas teria atingido o limite da pilha antes de atingir os requisitos mínimos do OP. Agora é reformulado como esta deve ser possível ... nele ...
George Reith

2

Brachylog (2), 12 bytes, desafio após a data do idioma

~{ṗ≜{sṗ}ᵘkl}

Experimente online!

Isso era 13 bytes anteriormente, usando ᶠd, mas agora é uma abreviação , reduzindo-a para 12. Como o idioma pós-data o desafio de qualquer maneira, e o recurso é um que não foi adicionado para esse desafio em particular, posso também use-o.

Como é habitual no Brachylog, esta é uma função, não um programa completo.

Explicação

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

Isso nos dá o menor primo com a propriedade que queremos, porque verifica valores próximos a 0 primeiro.


1

Python 2, 163 154 bytes

Estou cansado demais para jogar golfe. Espero que, quando acordo amanhã, possa melhorar isso.

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

É praticamente auto-explicativo. Faça um loop sobre todos os números inteiros positivos e, cada vez que um primo for encontrado, some uma matriz booleana indicando se o conjunto de primos menor que o atual é substrings do atual. Se encontrar um com o número necessário de correspondências, retorne esse valor.

O tempo de execução fica lento para n = 11 e provavelmente para a maioria dos valores maiores que 11 - especificamente, no meu laptop, n = 11 leva cerca de 33 segundos.


Solução limpa e elegante, mesmo que funcione apenas no sistema de 64 bits (culpe o sistema do tipo Julia por isso - na plataforma de 32 bits 2^63avalia 0, como Julia usa o padrão Int32para literais inteiros no sistema de 32 bits - sic!). O idioma mais curto para fazer a solução funcionar no sistema de 32 bits seria for i=1:uint(-1)então, mas custa 2 bytes a mais. No entanto, é difícil exigir o teste de soluções de golfe em todas as plataformas, então +1.
pawel.boczarski

@ pawel.boczarski - Eu posso consertar usando deslocamento de bits. Dê uma olhada ...
Glen O

Também removi o "mapa", porque é redundante dentro da soma, pois a soma pode ter uma função que é aplicada a cada termo antes da soma.
Glen O

0

Haskell, 149 147 144 bytes

(127 bytes sem contar a importdeclaração).

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

A saída acima foi produzida com a definição mais longa

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

A nova definição, 3 caracteres mais curta, é muito mais lenta, eu só conseguia 5 primeiros números na sequência antes de perder a paciência e abortar.


0

Haskell , 119 118 bytes

p x=all((>0).mod x)[2..x-1]
f n=[y|y<-[2..],p y,n==sum[1|x<-[2..y-1],p x,elem(show x)$words=<<(mapM(:" ")$show y)]]!!0

Experimente online! Uso: f 3rendimentos 113.


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

recebe entrada do argumento da linha de comando; corra com -r.

demolir

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
}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.