Copeland–Erdős 상수 내에서 숫자 찾기


17

배경

코플랜드 - 에르 되시 상수는 "0"으로의 연결이고 소수의 기본 10 표현으로 순서대로. 그 가치는

0.23571113171923293137414...

OEIS A033308 도 참조하십시오 .

Copeland와 Erdős는 이것이 정상적인 숫자 임을 증명했습니다 . 이것은 모든 자연수가 Copeland-Erdős 상수의 십진 확장에서 어느 시점에서 발견 될 수 있음을 의미합니다.

도전

양의 정수가 주어지면 10을 밑으로 0으로 표시하고 Copeland–Erdős 상수의 10 진수 시퀀스 내에서 처음 나타나는 색인을 출력하십시오.

모든 합리적인 입력 및 출력 형식이 허용되지만 입력 및 출력은 10 진이어야합니다. 특히 입력을 문자열로 읽을 수 있습니다. 이 경우 앞에 0을 포함하지 않는 것으로 가정 할 수 있습니다.

상수의 첫 10 진수부터 시작하여 0 또는 1을 기준으로 출력 할 수 있습니다.

실제 결과는 데이터 유형, 메모리 또는 컴퓨팅 성능에 따라 제한 될 수 있으므로 일부 테스트 사례에서 프로그램이 실패 할 수 있습니다. 그러나:

  • 모든 입력에 대해 이론적으로 작동해야합니다 (즉, 이러한 제한을 고려하지 않음).
  • 실제로 처음 네 가지 경우에는 실제로 작동해야하며 각각 1 분 이내에 결과가 생성되어야합니다.

테스트 사례

여기서 출력은 1 기반으로 제공됩니다.

13       -->         7   # Any prime is of course easy to find
997      -->        44   # ... and seems to always appear at a position less than itself
999      -->      1013   # Of course some numbers do appear later than themselves
314      -->       219   # Approximations to pi are also present
31416    -->     67858   # ... although one may have to go deep to find them
33308    -->     16304   # Number of the referred OEIS sequence: check
36398    -->     39386   # My PPCG ID. Hey, the result is a permutation of the input!
1234567  -->  11047265   # This one may take a while to find


자,이기는 기준은 무엇입니까?
user8397947

I / O에 대한 자세한 규칙을 고려하면 이것이 코드 골프라고 가정하고 태그를 적용합니다. 이것이 당신이 생각한 것이기를 바랍니다.
Dennis

@Dennis 예, 죄송합니다. 잊어 버렸습니다. 편집 해 주셔서 감사합니다
Luis Mendo

답변:


6

05AB1E , 14 바이트

0 색인 출력을 사용합니다 . osabie의 주요 기능은 매우 비효율적입니다. 암호:

[NØJD¹å#]¹.Oð¢

설명:

[       ]        # Infinite loop...
 N               # Get the iteration value
  Ø              # Get the nth prime
   J             # Join the stack
    D            # Duplicate this value
     ¹å#         # If the input is in this string, break out of the loop
         ¹.O     # Overlap function (due to a bug, I couldn't use the index command)
            ð¢   # Count spaces and implicitly print

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .


7

파이썬 2, 64 바이트

f=lambda n,k=2,m=1,s='':-~s.find(`n`)or f(n,k+1,m*k*k,s+m%k*`k`)

1 기반 인덱스를 반환합니다. Ideone에서 테스트하십시오 .


5

젤리 , 17 바이트

ÆRDFṡL}i
Ḥçßç?
çD

1 기반 인덱스를 반환합니다. 온라인으로 사용해보십시오! 또는 대부분의 테스트 사례를 확인하십시오 .

마지막 테스트 사례를 로컬에서 확인했습니다. 8 분 48 초가 걸렸습니다.

작동 원리

çD        Main link. Argument: n (integer)

 D        Decimal; yield A, the array of base 10 digits of n.
ç         Call the second helper link with arguments n and A.


Ḥçßç?     Second helper link. Left argument: n. Right argument: A.

Ḥ         Unhalve; yield 2n.
    ?     If...
   ç        the first helper link called with 2n and A returns a non-zero integer:
 ç            Return that integer.
          Else:
  ß           Recursively call the second helper link with arguments 2n and A.


ÆRDFṡL}i  First helper link. Left argument: k. Right argument: A.

ÆR        Prime range; yield the array of all primes up to k.
  DF      Convert each prime to base 10 and flatten the resulting nested array.
     L}   Yield l, the length of A.
    ṡ     Split the flattened array into overlapping slices of length l.
       i  Find the 1-based index of A in the result (0 if not found).

대체 버전, 11 바이트 (비경쟁)

ÆRVw³
ḤÇßÇ?

w이 문제가 게시 될 때 원자는 존재하지 않았다. 온라인으로 사용해보십시오!

작동 원리

