Tìm số nguyên tố trong Pi


30

Số nguyên tố ở khắp mọi nơi ...

họ trốn trong Pi

3.141592653 58979 3238 462643 3832 795028841 971693993751

Hãy lấy những số nguyên tố đó!

Các thách thức

Đưa ra làm đầu vào một số nguyên n>0, tìm hiểu có bao nhiêu số nguyên tố được ẩn bên trong các nchữ số đầu tiên củaPi

Ví dụ

Đối với n=3chúng ta nên tìm kiếm các số nguyên tố trong [3,1,4]. Có 2 Primes (3,31), do đó, mã của bạn nên đầu ra 2
Đối n=10, 10 chữ số đầu tiên là [3,1,4,1,5,9,2,6,5,3]và mã của bạn nên đầu ra 12[2, 3, 5, 31, 41, 53, 59, 653, 4159, 14159, 314159, 1592653]được ẩn (và tìm thấy!)

Các trường hợp thử nghiệm

đầu vào -> đầu ra

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

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

Quy tắc

Mã của bạn phải có khả năng tìm thấy tất cả các số nguyên tố ít nhất là chon=50
Vâng, bạn có thể hardcode 50 chữ số đầu tiên của Pinếu bạn thích
Entries thể xác định rõ câu trả lời là không hợp lệ

Đây là Câu trả lời ngắn gọn nhất trong byte thắng!


6
"Bạn có thể mã hóa 50 chữ số đầu tiên của Pi nếu muốn" . Vấn đề đầu tiên được giải quyết! Bây giờ đối với bài kiểm tra tính nguyên thủy được đánh gôn trên các số nguyên lên tới 50 chữ số ... O_o (Đây là một thử thách hay, nhưng có thể cần có các thư viện hoặc thư viện toán học vững chắc.)
Arnauld

3
@totallyhuman Trình tự đó thậm chí không có trong OEIS! Thời gian để yêu cầu của bạn để nổi tiếng?
Chiếm

3
IMO cho phép mã hóa 50 giá trị đầu tiên gây bất lợi cho thách thức này. Thử thách này về cơ bản là hai phần, 1) cố gắng nén 50 giá trị đầu tiên hoặc 2) thực sự thực hiện thử thách.
JAD

2
Thông thường trong các loại thử thách này, khi tính toán trở nên khó hơn / chậm hơn / tốn nhiều bộ nhớ, thì chương trình này hoạt động trên lý thuyết là đủ, thay vì đặt một mức cắt tùy ý cho phép mã hóa cứng.
JAD

3
@BillSteihn Cập nhật các quy tắc sau khi có một số câu trả lời là trái với tinh thần của trang web này. Bạn đã đăng câu hỏi này trong Sandbox chưa? Bạn sẽ có phản hồi rất sớm rằng những câu trả lời được mã hóa cứng sẽ xuất hiện.
Olivier Grégoire

Câu trả lời:


20

05AB1E ,  10  8 byte

-2 byte nhờ Adnan ( pvéc tơ)

<žsþŒÙpO

Hãy thử trực tuyến! (sẽ hoạt động tối đa n = 98413 nhưng sẽ rất chậm ngay cả đối với n = 50 do phải kiểm tra số lượng lớn như vậy cho tính nguyên thủy - TIO hết thời gian 60 giây cho n = 50.)

Làm sao?

<ž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þŒÙpOnên hoạt động với 8 byte
Adnan

À vâng vâng pcảm ơn!
Jonathan Allan

2
Vâng! Cuối cùng, một câu trả lời golf mã rất ngắn mà tôi thực sự hiểu! : D
Fabian Röling

11

Toán học, 76 byte

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

Ồ, không công bằng, tôi không quen thuộc với môn gôn Mathicala. : P (+1)
hoàn toàn là con người vào

@totallyhuman Chúng tôi đăng bài này cùng một lúc. Điều này thật kỳ lạ!
J42161217

Tôi đã đánh golf câu trả lời của mình bằng một số thủ thuật cú pháp nhưng tôi vẫn giữ các chức năng tôi đã sử dụng trước đó. Tôi hy vọng bạn không phiền.
hoàn toàn là

Tr[1^...]Đó là một cách thông minh để tìm ra độ dài của danh sách, tốt đẹp!
numbermaniac

6

Toán học, 104 97 90 byte

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

Hahahaha, tôi quản lý để thực hiện công việc này. Tôi không có ý tưởng làm thế nào để sử dụng Mathematica. XD

Đầu vào:

[50]

1
bạn đăng vài giây trước tôi. và câu trả lời của chúng tôi rất giống nhau! +1
J42161217

