Những kỷ niệm đẹp của quá khứ


34

Xét một số nguyên tố p , được viết trong cơ sở 10. Bộ nhớ của p được định nghĩa là số lượng các số nguyên tố riêng biệt nhỏ hơn p được chứa dưới dạng các chuỗi con của p .

Thử thách

Cho một số nguyên n không âm làm đầu vào, tìm p nguyên tố nhỏ nhất sao cho p có bộ nhớ n . Đó là, tìm số nguyên tố nhỏ nhất với chính xác n số nguyên tố nhỏ hơn rõ ràng là chuỗi con.

Đầu vào

Đầu vào có thể được thực hiện thông qua bất kỳ định dạng tiêu chuẩn. Bạn phải hỗ trợ đầu vào lên đến n lớn nhất để đầu ra không bị tràn. Để tham khảo, 4294967291 là số nguyên tố lớn nhất trong 32 bit.

Đầu ra

Đầu ra có thể được ghi vào STDOUT hoặc được trả về từ một hàm.

Ví dụ

Số 2 có bộ nhớ 0 vì nó không chứa các số nguyên tố hoàn toàn nhỏ hơn như các chuỗi con.

Số 113 là số nguyên tố nhỏ nhất có bộ nhớ 3. Các số 3, 13 và 11 là các số nguyên tố duy nhất và không có số nguyên tố nào nhỏ hơn 113 chứa chính xác 3 số nguyên tố như các chuỗi con.

10 thuật ngữ đầu tiên của chuỗi, bắt đầu bằng n = 0, là

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

chú thích

Đây là A079397 trong OEIS.

Bảng xếp hạng

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>


Có giới hạn về thời gian chạy không?
Beta Decay

@BetaDecay Không.
Alex A.

Câu trả lời:


8

Bình thường, 22 byte

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

Trình diễn , thử nghiệm khai thác

Giải trình:

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

Bạn không thể sử dụng P_YP_Tthay vào đó }YPY}TPTsau đó?
Erik the Outgolfer

7

CJam, 33 31 30 byte

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

Đây là một chương trình đầy đủ đọc đầu vào dưới dạng đối số dòng lệnh.

Hãy thử trực tuyến trong trình thông dịch CJam .

Chạy thử nghiệm

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

Làm thế nào nó hoạt động

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 byte

li2sa{_)\{1$\#)},,3$-}{i{)_mp!}gsa+}w]W=

Dùng thử trực tuyến

Tôi chắc chắn rằng đây là một cú sốc lớn, nhưng thực tế nó dài hơn giải pháp mà Dennis đã đăng. Chà, thật ra thì không, vì tôi thậm chí còn không có hy vọng rất cao. Nhưng dù sao tôi cũng muốn cho nó một phát súng. Và vì nó hoạt động, có vẻ khá hợp lý với tôi và tôi tin rằng nó đủ khác biệt ít nhất là được quan tâm, tôi nghĩ dù sao tôi cũng sẽ đăng nó.

Ý tưởng cơ bản ở đây là tôi xây dựng một danh sách các số nguyên tố trong một vòng lặp, thêm số nguyên tố lớn hơn tiếp theo vào danh sách trong mỗi bước. Để kiểm tra chấm dứt, tôi đếm có bao nhiêu phần tử khác với phần tử cuối cùng trong danh sách là một chuỗi con của phần tử cuối cùng. Nếu số này bằng với đầu vào n, chúng ta đã hoàn thành.

Giải trình:

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 byte

Bộ lọc lồng nhau, bên trong để tính toán bộ nhớ, bên ngoài để tìm đầu tiên có bộ nhớ cần thiết.

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

Phòng thử nghiệm .


r2Tthay vìtStT
Jakube


2

JavaScript ES6, 106 byte

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}

Đây là một phiên bản không có lời giải thích:

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

Tất nhiên điều này trở nên chậm khủng khiếp khá nhanh. Tuy nhiên, OP đã tuyên bố không có giới hạn về thời gian.


Giải pháp tốt đẹp, sử dụng khéo léo ai%cđể kiểm tra tính chính. Bạn có thể lưu hai byte bằng cách thay đổi {return i}else{a.push(i)}thành return i;else a.push(i)Tôi tin rằng các hàm ẩn danh cũng được cho phép, điều này sẽ tiết kiệm thêm hai byte khi bắt đầu.
Sản xuất ETH

