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


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.