Любящие Воспоминания Прошлых Простых чисел


34

Рассмотрим простое число р , записывается в базе 10. памяти из р определяется как число различных простых чисел строго меньше р , которые содержатся в качестве подстрок р .

Вызов

Учитывая неотрицательное целое число n в качестве входных данных, найдите наименьшее простое число p, такое что p имеет память n . То есть найдите наименьшее простое число с ровно n различными строго меньшими простыми числами в качестве подстрок.

вход

Ввод может быть принят в любом стандартном формате. Вы должны поддерживать ввод до наибольшего n , чтобы выход не переполнялся. Для справки: 4294967291 - это наибольшее простое число в 32 битах.

Выход

Вывод может быть записан в STDOUT или возвращен из функции.

Примеры

Число 2 имеет память 0, поскольку оно не содержит строго меньших простых чисел в качестве подстрок.

Число 113 - наименьшее простое число с памятью 3. Числа 3, 13 и 11 - единственные простые подстроки, и ни одно простое число меньше 113 не содержит ровно 3 простых числа в качестве подстрок.

Первые 10 членов последовательности, начиная с n = 0, являются

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

Заметка

Это A079397 в OEIS.

Leaderboard

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 Нет.
Алекс А.

Ответы:


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тогда?
Эрик Outgolfer

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=

Попробуйте онлайн

Я уверен, что это шокирует, но на самом деле это дольше, чем решение Денниса. Ну, не совсем, так как у меня даже не было очень больших надежд. Но я все равно хотел попробовать. И поскольку он работает, выглядит довольно разумно для меня, и я считаю, что он достаточно отличается, чтобы хотя бы представлять какой-то интерес, я решил опубликовать его в любом случае.

Основная идея здесь заключается в том, что я строю список простых чисел в цикле, добавляя следующее большее простое число в список на каждом шаге. Для проверки завершения я считаю, сколько элементов, кроме последнего элемента в списке, являются подстрокой последнего элемента. Если это количество равно входу 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 байт

Вложенный фильтр, внутренний для вычисления памяти, внешний, чтобы найти первый, которому требуется память.

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

Тестовый пакет .


r2TвместоtStT
Якуб


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

Конечно, это ужасно медленно, довольно быстро. Однако ФП заявил, что нет ограничений по времени.


Хорошее решение, гениальное использование aи i%cпроверка на первичность. Вы можете сохранить два байта, изменив {return i}else{a.push(i)}к return i;else a.push(i)Я считаю , анонимные функции разрешены , а также, что позволит сэкономить еще два байта в начале.
ETHпродукция

@ETHproductions Спасибо, не думал об этом. Хотя мне удалось сбрить 7 байтов и удалить всю if...elseлогику, поместив ее в цикл for.
Джордж Райт

Вау, это умно! Что делать, если вы объединили i++с i%c?
ETHproductions

@ETHproductions не будет работать, потому что это будет повторяться для каждого значения, aа следующий вызов будет иметь неправильный характер, iнапример, когда мы найдем 10 простых чисел, он будет повторяться 10 раз для каждой итерации внешнего цикла.
Джордж Райт

@ETHproductions Ах, да, я изначально хотел использовать рекурсию, но она достигла бы предела стека, прежде чем соответствовать минимальным требованиям ОП. Теперь его рефакторинг как это должно быть возможно ... на нем ...
Джордж Райт

2

Брахилог (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^63значение 0, так как по умолчанию Жюлиа Int32для целочисленных литералов на 32-битной системе - так). Тогда самый короткий способ заставить решение работать на 32-битной системе for i=1:uint(-1), но это стоит на 2 байта больше. Тем не менее, сложно требовать тестирования гольф-решений на всех платформах, так что +1.
pawel.boczarski

@ pawel.boczarski - я могу это исправить, используя сдвиг битов. Посмотрите ...
Глен О

Я также удалил «карту», ​​потому что это избыточная внутренняя сумма, поскольку сумма может принимать функцию, которая применяется к каждому члену перед суммированием.
Глен О

0

Haskell, 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, прервано.

Вышеуказанный результат был получен с более длинным определением

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
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.