파이에서 프라임 찾기


30

프라임은 어디에나 있습니다 ...

그들은 파이 안에 숨어

3.141592653 58979 3238 462643 3832 795028841 971693993751

그 프라임을 얻자!

도전

integer 입력으로 주어지면 n>0첫 번째 n숫자 안에 몇 개의 소수가 숨겨져 있는지 확인하십시오.Pi

들어 n=3우리의 소수를 검색한다 [3,1,4]. 이 두 소수는 (3,31)코드를 출력한다, 그래서 2
를 들어 n=10, 처음 10 개 자리는 [3,1,4,1,5,9,2,6,5,3]당신의 코드를 출력해야 12하기 때문에 [2, 3, 5, 31, 41, 53, 59, 653, 4159, 14159, 314159, 1592653]숨겨진 (발견!)

테스트 사례

입력-> 출력

1->1  
3->2  
13->14  
22->28  
42->60  
50->93

150->197  
250->363  
500->895

규칙

코드는 최소한 모든 소수n=50찾을 수 있어야합니다.
예. 입력 하드 코딩 항목 이 마음에 들면 첫 50 자리하드 코딩 할 수 있습니다.Pi

이것은 입니다. 바이트 단위의 가장 빠른 답변이 승리합니다!


6
"원하는 경우 Pi의 처음 50 자리를 하드 코딩 할 수 있습니다 . " 첫 번째 문제가 해결되었습니다! 이제 최대 50 자리 정수까지 골프 우선 테스트에 대해 ... O_o (이것은 좋은 도전이지만, 견고한 수학 내장 또는 라이브러리가 필요할 수 있습니다.)
Arnauld

3
@totallyhuman 그 순서는 아직 OEIS에도 없습니다! 당신의 명성을 주장 할 때가 되었습니까?
Sanchises

3
처음 50 개 값의 하드 코딩을 허용하는 IMO는이 문제에 해 롭습니다. 이 과제는 기본적으로 두 부분으로 구성됩니다. 1) 처음 50 개 값을 압축하거나 2) 실제로 문제를 해결합니다.
JAD

2
보통 계산이 어려워 / 느린 / 메모리 집약적하게 도전 이러한 종류의, 대신 임의의 차단을 설정하는 이론적 작업에 프로그램에 대한 충분 하고 하드 코딩을 허용.
JAD

3
@BillSteihn 몇 가지 답변이있을 때 규칙을 업데이트하는 것은이 웹 사이트의 정신에 위배됩니다. 이 질문을 샌드 박스 에 게시 하셨습니까? 당신은 하드 코딩 답변에 와서 정말 초기 피드백을 한 것입니다.
올리비에 그레 구 아르에게

답변:


20

05AB1E ,  10  8 바이트

Adnan 덕분에 -2 바이트 ( p벡터화)

<žsþŒÙpO

온라인으로 사용해보십시오!(n = 98413까지 작동하지만 우선 순위에 대해 그러한 많은 수를 테스트해야하기 때문에 n = 50에서도 매우 느릴 것입니다-n = 50의 경우 60 초에 TIO 시간 초과.)

방법?

<žsþŒÙpO - implicitly push input, n
<        - decrement = n-1
 žs      - pi to that many decimal places (i.e. to n digits)
   þ     - only the digits (get rid of the decimal point)
    Π   - all sublists
     Ù   - unique values
      p  - is prime? (vectorises) 1 if so, 0 otherwise
       O - sum
         - implicitly print the top of the stack

<žsþŒÙpO8 바이트 작동
Adnan

p감사합니다 vectorises!
Jonathan Allan

2
예! 실제로 내가 이해하는 매우 짧은 코드 골프 답변! : D
Fabian Röling

11

수학, 76 바이트

