Afectuosos recuerdos de pasados ​​pasados


34

Considere un número primo p , escrito en la base 10. La memoria de p se define como el número de primos distintos estrictamente menores que p que están contenidos como subcadenas de p .

Reto

Dado un número entero no negativo n como entrada, encuentre el primo más pequeño p tal que p tenga memoria n . Es decir, encuentre el primo más pequeño con exactamente n primos estrictamente distintos como subcadenas.

Entrada

La entrada se puede tomar a través de cualquier formato estándar. Debe admitir la entrada hasta el n más grande de modo que la salida no se desborde. Como referencia, 4294967291 es el primo más grande en 32 bits.

Salida

La salida puede escribirse en STDOUT o devolverse desde una función.

Ejemplos

El número 2 tiene memoria 0 ya que no contiene primos estrictamente menores como subcadenas.

El número 113 es el primo más pequeño con memoria 3. Los números 3, 13 y 11 son las únicas subcadenas primas y ningún primo menor que 113 contiene exactamente 3 primos como subcadenas.

Los primeros 10 términos de la secuencia, que comienzan con n = 0, son

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

Nota

Este es A079397 en OEIS.

Tabla de clasificación

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>


¿Hay un límite en el tiempo de ejecución?
Beta Decay

@BetaDecay Nope.
Alex A.

Respuestas:


8

Pyth, 22 bytes

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

Demostración , prueba de arnés

Explicación:

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

¿No podría haber usado P_Yy en P_Tlugar de }YPYy en }TPTese entonces?
Erik the Outgolfer

7

CJam, 33 31 30 bytes

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

Este es un programa completo que lee la entrada como un argumento de línea de comandos.

Pruébelo en línea en el intérprete de CJam .

Prueba de funcionamiento

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

Cómo 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=

Pruébalo en línea

Estoy seguro de que esto es una gran sorpresa, pero de hecho es más largo que la solución que Dennis publicó. Bueno, en realidad no, ya que ni siquiera tenía muchas esperanzas. Pero quería darle una oportunidad de todos modos. Y como está funcionando, me parece bastante razonable, y creo que es lo suficientemente diferente como para ser de algún interés, pensé en publicarlo de todos modos.

La idea básica aquí es que construyo una lista de números primos en un ciclo, agregando el siguiente número primo más grande a la lista en cada paso. Para verificar la terminación, cuento cuántos elementos, además del último elemento de la lista, son una subcadena del último elemento. Si este recuento es igual a la entrada n, hemos terminado.

Explicació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.

4

Pyth - 25 bytes

Filtro anidado, interno para calcular la memoria, externo para encontrar primero que requiera memoria.

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

Test Suite .


r2Ten lugar detStT
Jakube

2

Octava / 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

Pruébalo en línea


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}

Aquí hay una versión no golfista con explicación:

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

Por supuesto, esto se vuelve terriblemente lento bastante rápido. Sin embargo, el OP ha declarado que no hay límite de tiempo.


Buena solución, uso ingenioso de ay i%cpara verificar la calidad. Puede guardar dos bytes cambiando {return i}else{a.push(i)}a return i;else a.push(i)Creo que las funciones anónimas también están permitidas, lo que ahorraría dos bytes más al principio.
ETHproductions

@ETHproductions Gracias no pensé en eso. Aunque logré eliminar 7 bytes y eliminar toda la if...elselógica envolviéndolo en un bucle for.
George Reith

Wow, eso es inteligente! ¿Qué pasa si combinaste i++con i%c?
ETHproductions

@ETHproductions no funcionaría porque eso iteraría para cada valor de ay la siguiente llamada tendría un error i, por ejemplo, cuando encontramos 10 primos iterará 10 veces para cada iteración del bucle externo.
George Reith

@ETHproductions Ah, sí, originalmente quería usar la recursividad, pero habría alcanzado el límite de la pila antes de alcanzar los requisitos mínimos del OP. Ahora se refactoriza así, debería ser posible ... en él ...
George Reith

2

Brachylog (2), 12 bytes, desafío de fechas posteriores al idioma

~{ṗ≜{sṗ}ᵘkl}

Pruébalo en línea!

Anteriormente usaba 13 bytes, ᶠdpero ahora se le ha dado una abreviatura , reduciéndolo a 12. Como el lenguaje es posterior al desafío de todos modos, y la característica es una que no se agregó para este desafío en particular, también podría úsalo.

Como es habitual en Brachylog, esta es una función, no un programa completo.

Explicación

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

Esto nos da el primo más pequeño con la propiedad que queremos, porque primero verifica los valores cercanos a 0.


1

Python 2, 163 154 Bytes

Estoy demasiado cansado para jugar al golf. Espero que cuando me despierte mañana pueda mejorar esto.

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 prácticamente autoexplicativo. Recorra todos los enteros positivos, y cada vez que encuentre un primo, sume una matriz booleana que indique si el conjunto de primos menores que el actual son subcadenas del actual. Si encuentra uno con el número necesario de coincidencias, devuelva ese valor.

El tiempo de ejecución se vuelve lento para n = 11, y probablemente para la mayoría de los valores superiores a 11, específicamente, en mi computadora portátil, n = 11 tarda unos 33 segundos.


Solución limpia y elegante, a pesar de que sólo funciona en sistema de 64 bits (sistema de tipo culpa Julia para que - en la plataforma de 32 bits 2^63se evalúa como 0, por defecto Julia Int32para literales enteros en el sistema de 32 bits - sic!). El idioma más corto para hacer que la solución funcione en un sistema de 32 bits sería for i=1:uint(-1)entonces, pero cuesta 2 bytes más. Sin embargo, es difícil exigir probar soluciones de golf en todas las plataformas, por lo que +1.
pawel.boczarski

@ pawel.boczarski: puedo solucionarlo usando cambios de bits. Echa un vistazo ...
Glen O

También eliminé el "mapa", porque es redundante dentro de la suma, ya que la suma puede tomar una función que se aplica a cada término antes de sumar.
Glen O

0

Haskell, 149 147 144 bytes

(127 bytes sin contar la importdeclaración).

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, interrumpido.

El resultado anterior se produjo con la definición más larga

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

La nueva definición, 3 caracteres más corta, es mucho más lenta, solo pude obtener 5 primeros números en la secuencia antes de perder la paciencia y abortar.



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

toma datos del argumento de la línea de comando; correr con -r.

Descompostura

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
}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.