@ETHproductions Cảm ơn đã không nghĩ về điều đó. Mặc dù tôi đã quản lý để loại bỏ 7 byte và loại bỏ tất cả if...elselogic bằng cách gói nó trong một vòng lặp for.
George Reith

Wow, thật thông minh! Điều gì nếu bạn kết hợp i++với i%c?
Sản xuất ETH

@ETHproductions Sẽ không hoạt động vì điều đó sẽ lặp đi lặp lại cho mọi giá trị avà cuộc gọi tiếp theo sẽ sai i, ví dụ: khi chúng tôi tìm thấy 10 số nguyên tố, nó sẽ lặp lại 10 lần cho mỗi lần lặp bên ngoài.
George Reith

@ETHproductions Ah có, ban đầu tôi muốn sử dụng đệ quy nhưng nó đã đạt đến giới hạn ngăn xếp trước khi đạt các yêu cầu tối thiểu của OP. Bây giờ nó được tái cấu trúc như thế này nên có thể ... trên đó ...
George Reith

2

Brachylog (2), 12 byte, thách thức ngôn ngữ postdates

~{ṗ≜{sṗ}ᵘkl}

Hãy thử trực tuyến!

Đây trước đây là 13 byte, sử dụng ᶠd, nhưng hiện tại đã được viết tắt , giảm xuống còn 12. Vì dù sao ngôn ngữ cũng thách thức thách thức và đặc biệt là tính năng không được thêm vào cho thử thách này, tôi cũng có thể sử dụng nó.

Như thường lệ trong Brachylog, đây là một chức năng, không phải là một chương trình đầy đủ.

Giải trình

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

Điều này cho chúng ta số nguyên tố nhỏ nhất với thuộc tính mà chúng ta muốn, bởi vì kiểm tra giá trị gần 0 trước.


1

Python 2, 163 154 byte

Tôi quá mệt mỏi để chơi golf .. Hy vọng khi tôi thức dậy vào ngày mai tôi có thể cải thiện điều này.

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 byte

n->for i=1:~0>>>1 isprime(i)&&sum(j->contains("$i","$j"),primes(i-1))==n&&return i;end

Đó là thực tế tự giải thích. Lặp lại tất cả các số nguyên dương và mỗi lần tìm thấy một số nguyên tố, tính tổng một mảng boolean cho biết tập hợp các số nguyên tố nhỏ hơn số nguyên có phải là chuỗi con của số nguyên tố hiện tại hay không. Nếu nó tìm thấy một số lượng phù hợp cần thiết, trả về giá trị đó.

Thời gian chạy trở nên chậm chạp trong n = 11 và có thể đối với hầu hết các giá trị cao hơn 11 - cụ thể, trên máy tính xách tay của tôi, n = 11 mất khoảng 33 giây.


Giải pháp sạch và thanh lịch, mặc dù nó chỉ hoạt động trên hệ thống 64 bit (đổ lỗi cho hệ thống loại Julia cho điều đó - trên nền tảng 32 bit 2^63đánh giá 0, vì Julia mặc định Int32cho các số nguyên trên hệ thống 32 bit - sic!). Thành ngữ ngắn nhất để làm cho giải pháp hoạt động trên hệ thống 32 bit sẽ là for i=1:uint(-1)sau đó, nhưng nó tốn thêm 2 byte. Tuy nhiên, thật khó để yêu cầu thử nghiệm các giải pháp chơi gôn trên tất cả các nền tảng, vì vậy +1.
pawel.boczarski

@ pawel.boczarski - Tôi có thể sửa nó, sử dụng dịch chuyển bit. Hãy nhìn xem ...
Glen O

Tôi cũng đã xóa "bản đồ", vì nó là tổng thừa, vì tổng có thể lấy một hàm được áp dụng cho mỗi thuật ngữ trước khi tính tổng.
Glen O

0

Haskell, 149 147 144 byte

(127 byte không tính importkhai bá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

Mở đầu dữ liệu.List> map f [0..20]
[2,13,23,113,137,1237,1733,1373,12373,11317,23719, bị gián đoạn.

Đầu ra trên được sản xuất với định nghĩa dài hơn

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

Mới, 3 ký tự ngắn hơn, định nghĩa chậm hơn nhiều, tôi chỉ có thể nhận được 5 số đầu tiên trong chuỗi trước khi mất kiên nhẫn và hủy bỏ.



0

PHP, 124 byte

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

lấy đầu vào từ đối số dòng lệnh; chạy với -r.

phá vỡ

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
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.