Невідомі спогади про минулі періоди


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.

Таблиця лідерів

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

Відповіді:


8

Піт, 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тоді?
Ерік Аутгольфер

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
Jakube


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)Я вважаю , анонімні функції дозволені , а також, що дозволить заощадити ще два байта на початку.
ETHproductions

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

Ого, це розумно! Що робити , якщо ви комбінували i++з i%c?
ETHproductions

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

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

2

Брахілог (2), 12 байт, виклик після публікації мови

~{ṗ≜{sṗ}ᵘkl}

Спробуйте в Інтернеті!

Раніше це було 13 байтів, використовуючи ᶠd, але тепер йому було надано абревіатуру , скорочуючи її до 12. Оскільки мова все одно відкладає виклик, а функція така, яка не була додана для цього виклику, я також можу використай це.

Як зазвичай у Брахілозі, це функція, а не повна програма.

Пояснення

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

Пітон 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 - я можу це виправити, використовуючи біт-зсув. Подивіться ...
Glen O

Я також видалив "карту", оскільки вона надмірна всередині суми, оскільки сума може приймати функцію, яка застосовується до кожного терміна перед підсумовуванням.
Глен О

0

Хаскелл, 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.