Bạn có chắc chắn về các số bạn vừa đăng (kiểm tra kỹ việc làm tròn các chữ số) Tôi thấy các kết quả hơi khác nhau khi sử dụng Python và sympy
Jonathan Allan

@JonathanAllan 50 96Các OP nói 50 chữ số chứa 93 số nguyên tố, vì vậy độ chính xác Sympy của có thể được tắt ..?
hoàn toàn là

@Jonathan ALLan Sympy có sử dụng thử nghiệm tính nguyên thủy xác suất hoặc xác định không? (Câu hỏi tương tự cho PrimeQ của Mathicala.)
Arnauld

@Arnauld điểm tốt, không chắc chắn.
Jonathan Allan

3

Python 3 , 274 237 207 194 189 byte

-37 byte nhờ Wheat Wizard! -14 byte nhờ Mr.Xcoder.

Hardcodes 50 chữ số đầu tiên của pi nhưng tính toán thủ công mọi thứ khác.

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

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



l=list("31415...)nên tiết kiệm ~ 40 ký tự. Và sự thay đổi đó cho phép bạn thay thế map(str,i)chỉ i.
AShelly


195 byte bằng cách loại bỏ một số mã lạ.
Ông Xcoder

194 byte bằng cách khai báolen(l)
Ông Xcoder

1

R, 156 123 byte

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()])

Giải pháp siêu thú vị. Làm việc trên một cái thích hợp.

Đã lưu 33 byte nhờ @Giuseppe.

R (+ số và gmp), 198 byte

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

Giải pháp đúng đắn. Lấy nlàm đầu vào.

Sử dụng numbers::dropletPi(50)để tạo ra 50 vị trí thập phân đầu tiên của pi. gsubxóa dấu thập phân. substringmất mọi chuỗi con có thể (bất ngờ bất ngờ) của pi lên đến n.

Danh sách trở lại là phẳng và chuyển đổi sang gmp's bigzđịnh dạng. Định dạng này là bắt buộc để lưu trữ các số nguyên có độ dài 50. uniquelấy các giá trị duy nhất của vectơ đó. Kết quả này được lưu trữ trong x.

Sau đó, chúng tôi kiểm tra tính nguyên thủy. Điều này là khó khăn, bởi vì có một loạt các trường hợp cạnh và phiền toái:

  • Đối với cao n, có một 0trong pi. Điều này dẫn đến các chuỗi con với số 0 đứng đầu. as.bigztạo ra NAs với điều đó, mà phải được loại bỏ.

  • Trên một lưu ý tương tự, chuỗi con "0"sẽ sụp đổ gmp::factorize, do đó cũng phải được gỡ bỏ.

  • Cho n=1, x = 3. Mà bản thân nó là ok, nhưng bigzđại diện của 3là lặp đi lặp lại, vì vậy sapplysẽ bị nhầm lẫn và báo cáo 16 số nguyên tố. Để kết thúc này, chúng ta lấy tối thiểu độ dài của vectơ xvà số lượng các số nguyên tố trong đó.

  • gmp::isprimedường như không thể tin cậy xử lý số lượng lớn đáng tin cậy. Vì vậy, thay vì chúng tôi sử dụng gmp::factorizevà kiểm tra độ dài của đầu ra là 1.

Vì vậy, trong tất cả, chúng tôi loại bỏ 0NAtừ x. Chúng tôi tính đến tất cả xvà kiểm tra độ dài. Chúng tôi đếm số lần xuất hiện 1và trả lại min(occurences, length(x)).


bạn đây rồi! Bây giờ hãy xem liệu ai đó ngoài kia có thể vượt qua điều này bằng một giải pháp thú vị hơn. Có thể là bạn!

sử dụng 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))thay vì vector của bạn cho 123 byte :)
Giuseppe

@Giuseppe Đẹp một. Đó là "nén" chắc chắn sẽ đánh bại bất kỳ giải pháp hợp pháp nào.
JAD

Tôi nghĩ rằng R không thể mã hóa hoặc giới thiệu gói khác vì R chỉ có int 32 bit, chắc chắn sẽ không đại diện cho số nguyên 50 chữ số.
Giuseppe

1
Vâng, tôi có thể nghĩ về điều này nhiều hơn là tốt. 82 byte được mã hóa cứng
Giuseppe

0

Thạch , 59 32 byte

-27 byte nhờ Erik the Outgolfer.

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

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

Giải trình

“...’Ṿḣ³Ẇ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

Tại sao bạn spam cái này với câu trả lời?
Zacharý

Bởi vì không ai khác đang trả lời, và dù sao tôi cũng nhấn đại diện. : P
hoàn toàn là
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.