Pi de Asalları Bul


30

Asal her yerde ...

Pi'nin içine saklanırlar

3.141592653 58979 3238 462643 3832 795028841 971693993751

Hadi bu astarları alalım!

Meydan okuma

Bir tamsayı girişi olarak n>0verilen ilk nrakamın içinde kaç tane asal sayı gizlendiğini öğrenin .Pi

Örnekler

Çünkü n=3içinde asalları aramalıyız [3,1,4]. 2 Astar vardır (3,31), bu yüzden kodunuz çıkmalı , 2
Çünkü n=10ilk 10 hane [3,1,4,1,5,9,2,6,5,3]ve kodunuz gizli 12olduğundan [2, 3, 5, 31, 41, 53, 59, 653, 4159, 14159, 314159, 1592653](ve bulundu!) Çıkmalı.

Test Kılıfları

giriş -> çıkış

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

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

kurallar

Kodunuz gerekir için en az Tüm asal bulmakn=50
yapabilirsiniz, Evet ilk 50 hanesini hardcode arasında Pisizin gibi eğer
Girişler cevapları hardcoding geçersizdir

Bu . Bayt cinsinden en kısa cevap kazanır!


6
"İsterseniz Pi'nin ilk 50 hanesini kodlayabilirsiniz" . İlk problem çözüldü! Şimdi, 50 basamaklı tamsayıların golf oynadığı ilkellik testi için ... O_o (Bu güzel bir meydan okuma, ancak sağlam matematik uygulamaları veya kütüphaneleri gerekli.)
Arnauld

3
@totallyhuman Bu sıralama henüz OEIS'de bile değil! Hak talebinde bulunma zamanı mı?
Sanchises

3
İlk 50 değerin kodlanmasına izin veren IMO bu zorluğa zarar verir. Bu zorluk temel olarak iki bölümden oluşuyor, 1) ilk 50 değeri sıkıştırmaya çalışın, veya 2) aslında meydan okumayı yapın.
JAD

2
Genellikle hesaplama sert / yavaş / bellek yoğun hale gelir zorlukları bu tür, içinde, bunun yerine keyfi bir sınır değeri ayarlama, teorik olarak işe program için yeterlidir ve tek kodlamak sağlanır.
JAD,

3
@BillSteihn Birkaç cevap verildikten sonra kuralların güncellenmesi bu web sitesinin ruhuna aykırıdır. Bu soruyu Sandbox'a mı gönderdin ? Sabit kodlu cevapların geleceği konusunda çok erken bir geri bildirim alırdınız.
Olivier Grégoire

Yanıtlar:


20

05AB1E ,  10  8 bayt

-2 Adnan (sayesinde bayt pvectorises)

<žsþŒÙpO

