주요 격리 번호 (골프 에디션)


21

시퀀스 A054261 입니다.

n 프라임 수납 번호 제는 제 들어 낮은 번호 n 문자열로서 소수를. 예를 들어 숫자 235 는 하위 문자열로 처음 3 개의 소수를 포함하는 가장 낮은 숫자이며 이는 3 번째 소수를 포함합니다.

처음 네 개의 소수 격리 번호가 2 , 23 , 2352357 이라는 것을 알아내는 것은 사소한 일이지만 더 흥미로워집니다. 다음 소수는 11이므로 다음 소수는 235711 이 아니지만 속성이있는 가장 작은 숫자로 정의되므로 112357 입니다.

그러나 진정한 도전은 11을 넘어 설 때 발생합니다. 다음 주요 격리 번호는 113257 입니다. 이 숫자에서는 부분 문자열 1113겹칩니다. 숫자 3도 숫자 와 겹칩니다 13.

다음 숫자가 숫자의 모든 기준을 충족해야하고 하나 이상의 하위 문자열이 필요하므로이 순서가 증가하고 있음을 쉽게 증명할 수 있습니다. 그러나 n=10및 의 결과에 표시된 것처럼 순서가 엄격하게 증가하지는 않습니다 n=11.

입력

단일 정수 n>0(0 인덱싱 한 다음 만들기 n>=0)

산출

중 하나 n일 주요 봉쇄 번호, 첫 번째가 포함되어있는리스트 n프라임 봉쇄 번호를.

지금까지 찾은 숫자는 다음과 같습니다.

 1 =>             2
 2 =>            23
 3 =>           235
 4 =>          2357
 5 =>        112357
 6 =>        113257
 7 =>       1131725
 8 =>     113171925
 9 =>    1131719235
10 =>  113171923295
11 =>  113171923295
12 => 1131719237295

참고로 n = 10하고 n = 11있기 때문에, 같은 수이다 113171923295 모든 숫자가 포함 된 가장 낮은 번호 [2,,5,7,11,13,17,19,23,29] ,뿐만 아니라 포함 된 31 .

이것은 코드 골프로 표시되어 있으므로 골프를 타십시오! 무차별 대입 솔루션은 허용되지만 코드는 이론의 모든 입력에 대해 작동해야합니다 (첫 번째 n 소수만 연결할 수 없음을 의미). 행복한 골프!

답변:


11

05AB1E , 8 바이트

∞.ΔIÅpåP

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

설명

           # from
∞          # a list of infinite positive integers
 .Δ        # find the first which satisfies the condition:
       P   # all
   IÅp     # of the first <input> prime numbers
      å    # are contained in the number

P연산자가 숫자로 소수를 검사하기위한 명시 적 맵핑을 작성 합니까 (숫자가 소수 배열에 있는지 확인하는 대신)? 이것은 아름다운 해결책입니다. 적은 명령으로 모든 솔루션을 만들 수 있을지 의심됩니다.
maxb

@maxb P는 제품입니다. 기본적으로 목록의 모든 값을 곱합니다. 는 Åp처음으로리스트를 생성 할 n소수의 양 n의 입력이고 I,이 경우이다. 는 å그들이 그것을 줄 것이다 무한한 목록의 현재 수의 경우 소수의이 목록에 각 번호를 확인합니다 1truthy과 0falsey을 위해. 따라서 제품은 기본적으로 모든 것이 진실인지 확인합니다. 모든 소수가 현재 숫자 안에있는 경우 0이 있으면 P결과도 거짓입니다. 그러나 모두가 1이면 P결과가 진실되고 루프가 중지됩니다.
케빈 크루이 센

@KevinCruijssen 설명을 주셔서 감사합니다.
maxb