Tr[1^Union@Select[FromDigits/@Subsequences@#&@@RealDigits[Pi,10,#],PrimeQ]]&

아, 공정하지 않다, 나는 Mathematica 골프에 익숙하지 않다. : P (+1)
완전히 인간적인

@totallyhuman 우리는 이것을 동시에 게시했습니다. 너무 이상하다!
J42161217

나는 문법적인 속임수를 사용하여 대답을 골랐지만 이전에 사용한 기능을 유지했습니다. 나는 당신이 상관하지 않기를 바랍니다.
완전히 인간적인

Tr[1^...]그것은 목록의 길이를 찾는 영리한 방법입니다.
numbermaniac '

6

Mathematica, 104 97 90 바이트

Length@DeleteDuplicates@Select[FromDigits/@Subsequences@First@RealDigits[Pi,10,#],PrimeQ]&

하 하하하, 나는이 일을 할 수 있었다. Mathematica 사용법을 잘 모릅니다. XD

입력:

[50]

1
몇 초 전에 당신이 게시했습니다. 우리의 대답은 매우 비슷합니다! +1
J42161217

방금 게시 한 숫자에 대해 확신하십니까? (숫자 반올림을 다시 확인하십시오.) Python과 sympy를 사용하여
Jonathan Allan

@JonathanAllan 50 96Sympy의 정확도가 떨어져있을 수 있도록 영업 이익은 50 자리 숫자가 93 개 소수를 포함 말한다 ..?
완전히 인간적인

@JonathanAllan Sympy는 확률 론적 또는 결정 론적 우선 순위 테스트를 사용합니까? (Mathematica 's PrimeQ에 대한 동일한 질문)
Arnauld

@Arnauld 좋은 지적, 확실하지 않습니다.
Jonathan Allan

3

파이썬 (3) , 274 (237) 207 194 189 바이트

Wheat Wizard 덕분에 -37 바이트! Mr.Xcoder 덕분에 -14 바이트.

pi 의 처음 50 자리를 하드 코드 하지만 다른 모든 것을 수동으로 계산합니다.

x=int(input());l="31415926535897932384626433832795028841971693993751"[:x]
print(sum(all(i%m for m in range(2,i))for i in{int(i)for w in range(x)for i in[l[j:j-~w]for j in range(x-w)]}-{1}))

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



l=list("31415...)~ 40자를 저장해야합니다. 그리고 그 변화는 map(str,i)단지로 대체 할 수 있습니다 i.
AShelly


이상한 코드를 제거하여 195 바이트
Mr. Xcoder

선언하여 194 바이트len(l)
Mr. Xcoder

1

R, 156123 바이트

cat(cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))[scan()])

매우 흥미로운 솔루션. 적절한 일을하고 있습니다.

@Giuseppe 덕분에 33 바이트를 절약했습니다.

R (+ 숫자 및 gmp), 198 바이트

function(n,x=unique(gmp::as.bigz(unlist(sapply(1:n,function(x)substring(gsub("[.]","",numbers::dropletPi(50)),x,x:n))))))min(length(x),sum(sapply(sapply(x[x>0&!is.na(x)],gmp::factorize),length)==1))

적절한 솔루션. 소요n 입력한다.

numbers::dropletPi(50)pi의 처음 50 자리를 생성하는 데 사용 합니다. gsub소수점을 제거합니다. substring파이의 가능한 모든 부분 문자열 (놀람 놀라움)을n .

반환 된리스트는 전개되어 gmpbigz형식으로 변환 됩니다. 이 형식은 길이가 50 인 정수를 저장하는 데 필요합니다 unique. 해당 벡터의 고유 한 값을 사용합니다. 이 결과는x .

그런 다음 우선 성을 확인합니다. 많은 경우와 성가심이 있기 때문에 까다 롭습니다.

  • 높은 n경우에는 0파이가 있습니다. 이로 인해 앞에 0이 붙는 부분 문자열이 생깁니다. as.bigzNA제거 해야하는 s를 생성합니다 .

  • 비슷한 메모에서 하위 문자열 "0"이 충돌 gmp::factorize하므로 제거해야합니다.

  • 를 들어 n=1, x = 3. 그 자체로는 괜찮지 만 bigz표현 3은 반복 가능하므로 sapply혼란스럽고 16 개의 소수를보고 할 것입니다. 이를 위해 벡터의 최소 길이 x와 소수의 소수를 취 합니다.

  • gmp::isprime큰 숫자를 안정적으로 처리 할 수 ​​없습니다. 대신 gmp::factorize출력 길이를 사용 하고 확인하는 것은 1입니다.

그래서 모든, 우리는 제거 0하고 NA부터 x. 우리는 모두를 분해 x하고 길이를 확인합니다. 발생 횟수를 세고를 1반환합니다 min(occurences, length(x)).


거기 있습니다! 이제 누군가가 더 흥미로운 해결책으로 이것을 능가 할 수 있는지 봅시다. 당신이 될 수 있습니다!

cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))123 바이트에 벡터 대신 사용 :)
Giuseppe

@ 주세페 좋은 사람. 이 '압축'은 모든 합법적 솔루션을 능가 할 것입니다.
JAD

R에는 32 비트 정수 만 있기 때문에 하드 코딩이나 다른 패키지를 도입하지 않으면 R에서 불가능하다고 생각합니다.
주세페

1
그래, 이것에 대해 더 생각할지도 모른다. 82 하드 코딩 된 바이트
Giuseppe

0

젤리 , 59 32 바이트

Outgolfer Erik 덕분에 -27 바이트.

“!⁶⁷¬,6½ạEC.wʠ€Ẉ!+Ẉfṭ¡’Ṿḣ³ẆVQÆPS

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

설명

“...’Ṿḣ³ẆVQÆPS

“...’           compressed string that evaluates to first 50 digits of pi (314159...)
     Ṿ          uneval; stringify
      ḣ³        first n characters of the string where n is the first command-line argument
        Ẇ       all sublists
         V      convert all elements to integers
          Q     deduplicate
           ÆP   convert all prime elements to 1 and others to 0
             S  sum

답변이 포함 된 스팸 메일이 된 이유는 무엇입니까?
Zacharý

아무도 대답하지 않았기 때문에 어쨌든 담당자 모자를 쳤습니다. : P
완전히 인간적인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.