Çevrimiçi deneyin! (n = 98413'e kadar çalışacaktır ancak çok büyük sayıları ilkellik için test etme ihtiyacı nedeniyle n = 50 için bile çok yavaş olacaktır - TIO, n = 50 için 60 saniyede zaman aşımına uğrar.)

Nasıl?

<ž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 bayt için çalışması gerekir
Adnan

Ah evet pteşekkürler vectorises!
Jonathan Allan,

2
Evet! Sonunda çok kısa kod golf cevap aslında anladım! : D
Fabian Röling

11

Mathematica, 76 bayt

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

Oh, adil değil, Mathematica golfüne aşina değilim. : P (+1)
tamamen insanlık

@totallyhuman Bunu aynı anda yayınladık. bu çok garip!
J42161217

Bazı sözdizimsel püf noktalarını kullanarak cevabımı golf oynadım ama daha önce kullandığım fonksiyonları korudum. Umarım sakıncası yoktur.
tamamen insan

Tr[1^...]Bu listenin uzunluğunu bulmanın akıllıca bir yolu, güzel!
numbermaniac

6

Mathematica, 104 97 90 bayt

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

Hahahaha, bu işi yapmayı başardım. Mathematica'yı nasıl kullanacağım hakkında hiçbir fikrim yok. XD

Giriş:

[50]

1
önümde birkaç saniye yayınladın. ve cevaplarımız birbirine çok benziyor! +1
J42161217

Henüz gönderdiğiniz rakamlardan emin misiniz (rakamların yuvarlamasını kontrol edin) Python ve sympy'yi kullanarak
Jonathan Allan

@JonathanAllan 50 96Sympy en doğruluğu kapalı olabilir böylece OP, 50 basamak 93 asal içeriyor diyor ..?
tamamen insan

@JonathanAllan Sympy, olasılıksal mı yoksa deterministik bir ilkellik testi mi kullanıyor? (Mathematica'nın PrimeQ'su için aynı soru.)
Arnauld

@Arnauld iyi bir nokta, emin değilim.
Jonathan Allan

3

Python 3 , 274 237 207 194 189 bayt

Buğday Sihirbazı sayesinde -37 bayt! Mr.Xcoder sayesinde -14 bayt.

İlk 50 basamağı sabit kodlar pi fakat manuel kalan her şeyi hesaplar.

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

Çevrimiçi deneyin!



l=list("31415...)~ 40 karakter kaydetmelisiniz. Ve bu değişiklik map(str,i)sadece ile değiştirmenizi sağlar i.
AShelly


Bazı garip kodları kaldırarak 195 byte .
Bay Xcoder

len(l)
İlan

1

R, 156 123 bayt

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

Süper ilginç bir çözüm. Uygun olanı üzerinde çalışıyorum.

@Giuseppe sayesinde 33 bayt kaydedildi.

R (+ sayılar ve gmp), 198 bayt

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

Uygun çözüm. Alır ngirdi olarak.

Pi'nin numbers::dropletPi(50)ilk 50 ondalık basamağını üretmek için kullanılır. gsubondalık noktasını kaldırır. substringpi'nin mümkün olan her alt basmasını (sürpriz sürprizini) alır n.

Döndürülen liste düzleşmiş ve dönüştürülür gmpbireyin bigzbiçimi. Bu format, 50 uzunluktaki tamsayıları depolamak için gereklidir unique. Bu vektörün benzersiz değerlerini alır. Bu sonuç saklanır x.

Sonra ilkelliği kontrol ederiz. Bu çok zor, çünkü bir sürü kenar durum ve sıkıntı var:

  • Yüksek için n, bir 0pi var. Bu, başında sıfır olan alt dizilere yol açar. çıkarılması gereken s ile bunun as.bigzüretir NA.

  • Benzer bir notta, alt dize "0"çökecektir gmp::factorize, bu yüzden de kaldırılmalıdır.

  • İçin n=1, x = 3. Kendisi için uygun olan, ancak bigztemsili 3yinelenebilir, bu yüzden sapplykafası karışır ve 16 primes rapor edecek. Bu amaçla, vektörün uzunluğunun minimumunu xve içindeki primerlerin miktarını alırız .

  • gmp::isprimeBüyük sayıları güvenilir bir şekilde ele almayı başaramıyor gibi görünebilir. Bunun yerine gmp::factorizeçıktının uzunluğunu kullanır ve kontrol ederiz 1.

Sonuçta, biz çıkarırız 0ve NAçıkarırız x. Hepsini çarpanlara ayırıp xuzunluğu kontrol ediyoruz . Bunun oluşum sayısını sayar 1ve geri veririz min(occurences, length(x)).


işte burdasın! Şimdi birileri daha ilginç bir çözümle bunu aşabilir mi görelim. sen olabilirsin

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 bayt için vektörünüzü kullanın :)
Giuseppe

@Giuseppe Güzel. Bu 'sıkıştırma' kesinlikle herhangi bir yasal çözümü yenecektir.
JAD,

R kodunda kod yazmadan veya başka bir paket kullanmadan imkansız olduğunu düşünüyorum.
Giuseppe

1
Evet, biraz daha düşünebilirim. 82 kodlanmış bayt
Giuseppe

0

Jöle , 59 32 bayt

-27 bayt Outgolfer Erik sayesinde.

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

Çevrimiçi deneyin!

açıklama

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

Neden bunu cevaplarla spam yaptın?
Zacharý

Çünkü başka kimse cevap vermiyordu ve ben yine de başbakanlığa vurdum. : P
totallyhuman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.