Asal dizine sahip asal sayılar


13

İlk 10000 asal endeksli asal sayı çıktısı veren / veren bir program veya işlev yazın.

Eğer nci asal olarak adlandırırsak p(n), bu liste

3, 5, 11, 17, 31, 41, 59 ... 1366661

Çünkü

p(p(1)) = p(2) = 3
p(p(2)) = p(3) = 5
p(p(3)) = p(5) = 11
p(p(4)) = p(7) = 17
...
p(p(10000)) = p(104729) = 1366661

Standart boşluklar yasaktır ve standart çıktı yöntemlerine izin verilir. Tam bir program, adlandırılmış bir işlev veya anonim bir işlevle yanıt verebilirsiniz.


2
Sorunları çözmek için genellikle kum havuzunda zorluklar yayınlamaya çalışmalısınız (sağ taraftaki bağlantıya bakın).
aditsu bıraktı çünkü SE EVIL

6
Çalışma zamanı için optimizasyon, bir kod golf mücadelesinde yaptığımız şey değildir; en kısa program her zaman kazanır.
lirtosiast

1
Asal aboneliği olan asal değerler: A006450 .

1
@bilbo Golf kodunun cevapları genellikle bir hafta sonra kabul edilir ve en kısa başarılı kod olarak kabul edilmelidir . Kod hızını istiyorsanız , bunun için bir etiket vardır. Kod-golf etiketi hakkında bu sayfaya bakın .
Addison Crump

1
Tüm yarışmaların objektif kazanma ölçütüne ihtiyacı vardır ; aksi takdirde konu dışı. Yanıtları boyut ve hıza göre değerlendirecekseniz, her ikisini de birleştirmenin bir yolunu açıklamanız gerekir. Bu, yarışma yayınlandıktan sonra yapılmalıdır, 14 saat ve 10 cevap sonra değil. Diğer tüm seçenek bu konuyu konu dışı olduğu için kapatmak olduğundan, hızla ilgili tüm düzenlemeleri geri aldım.
Dennis

Yanıtlar:


15

MATLAB / Oktav, 25 bayt

p=primes(2e6)
p(p(1:1e4))

Bundan daha açık olamaz.


9

Python, 72 bayt

P=p=1;l=[]
while p<82e5/6:l+=P%p*[p];P*=p*p;p+=1
for x in l:print l[x-1]

Bu, varsayılan olarak izin verilen 10000 sayı yazdırıldıktan sonra "liste dizini aralık dışı hatası" ile sona erer .

10000. prime kadar olan primerlerin bir listesini oluşturmak için Wilson Teoremi yöntemini kullanır l. Ardından, 10000. prime-prime'dan sonra sınırlar tükenene kadar, primerleri listedeki konumlarla sıfır indeksleme için 1 kaydırılır.

Buna uygun olarak, üst sınırı 1366661olarak tahmin edilebilir 82e5/6olan 1366666.6666666667bir char tasarruf.

Tek döngülü bir yöntem istiyorum, onları eklerken asal dizinli asal baskıları yazdırıyorum, ancak daha uzun görünüyor.

P=p=1;l=[]
while p<104730:
 l+=P%p*[p]
 if len(l)in P%p*l:print p
 P*=p*p;p+=1

Yazdığım çöplerden çok daha iyi. +1
Mego

Bu sadece 1229 sayı yazdırır
aditsu quit çünkü SE, EVIL

@aditsu Sanırım hatamı görüyorum. Bu kodu daha büyük sınırlarla çalıştırabiliyor musunuz?
xnor

Muhtemelen uzun zaman alacaktır: p
aditsu çıkın çünkü SE EVIL

Bence bitti think (@ ; ◇ ; @) /, doğru görünüyor
aditsu çıkın çünkü SE EVIL

8

J, 11 bayt

p:<:p:i.1e4

Asalları formatta çıktılar

3 5 11 17 31 41 59 67 83 109 127 ...

açıklama

        1e4  Fancy name for 10000
      i.     Integers from 0 to 9999
    p:       Index into primes: this gives 2 3 5 7 11 ...
  <:         Decrement each prime (J arrays are 0-based)
p:           Index into primes again

4

Mathematica, 26 25 23 bayt

Prime@Prime@Range@1*^4&

Listeyi döndüren saf işlev.


1
Başbakan Listableyani basit bir Prime@Prime@Range@1*^4&irade

Hissi biliyorum ... Her durumda, burada gördüğüm en güzel Mathematica çözümü olduğunu düşünüyorum!

Tahmin edeyim, @operatör ^yazarken olduğundan daha yüksek önceliğe sahip Range@10^4mi? Bu klasik Mathematica golf oyununu bozuyor. İyi numara!

4

Haskell, 65 bayt

p=[x|x<-[2..],all((>0).mod x)[2..x-1]]
f=take 10000$map((0:p)!!)p

Çıktılar: [3,5,11,17,31,41,59,67,83,109,127.....<five hours later>...,1366661]