ḤÇßÇ?  Main link. Argument: n (integer)

Ḥ      Unhalve; yield 2n.
    ?  If...
   Ç     the helper link called with argument 2n returns a non-zero integer:
 Ç         Return that integer.
       Else:
  ß      Recursively call the main link with argument 2n.


ÆRVw³  Helper link. Argument: k (integer)

ÆR     Prime range; yield the array of all primes up to k.
  V    Eval; concatenate all primes, forming a single integer.
    ³  Yield the first command-line argument (original value of n).
   w   Windowed index of; find the 1-based index of the digits of the result to
       the right in the digits of the result to the left (0 if not found).

4

실제로는 19 바이트

╗1`r♂Pεj╜@íu`;)╓i@ƒ

문자열을 입력으로 받아서 부분 문자열의 1 기반 인덱스를 출력합니다.

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

설명:

╗1`r♂Pεj╜@íu`;)╓i@ƒ
╗                    push input to register 0
  `r♂Pεj╜@íu`;)      push this function twice, moving one copy to the bottom of the stack:
   r♂Pεj               concatenate primes from 0 to n-1 (inclusive)
        ╜@íu           1-based index of input, 0 if not found
1              ╓     find first value of n (starting from n = 0) where the function returns a truthy value
                i@   flatten the list and move the other copy of the function on top
                  ƒ  call the function again to get the 1-based index

3

줄리아, 55 바이트

\(n,s="$n",r=searchindex(n|>primes|>join,s))=r>0?r:3n\s

1 기반 인덱스를 반환합니다. 순식간에 모든 테스트 사례를 완료합니다. 온라인으로 사용해보십시오!


프라임을 상한으로 변경하는 이유 32있습니까? 또한 0입력보다 짧은 입력 에서 작동하도록 확장 할 수있는 방법 이 ...=r>0?r:3(n+9)\s있습니까?
찰리

32내 테스트 보다 약간 빠르며 바이트 수를 늘리지 않았습니다. input의 0경우 -~n대신 사용할 수 있지만 속도가 훨씬 느립니다.
Dennis

감사합니다 -~3n\s(== (3n+1)\s)로 충분합니다.
찰리


2

J , 37 바이트

(0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)

입력은 기본 10 정수로 제공되며 출력은 0부터 시작하는 색인을 사용합니다.

용법

   f =: (0{":@[I.@E.[:;<@":@p:@i.@]) ::($:+:)
   f 1
4
   f 13
6
   f 31416
67857

설명

이 첫 번째 호출은 동사를 모나드로 취급하지만 재귀 적으로 발생할 수있는 후속 호출은이를 동사로 취급합니다.

0{":@[I.@E.[:;<@":@p:@i.@]  Input: n on LHS, k on RHS
                         ]  Get k
                      i.@   Get the range [0, 1, ..., k-1]
                   p:@      Get the kth prime of each
                ":@         Convert each to a string
              <@            Box each string
           [:;              Unbox each and concatenate to get a string of primes
     [                      Get n
  ":@                       Convert n to a string
      I.@E.                 Find the indices where the string n appears in
                            the string of primes
0{                          Take the first result and return it - This will cause an error
                            if there are no matches

(...) ::($:+:)  Input: n on RHS, k on LHS
(...)           Execute the above on n and k
      ::(    )  If there is an error, execute this instead
           +:   Double k
         $:     Call recursively on n and 2k

1
이것이 작동한다는 것을 증명할 수 있습니까?
Leaky Nun

@LeakyNun 아, 맞아요. 기술적으로 테스트 케이스에서만 작동하지만 첫 n 프라임 에서는 찾을 수 없습니다 .
마일

첫 번째 소수가 2이므로 첫 번째 소수가 1이므로 첫 번째 소수가 필요하기 때문에 n = 1에서는 작동하지 않습니다.
miles

1

PowerShell v2 +, 90 바이트

for($a="0.";!($b=$a.IndexOf($args)+1)){for(;'1'*++$i-match'^(?!(..+)\1+$)..'){$a+=$i}}$b-2

Champernowne 상수 답변 에서 숫자 찾기 의 논리를 결합하고 n 답변 을 포함하는 n 번째 소수 인 나의 인쇄의 소수 생성 방법과 결합한 다음 2인덱스를 적절하게 출력하기 위해 빼기 (즉,0. 시작시 ).

입력을 문자열로받습니다. 999내 컴퓨터에서 약 7 초 안에 하나를 찾지 만 33308꽤 오래 걸립니다 ( 편집-90 분 후에 포기했습니다 ). 이론적으로 최대 .NET 문자열 길이이므로 index [Int32]::Maxvalueaka 까지의 모든 값에 작동해야 2147483647합니다. 그러나 그렇게되기 훨씬 전에 메모리 문제가 발생할 수 있습니다.

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