Prime Powers of Primes


16

Untuk tujuan tantangan ini, Kekuatan Utama Perdana (PPP) didefinisikan sebagai angka yang dapat didefinisikan sebagai bilangan prima dengan kekuatan bilangan prima. Misalnya, 9 adalah PPP karena dapat direpresentasikan sebagai 3 ^ 2. 81 di sisi lain bukan PPP karena hanya dapat direpresentasikan sebagai 3 ^ 4, dan 4 tidak prima. Beberapa PPP pertama adalah: 4, 8, 9, 25, 27, 32, 49, 121, 125, 128, 169, 243, 289, 343 ... Ini adalah urutan OEIS A053810

Tugas Anda:

Tulis program atau fungsi yang untuk bilangan bulat input n mengembalikan / menghasilkan PPP ke-n, baik indeks-1 atau indeks-0, mana saja yang Anda inginkan.

Memasukkan:

Integer antara 0 dan 1.000, diterima melalui metode yang masuk akal.

Keluaran:

PPP pada indeks ditunjukkan oleh input.

Kasus uji:

Ini adalah 1-diindeks, dan jika program Anda mengambil input 0-diindeks, output yang sama harus sampai pada input yang dinyatakan - 1.

3  -> 9
6  -> 32
9  -> 125

Mencetak:

Golf ini , skor terendah dalam byte menang!


Tantangan ini dikosongkan
Gryphon

Jawaban:


8

05AB1E (lawas) ,  9  7 byte

Disimpan 2 byte terima untuk @KevinCruijssen

µNÓ0Kp»

Cobalah online!

µ           # while counter_variable != input:
 N          #   push iteration counter                       e.g. 125
  Ó         #   get prime exponents                          -> [0, 0, 3]
   0K       #   filter out zeros                             -> [3]
     p      #   is prime?                                    -> [1]
      »     #   join with newlines: we use » instead of J
            #   so that [0,1] is not interpreted as truthy   -> 1
            #   implicit: if 1, increment counter_variable

Oh, saya suka penggunaan »bukannya Jsehingga 0\n1tidak menafsirkan sebagai truthy! Tetapi Anda dapat menyimpan byte dalam versi lawas 05AB1E (yang juga Anda gunakan dalam TIO), dengan menghilangkan ½, karena ini dilakukan secara implisit untuk µ(titik-peluru kedua di ujung tambang 05AB1E ini ). Juga ʒĀ}bisa 0K. 7 byte
Kevin Cruijssen

@KevinCruijssen Keren. Terima kasih!
Arnauld

5

Sekam , 10 byte

!fȯṗ§*ELpN

Cobalah online!

Penjelasan

!fȯṗ§*ELpN  Implicit input.
 f       N  Filter the natural numbers by this function:
  ȯṗ§*ELp    Argument is a number, say 27.
        p    Prime factors: [3,3,3]
       L     Length: 3
      E      Are all elements equal: 1
    §*       Multiply last two: 3
  ȯṗ         Is it prime? Yes, so 27 is kept.
!           Index into remaining numbers with input.

4

Sebenarnya , 14 byte

Berdasarkan solusi Mr. Xcoder Pyth . Saran golf diterima. Cobalah online!

;ur♂P;∙⌠iⁿ⌡MSE

Tidak melakukanolf

                Implicit input n
;ur             Duplicate and push [0..n]
   ♂P           Push the 0th to nth primes
     ;∙         Push Cartesian square of the primes
       ⌠iⁿ⌡M    Reduce each list in the Cartesian square by exponentiation
            SE  Sort the list and get the nth index (0-indexed)

4

Mathematica, 48 byte