Çok hızlı değil. Nasıl çalışır: psonsuz sayıda asal listedir (tüm girişleri saf olarak kontrol etmek mod x yiçin [2..x-1]). İlk atın 10000aldığınız listenin elemanlarını 0:p!!(n inci elemanını almak püzerine eşleştirilir) p. 0:İndeks işlevi ( !!) sıfır tabanlı olduğundan, bir sayı (-> ) başlatarak öğeleri almak nerede primes listesini ayarlamak zorunda .



3

AWK - 129 bayt

... oookay ... kompaktlık için puan kazanmak için çok uzun ... ama belki de hız için biraz şeref kazanabilir?

xdosya:

BEGIN{n=2;i=0;while(n<1366662){if(n in L){p=L[n];del L[n]}else{P[p=n]=++i;if(i in P)print n}j=n+p;while(j in L)j=j+p;L[j]=p;n++}}

Koşu:

$ awk -f x | nl | tail
  9991  1365913
  9992  1365983
  9993  1366019
  9994  1366187
  9995  1366327
  9996  1366433
  9997  1366483
  9998  1366531
  9999  1366609
 10000  1366661

Okunabilir:

BEGIN {
        n=2
        i=0
        while( n<1366662 ) {
                if( n in L ) {
                        p=L[n]
                        del L[n]
                } else {
                        P[p=n]=++i
                        if( i in P ) print n
                }
                j=n+p
                while( j in L ) j=j+p
                L[j]=p
                n++
        }
}

Program , zaten bir bölen olduğu bilinen yakındaki sayıları işaretlemek için Letrafında atlama bulundu primler tutarak "sayılar teyp" olarak kullanarak bir prim akışı hesaplar L. "Atlama sayıları" Lbaşlangıcından itibaren sayı olarak kesilirken bu atlama primleri ilerleyecektir .

Bant kafasını L[n]boş bırakarak, bilinen (asal) bölen olmadığı anlamına gelir.

L[n]bir değeri tutmak, bu değerin asal olduğu ve bölündüğü bilinmektedir n.

Yani ya bir baş bölen ya da yeni bir başbakan bulduk. Daha sonra bu prime L[n+m*p]boş bulunan kasette bir sonrakine ilerleyecektir .

Bu, Eratosthenes'in Eleği "Klein'in şişesinden çekilmiş" gibidir. Her zaman kaset başlangıcında hareket edersiniz. Banttan çok sayıda prim atmak yerine, zaten bulunan imleçlerin, banttan uzağa sıçrayan imleçler, boş bir konum bulunana kadar kendi değerlerinin birden çok mesafesinden başlayarak kullanırsınız.

Dış döngü, döngü başına bir ana veya bir birincil karar oluştururken, bulunan primerler Panahtar olarak sayılır ve saklanır , ancak bu (anahtar, değer) çiftinin değeri program akışı ile ilgili değildir.

Onların anahtar ise ide olur P(zaten i in P), biz p (p (i)) cins bir asal var.

Koşu:

$ time awk -f x.awk | wc -l
10000

real    0m3.675s
user    0m3.612s
sys     0m0.052s

Bu kodun harici önceden hesaplanmış ana tabloları kullanmadığını dikkate alın.

Eski iyi Thinkpad T60'ımda geçen zaman, bu yüzden hızlı çağrılmayı hak ettiğini düşünüyorum.

Debian8 / AMD64 ile mawkve gawküzerinde test edilmiştir


gawk'da iyi 129 byte: şimdi benim corei7-i870@3.6Ghz üzerinde Debian10 / AMD64 ile: Gerçek 0m2,417s kullanıcı 0m2,205s sys 0m0,042s
JeanClaudeDaudin

ile bir bayt kaydedebilirsiniz: BEGIN {n = 2; i = 0; (n <1366662) {if (L'de n) {p = L [n]; del L [n]} başka {P [p = n] = ++ i (i p) ise n} j baskı = n + p L [j] = p; (L j) j + p = iken n ++}}
JeanClaudeDaudin


1

Perl, 55 bayt

use ntheory':all';forprimes{print nth_prime$_,$/}104729

Kullanımları @DanaJ 'ın Math::Prime::Util(pragma yüklü Perl için modül ntheory). Şununla al:

cpan install Math::Prime::Util
cpan install Math::Prime::Util::GMP

0

05AB1E, 7 bayt (rakip olmayan)

Kod:

4°L<Ø<Ø

Çevrimiçi deneyin! , Not ben değiştiğini 4bir içine 2. Çok zamanınız varsa, 2sırtınızı değiştirebilirsiniz 4, ancak bu çok zaman alacaktır . Bunun için algoritmayı bağlamam gerekiyor.

Açıklama:

4°       # Push 10000 (10 ^ 4)
  L      # Create the list [1 ... 10000]
   <     # Decrement on every element, [0 ... 9999]
    Ø    # Compute the nth prime
     <   # Decrement on every element
      Ø  # Compute the nth prime
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.