1
새 버전을 사용하는 아주 좋은 해결책! 나는 8 바이트도 가지고 있었지만 05AB1E의 레거시 버전에서는 1µNIÅpåP. 05AB1E뿐만 아니라 광산에 대한 설명을 모르는 사람들을 위해 : - 카운터 변수가 1에 도달 할 때까지 (이 0에서 시작 증가 N1 점차적으로 수행 NIÅpåP- 점검을 첫 번째 <입력>의 모든 소수가 나타납니다 경우 N와 그렇다면 카운터 변수를 자동으로 증가시킵니다
.N

@ Mr.Xcoder : 실제로 첫 번째 버전이기도 했지만 (becuase 이유 X대신 1) 전에 사용할 기회가 없었기 때문에이 버전으로 전환했습니다.
Emigna

5

젤리 , 11 바이트

³ÆN€ẇ€µẠ$1#

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

단순한 무차별 대입. #Arity의 작동 방식을 완전히 모르므로 개선의 여지가있을 수 있습니다.

작동 원리

³ÆN€ẇ€µẠ$1#    Main link. Input: Index n.
         1#    Find the first natural number N that satisfies:
³ÆN€             First n primes...
    ẇ€           ...are substrings of N
      µẠ$        All of them are true

"모든 조건에 대해 true"대신 "조건이있는 필터에서 수정"이 작동 할 수 있습니다.
user202729

2
wⱮẠ¥1#ÆN€2 바이트를 절약합니다.
Dennis

5

자바 8, 143 바이트

n->{int r=1,f=1,c,i,j,k;for(;f>0;r++)for(i=2,f=c=n;c>0;c-=j>1?1+0*(f-=(r+"").contains(j+"")?1:0):0)for(j=i++,k=2;k<j;)j=j%k++<1?0:j;return~-r;}

온라인으로 사용해보십시오.
노트:

  1. 시간 초과 n=7 .
  2. 충분한 시간과 리소스가 주어지면 n=9크기 제한 int(최대 2,147,483,647) 으로 인해 최대로만 작동합니다 .
    • 변화하는 4 바이트 intA와는long , 최대 값은 아래의 출력 증가 9,223,372,036,854,775,807(대한 n=20내 생각?)
    • java.math.BigInteger최대 값 을 사용 하면 이론적으로 모든 크기로 증가 할 수 있지만 적어도 java.math.BigInteger메소드 의 상세 성으로 인해 약 +200 바이트가됩니다 .

설명:

n->{                   // Method with integer as both parameter and return-type
  int r=1,             //  Result-integer, starting at 1
      f=1,             //  Flag-integer, starting at 1 as well
      c,               //  Counter-integer, starting uninitialized
      i,j,k;           //  Index integers
  for(;f>0;            //  Loop as long as the flag is not 0 yet
      r++)             //    After every iteration, increase the result by 1
    for(i=2,           //   Reset `i` to 2
        f=c=n;         //   Reset both `f` and `c` to the input `n`
        c>0;           //   Inner loop as long as the counter is not 0 yet
        c-=            //     After every iteration, decrease the counter by:
           j>1?        //      If `j` is a prime:
            1          //       Decrease the counter by 1
            +0*(f-=    //       And also decrease the flag by:
                   (r+"").contains(j+"")?
                       //        If the result `r` contains the prime `j` as substring
                    1  //         Decrease the flag by 1
                   :   //        Else:
                    0) //         Leave the flag the same
           :           //      Else:
            0)         //       Leave the counter the same
      for(j=i++,       //    Set `j` to the current `i`,
                       //    (and increase `i` by 1 afterwards with `i++`)
          k=2;         //    Set `k` to 2 (the first prime)
          k<j;)        //    Inner loop as long as `k` is smaller than `j`
        j=j%k++<1?     //     If `j` is divisible by `k`
           0           //      Set `j` to 0
          :            //     Else:
           j;          //      Leave `j` the same
                       //    (If `j` is unchanged after this inner-most loop,
                       //     it means `j` is a prime)
  return~-r;}          //  Return `r-1` as result

5

자바 스크립트 (ES6),  105 ... 92  91 바이트

n=>(k=1,g=(s,d=k++)=>n?k%d--?g(s,d):g(d?s:s+`-!/${n--,k}/.test(n)`):eval(s+';)++n'))`for(;`

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

방법?

n

"-!/2/.test(n)-!/3/.test(n)-!/5/.test(n)-!/7/.test(n)-!/11/.test(n)..."

n

eval('for(;' + <conditions> + ';)++n')

댓글

n => (                             // main function taking n
  k = 1,                           // k = current prime candidate, initialized to 1
  g = (s,                          // g = recursive function taking the code string s
          d = k++) =>              //     and the divisor d
    n ?                            // if n is not equal to 0:
      k % d-- ?                    //   if d is not a divisor of k:
        g(s, d)                    //     recursive call to test the next divisor
      :                            //   else:
        g(                         //     recursive call with s updated and d undefined:
          d ?                      //       if d is not equal to 0 (i.e. k is composite):
            s                      //         leave s unchanged
          :                        //       else (k is prime):
            s +                    //         decrement n and add to s
            `-!/${n--,k}/.test(n)` //         the next condition based on the prime k
                                   //       the lack of 2nd argument triggers 'd = k++'
        )                          //     end of recursive call
    :                              // else (n = 0):
      eval(s + ';)++n')            //   complete and evaluate the code string
)`for(;`                           // initial call to g with s = [ "for(;" ]


4

피스 , 14 바이트

n>5

f@I`M.fP_ZQ1y`

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

f@I`M.fP_ZQ1y`     Full program. Q is the input.
f                  Find the first positive integer that fulfils the condition.
 @I`M.fP_ZQ1y`     Filtering condition, uses T to refer to the number being tested.
     .f   Q1       Starting at 1, find the first Q positive integers (.f...Q1) that
       P_Z         Are prime.
   `M              Convert all of those primes to strings.
  I                Check whether the result is invariant (i.e. doesn't change) when...
 @          y`     Intersecting this list with the powerset of T as a string.

피스 , 15 바이트

약간 빠르지 만 1 바이트 더 깁니다.

f.A/L`T`M.fP_ZQ

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

f.A/L`T`M.fP_ZQ     Full program. Q is the input.
f                   Find the first positive integer that fulfils the condition.
 .A/L`T`M.fP_ZQ     Filtering condition, uses T to refer to the number being tested.
         .f   Q     Starting at 1, find the first Q positive integers (.f...Q) that
           P_Z      Are prime.
       `M           Convert all of those primes to strings.
 .A/L               And make sure that they all (.A) occur in (/L)...
     `T             The string representation of T.


3

, 42 바이트

≔¹ηW‹LυIθ«≦⊕η¿¬Φυ¬﹪ηκ⊞υη»≔¹ηWΦυ¬№IηIκ≦⊕ηIη

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔¹ηW‹LυIθ«≦⊕η¿¬Φυ¬﹪ηκ⊞υη»

n모든 정수를 이전에 찾은 모든 소수로 시행 하여 첫 번째 소수를 만듭니다.

≔¹ηWΦυ¬№IηIκ≦⊕η

모든 소수를 하위 문자열로 포함하는 것을 찾을 때까지 모든 정수를 반복하십시오.

Iη

결과를 문자열로 캐스트하고 내재적으로 인쇄하십시오.

이 프로그램의 속도는 마지막 교체하여 바이트의 비용으로 두 배로 할 수 있습니다 ≦⊕η≦⁺²η하지만 계산에 너무 느린 여전히 n>6.


3

펄 6 , 63 59 바이트

nwellnhof 덕분에 -4 바이트

{+(1...->\a{!grep {a~~!/$^b/},(grep &is-prime,2..*)[^$_]})}

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

5 이상의 숫자에 대해 TIO에서 시간 초과되는 무차별 대입 솔루션이지만 제대로 작동한다고 확신합니다. 첫 번째 n소수 를 포함하는 첫 번째 양수를 찾습니다 . 시간이 초과되지 않는 솔루션다음과 같습니다n=6 .

설명:

{                                                             } # Anonymous code block
 first                                                    2..*  # Find the first number
       ->\a{                                            }       # Where:
            !grep     # None of
                                                   [^$_]  # The first n
                              (grep &is-prime,2..*)       # primes
                  {a~~!/$^b/},   # Are not in the current number

더 큰 숫자의 출력을 확인하거나 설명을 추가 할 수있는 방법이 있습니까? 저는 Perl에 능숙하지 않으며 확실히 골프 Perl에 능숙하지 않습니다. 입력 5에 대한 TIO에서 시간 초과가 발생하여 소수를 연결하지 않는지 실제로 확인할 수 없습니다.
maxb

@ maxb 나는 반복적으로 설명하지 않고 미리 소수를 생성하는 솔루션에 대한 링크를 추가했습니다.
조 왕



2

SAS, 149 바이트

data p;input n;z:i=1;a=0;v+1;do while(a<n);i+1;do j=2 to i while(mod(i,j));end;if j=i then do;a+1;if find(cat(v),cat(i))=0 then goto z;end;end;cards; 

다음과 같이 cards;명령문 다음에 입력이 입력됩니다 .

data p;input n;z:i=1;a=0;v+1;do while(a<n);i+1;do j=2 to i while(mod(i,j));end;if j=i then do;a+1;if find(cat(v),cat(i))=0 then goto z;end;end;cards; 
1
2
3
4
5
6
7

p결과와 함께 데이터 세트를 출력합니다.v각 입력 값에 대한 출력 행과 함께 출력합니다. 주어진 모든 테스트 사례 (SAS에서 최대 정밀도를 가진 최대 정수는 9,007,199,254,740,992)에 대해 기술적으로 작동해야하지만 n = 8에서 5 분 동안 생각하게 한 후에 포기했습니다.

설명:

data p;
input n; /* Read a line of input */

z: /* Jump label (not proud of this) */
    i=1; /* i is the current value which we are checking for primality */
    a=0; /* a is the number of primes we've found so far */
    v+1; /* v is the final output value which we'll look for substrings in */ 

    do while(a<n); /* Loop until we find the Nth prime */
        i+1; 
        do j=2 to i while(mod(i,j));end; /* Prime sieve: If mod(i,j) != 0 for all j = 2 to i, then i is prime. This could be faster by only looping to sqrt(i), but would take more bytes */
        if j=i then do; /* If i is prime (ie, we made it to the end of the prime sieve)... */
            a+1;
            if find(cat(v),cat(i))=0 then goto z; /* If i does not appear as a substring of v, then start all over again with the next v */
        end;
    end;

/* Input values, separated by newlines */
cards; 
1
2
3
4
5
6
7

1

하스켈 , 102 바이트

import Data.List
f n|x<-[2..n*n]=[a|a<-[2..],all(`isInfixOf`show a).take n$show<$>x\\((*)<$>x<*>x)]!!0

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

설명 / 언 골프

우리는 이미 Data.List수입 했으므로 그것을 잘 사용할 수도 있습니다 take n[p|p<-[2..],all((>0).mod p)[2..p-1]]. 즉, 충분한 양의 합성물을 생성하고 다음과 함께 사용합니다 (\\).

[2..n*n] \\ ( (*) <$> [2..n*n] <*> [2..n*n] )

사용 n*n접미사 때문에를π()<2로그(2). 나머지는 단순한 목록 이해입니다.

[ a | a <- [2..], all (`isInfixOf` show a) . take n $ enoughPrimes ] !!0

1

apt, 20 18 바이트

내 최고의 작품과는 거리가 먼 날 하루를 보낸 후에 일하게되어 기뻤습니다. 나중에 부저 아래로 두드리게 될 것입니다!

_õ fj ¯U e!øZs}aUÄ

시도해보십시오 -의 입력을 위해 13 초가 걸리고 7그 후에 흔들 리게됩니다 (업데이트 된 버전 5은 나를 위해 엉망 이지만 내 전화 일 수 있습니다).


@Oliver, 흠 ... 나도. 내가 게시했을 때 확실히 작동했습니다. F.h()그 자체 만으로 테스트를 실행했는데 문제가있는 것 같습니다. ETH는 뭔가를 바꿔야합니다.
얽히고 설킨

@Oliver, 아니오, 마지막 커밋은 2 일 전에 했으므로 게시 한 후에 아무것도 변경되지 않았습니다. 기묘한!
얽히고 설킨

지금 작동합니다! ¯ \ _ (ツ) _ / ¯
Oliver

@Oliver, 여전히 나를 위해 작동하지 않습니다. 위 더러와 이상해!
얽히고 설킨

업무용 컴퓨터에서 가정용 컴퓨터로 이동 한 이후로 효과가있었습니다. 정말로 이상하다!
Oliver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.