Sort[Join@@Array[(p=Prime)@#^p@#2&,{#,#}]][[#]]&   

Cobalah online!

tapi Martin Ender punya ide yang lebih baik dan menyelamatkan 6 byte

Mathematica, 42 byte

Sort[Power@@@Prime@Range@#~Tuples~2][[#]]&   

Cobalah online!


Anda dapat menggunakan Unionbukan Joinuntuk menghindari Sort.
Martin Ender

Tapi saya pikir Outermenyimpan byte lebih dari Array:(Union@@Outer[Power,p=Prime@Range@#,p])[[#]]&
Martin Ender

Dan Tuplesbahkan lebih pendek:Sort[Power@@@Prime@Range@#~Tuples~2][[#]]&
Martin Ender


4

Angka R +, 57 byte

function(n,x=numbers::Primes(2*n))sort(outer(x,x,"^"))[n]

Cobalah online!

outer adalah fungsi yang sangat berguna.

Cukup yakin ini akan selalu berhasil. Akan membuat argumen formal ketika saya punya waktu.


4

Haskell , 95 85 80 bytes

-10 byte berkat @Lynn
-5 byte terima kasih kepada @WillNess

Berbasis 0

(!!)[x|x<-[2..],p<-[[i|i<-[2..x],all((>)2.gcd i)[2..i-1]]],or[y^e==x|e<-p,y<-p]]

Cobalah online!

Penjelasan

(!!)                    -- point-free expression, partially evaluate index-access operator
[x|x<-[2..]             -- consider all integers x>=2
,p<-                    -- let p be the list of all primes <=x
[[                      -- list of a list so p ends up as a list
i|i<-[2..x],            -- consider all i<=x to be potentially prime
all((>)2.gcd i)[2..i-1] -- if the gcd of i with all smaller integers is
                        -- smaller than 2 then this i is actually prime
 ]],or                  -- if any of the following list entries is true
[y^e==x|                -- the condition y^e==x holds for x with ...
e<-p,y<-p]              -- y and e being prime, i.e. x is a PPP,
]                       -- then add this x to the output sequence / list

f=(!!)[x|x<-[2..],or[y^e==x|y<-p x,e<-p x]]menghemat 10 byte.
Lynn

bisa untuk 82 byte oleh inlining: f=(!!)[x|x<-[2..],p<-[[i|i<-[2..x],all((>)2.gcd i)[2..i-1]]],or[y^e==x|e<-p,y<-p]]. mungkin tidak apa-apa kalau tidak menghitung f=? (tidak pernah yakin tentang aturannya).
Will Ness

Saya pernah diberitahu bahwa memang f=tidak boleh dihitung. Jadi itu akan menjadi 80 byte, dengan (!!)[x|x<-[2..],p<-[[i|i<-[2..x],all((>)2.gcd i)[2..i-1]]],or[y^e==x|e<-p,y<-p]].
Will Ness

4

Python 2 , 163 157 137 136 byte

  • Disimpan enam byte dengan menggunakan input()daripada mendefinisikan suatu fungsi.
  • Disimpan empat byte berkat Felipe Nardi Batista ; menggabungkan dua loop.
  • Disimpan enam belas byte berkat ASCII saja .
  • Menyimpan satu byte berkat ArBo .
p=input();r=i=0;e=lambda p:all(p%d for d in range(2,p))
while~-i<p:
 r+=1
 for x in range(r*r):y=x%r;x/=r;i+=x**y==r>e(x)>0<e(y)
print r

Cobalah online!


gunakan daftar sebagai gantinya untuk menyimpan byte: i=[]dan....i+=[r]*....
Felipe Nardi Batista

153 byte dengan menghapus yang keduafor
Felipe Nardi Batista

@FelipeNardiBatista Saya tidak menggunakan daftar, karena dalam iterasi pertama program mendefinisikan fungsi. Terima kasih telah melihat dan golf lebih lanjut.
Jonathan Frech

Tidak bisa Anda kembali rbukani[p]
ASCII-satunya


2

Pyth , 15 byte

e.f/^FR^fP_TSZ2

Coba di sini! atau Verifikasi lebih banyak kasus uji.

Penjelasan

ef / ^ FR ^ fP_TSZ2 - Program lengkap. Q berarti input.

 .f - Input Q pertama dengan hasil yang benar. Menggunakan variabel Z.
        fP_TSZ - Saring kisaran [1, Z] untuk bilangan prima.
       ^ 2 - kotak Cartesian. Pada dasarnya produk Cartesian dengan sendirinya.
    ^ FR - Kurangi setiap daftar dengan eksponensial.
  / - Hitung kemunculan Z di ^.
e - Elemen terakhir.

2

Javascript 137 133 byte

P=n=>{for(p=[i=2];j=++i<n*9;j^i&&p.push(i))
for(;j*j<=i;)j=i%++j?j:i
x=[]
for(i of p)
for(j of p)
x[i**j]=1
return Object.keys(x)[n]}

console.log(P(1000))
console.log(P(800))
console.log(P(9))
console.log(P(5))

** Algoritma normal (hasil 100 ms) P = n => {

  for(p=[i=2];f=++i<=n*10;!f||p.push(i))
    for(j=0;f&&(x=p[j++])*x<=i;)
      f=i%x
  x=[]
  T=0
  for(i of p)
  for(j of p)
  {
    l= i**j
    if(++T>n &&x.length<l )
    break
    x[l] = 1
  }
  return Object.keys(x)[n]
}

5
Umm, ini kode-golf , bukan kode tercepat . Oleh karena itu, kecepatan pengiriman Anda dibandingkan dengan yang lain tidak penting, karena ini dinilai dengan jumlah byte. Harap sertakan jumlah byte dan bahasa kiriman Anda dalam jawaban Anda.
Gryphon

tetapi harus memiliki setidaknya batas waktu, saya dapat golf itu, tetapi dari solusi 100 ms akan menjadi solusi 5 detik, apakah itu ok?
DanielIndie

2
Solusi ini mungkin memerlukan waktu terbatas untuk dijalankan. Satu-satunya tujuan adalah membuat kode lebih pendek.
Gryphon

2

APL (Dyalog Extended) , 15 byte

{⍵⌷∧∊∘.*⍨¯2⍭⍳⍵}

Cobalah online!

Penjelasan

{⍵⌷∧∊∘.*⍨¯2⍭⍳⍵}

                 Right argument. Our input.
{              }  Wraps the function in dfn syntax which allows us to use ⍵.
                  Range [1..⍵].
          ¯2     Get the n-th prime for each n in the range.
      ∘.*⍨        Get the prime powers of each prime.
                 Flatten the list.
                 In Extended, this is monadic sort ascending.
 ⍵⌷               Get the input-th index of the list of prime powers of primes.

2

Perl 6 , 50 byte

{(sort [X**] (^7028,^24)>>.grep(&is-prime))[$_-1]}

Cobalah online!

  (^7028,^24)            # create 2 ranges from 0
     >>.grep(&is-prime)  # grep for primes in both
 [X**] ...               # calc each exponential pair (2^2, 2^3, 2^5...)
(sort ... )[$_-1]        # sort and get value at index n-1

Alasan untuk 24 dan 7028 adalah bahwa nilai terbesar (n = 1000) adalah 49378729, yaitu 7027 ^ 2, dan kekuatan prima terbesar 2 yang sesuai dengan itu adalah 23. Jadi mencakup 2..7027 ^ 2 .. 23 termasuk semua item dalam 1000 pertama (dan banyak suku cadang).



1

PARI / GP, 48 byte

f(n)=[x|x<-[1..4^n],isprime(isprimepower(x))][n]

Jika Anda tidak menghitung f(n)=bagian, itu adalah 43 byte.


Pendekatan lain tanpa notasi yang tidak memeriksa banyak kasus yang tidak perlu:

f(n)=c=0;i=1;while(c<n,i++;isprime(isprimepower(i))&&c++);i

0

Java 8, 211 byte

import java.util.*;n->{List l=new Stack();for(int a=2,b;a<132;a++)for(b=2;b<132;b++)if(p(a)*p(b)>0)l.add(Math.pow(a,b));Collections.sort(l);return l.get(n);}int p(int n){for(int i=2;i<n;n=n%i++<1?0:n);return n;}

Metode yang sangat tidak efisien .. Pada dasarnya menghitung semua PPP dari 2 2 hingga 999 999 132 132 dan menyimpannya dalam Daftar, lalu mengurutkan Daftar itu, dan kemudian mendapatkan nitem ke-10 dari Daftar itu.

EDIT: Alih-alih menggunakan 999 999 yang menghasilkan Daftar 28.225 item, saya sekarang menggunakan 132 132 yang menghasilkan Daftar hanya 1.024 item. Ini meningkatkan kinerja sedikit, dan sangat dapat diterima karena tantangan menyatakan kita harus mendukung input dari indeks 0 hingga 1.000. (Namun, mengubah 1e3ke 132tidak memengaruhi byte-byte.)

Penjelasan:

Coba di sini.

import java.util.*;           // Required import for List, Stack and Collections

n->{                          // Method with integer as parameter and Object as return-type
  List l=new Stack();         //  List to store the PPPs in
  for(int a=2,b;a<132;a++)    //  Loop (1) from 2 to 1,000 (exclusive)
    for(b=2;b<132;b++)        //   Inner loop (2) from 2 to 1,000 (exclusive)
      if(p(a)*p(b)>0)         //    If both `a` and `b` are primes:
        l.add(Math.pow(a,b)); //     Add the power of those two to the List
                              //   End of loop (2) (implicit / single-line body)
                              //  End of loop (1) (implicit / single-line body)
  Collections.sort(l);        //  Sort the filled List
  return l.get(n);            //  Return the `n`'th item of the sorted List of PPPs
}                             // End of method

int p(int n){                 // Separated method with integer as parameter and return-type
  for(int i=2;                //  Index integer (starting at 2)
      i<n;                    //  Loop from 2 to `n` (exclusive)
    n=n%i++<1?                //   If `n` is divisible by `i`:
       0                      //    Change `n` to 0
      :                       //   Else:
       n                      //    Leave `n` the same
  );                          //  End of loop
  return n;                   //  Return `n` (which is now 0 if it wasn't a prime)
}                             // End of separated method

0

J, 21 byte

{[:/:~@,[:^/~p:@i.@>:

Fungsi anonim yang diindeks nol.

Cobalah online!

Mencoba untuk kembali ke ayunan hal-hal tetapi saya tampaknya telah melupakan semua trik untuk membuat rantai monadik yang baik.

Penjelasan singkat

Buat tabel kekuatan prima dari perdana ke-0 ke perdana pada indeks input plus 1 (untuk memperhitungkan 0). Ratakan daftar ini dan urutkan dan kemudian indeks ke dalamnya. Saya menyadari sekarang bahwa ini mungkin memberikan hasil yang salah untuk beberapa nilai karena tabel mungkin tidak cukup besar - dalam hal ini saya akan mengedit dalam nilai hardcoded seperti 1e4 yang sudah cukup. Saya tidak dapat membuktikannya dengan satu atau lain cara (lolos untuk test case yang diberikan), jadi beri tahu saya jika ini merupakan masalah.

Juga 21 byte

3 :'y{/:~,^/~p:i.>:y'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.