과거 프라임의 추억


34

소수의 고려 P 베이스 (10)에 기록, 메모리페이지가 엄격하게 구별 소수 이하의 개수로 정의된다 , P 의 문자열로 포함되는 P .

도전

음이 아닌 정수 주어진 N 입력으로서, 가장 작은 소수 발견 P 되도록 p는 메모리 갖는 N을 . 즉, 정확히 n 개의 별개의 소수를 하위 문자열로 사용 하여 가장 작은 소수를 찾으십시오 .

입력

모든 표준 형식을 통해 입력 할 수 있습니다. 출력이 오버플로되지 않도록 최대 n 까지의 입력을 지원해야합니다 . 참고로 4294967291은 32 비트에서 가장 큰 소수입니다.

산출

출력은 STDOUT에 작성되거나 함수에서 리턴 될 수 있습니다.

소수 2는 하위 문자열로 소수를 엄격하게 포함하지 않기 때문에 메모리 0을 갖습니다.

숫자 113은 메모리 3이있는 가장 작은 소수입니다. 숫자 3, 13 및 11은 유일한 소수 부분 문자열이며 113보다 작은 소수는 부분 문자열로 정확히 3 개의 소수를 포함합니다.

n = 0으로 시작하는 시퀀스의 처음 10 개 항은 다음과 같습니다.

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>


실행 시간에 제한이 있습니까?
Beta Decay

@BetaDecay 아니.
Alex A.

답변:


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_YP_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=

온라인으로 사용해보십시오

나는 이것이 큰 충격을 줄 것이라고 확신하지만 Dennis가 게시 한 솔루션보다 실제로 더 깁니다. 글쎄, 나 자신에게 큰 희망이 없었기 때문에. 그러나 어쨌든 나는 그것을 원했다. 그리고 그것이 효과가 있기 때문에 나에게는 꽤 합리적으로 보이며 적어도 관심이있을만큼 충분히 다르다고 생각합니다. 어쨌든 게시 할 것이라고 생각했습니다.

기본 아이디어는 각 단계의 목록에 다음 큰 소수를 추가하여 루프에 소수 목록을 작성하는 것입니다. 종료를 확인하기 위해 목록의 마지막 요소 이외의 요소가 마지막 요소의 하위 문자열 인 수를 계산합니다. 이 개수가 input과 같으면 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.



2

자바 스크립트 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}

다음은 설명이없는 ungolfed 버전입니다.

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

물론 이것은 다소 빠르게 느려집니다. 그러나 OP는 시간 제한이 없다고 언급했다.


좋은 솔루션, 독창적 인 사용 ai%c프라임 확인. 익명 함수도 허용된다고 변경 하면 처음에 두 바이트를 더 절약 할 수 있습니다.로 변경 {return i}else{a.push(i)}하여 두 바이트를 절약 할 수 return i;else a.push(i)있습니다.
ETHproductions

@ETHproductions 고맙습니다. 비록 7 바이트를 면도 if...else하고 for 루프에 싸서 모든 논리를 제거 했습니다.
George Reith

와우, 똑똑하다! i++과 함께 결합하면 i%c어떻게됩니까?
ETHproductions

@ETHproductions 모든 값에 대해 반복 a되고 다음 호출에 잘못된 것이 있기 때문에 작동하지 않습니다. i예를 들어 10 개의 소수를 찾았을 때 각 외부 루프 반복에 대해 10 회 반복됩니다.
George Reith

@ETHproductions 아 예 원래 재귀를 사용하고 싶었지만 OP의 최소 요구 사항에 도달하기 전에 스택 제한에 도달했을 것입니다. 이제 그 것처럼 리팩토링이 가능해야합니다 ... 그 위에 ...
George Reith

2

Brachylog (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

파이썬 2, 163154 바이트

골프를하기에는 너무 피곤 해요. 내일 깨어 났을 때 이것을 향상시킬 수 있기를 바랍니다.

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 초가 걸립니다.


깨끗하고 우아한 해결책, 그것은 단지 (그것에 대해 비난 줄리아 형식 시스템 - 32 비트 플랫폼에서 64 비트 시스템에서 작동에도 불구하고 2^63평가하여에 0, 줄리아 기본값으로 Int3232 비트 시스템에서 정수 리터럴! - 원문). 32 비트 시스템에서 솔루션을 작동시킬 수있는 가장 짧은 관용구는 for i=1:uint(-1)2 바이트가 더 비쌉니다. 그러나 모든 플랫폼에서 골프 솔루션을 테스트하는 것은 어렵 기 때문에 +1입니다.
pawel.boczarski

@ pawel.boczarski-비트 시프 팅을 사용하여 문제를 해결할 수 있습니다. 보세요 ...
Glen O

sum은 합산하기 전에 각 항에 적용되는 함수를 취할 수 있기 때문에 "내부"는 중복되므로 "지도"를 제거했습니다.
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
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.