Poteri Prime di Primes


16

Ai fini di questa sfida, un Potere Prime di un Prime (PPP) è definito come un numero che può essere definito come un numero primo alla potenza di un numero primo. Ad esempio, 9 è un PPP perché può essere rappresentato come 3 ^ 2. 81 d'altra parte non è un PPP perché può essere rappresentato solo come 3 ^ 4 e 4 non è un numero primo. I primi PPP sono: 4, 8, 9, 25, 27, 32, 49, 121, 125, 128, 169, 243, 289, 343 ... Questa è la sequenza OEIS A053810

Il tuo compito:

Scrivi un programma o una funzione che per un intero di input n restituisce / genera l'ennesimo PPP, 1 indicizzato o 0 indicizzato, a seconda di quale preferisci.

Ingresso:

Un numero intero compreso tra 0 e 1.000, ricevuto con qualsiasi metodo ragionevole.

Produzione:

Il PPP nell'indice indicato dall'input.

Casi test:

Questi sono 1 indicizzati e quindi, se il tuo programma accetta input 0 indicizzati, lo stesso output dovrebbe essere ottenuto per l'input dichiarato - 1.

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

punteggio:

Questo , il punteggio più basso in byte vince!


Questa sfida è stata sandbox
Gryphon

Risposte:


8

05AB1E (legacy) ,  9  7 byte

Salvato 2 byte grazie a @KevinCruijssen

µNÓ0Kp»

Provalo 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, mi piace l'uso di al »posto di Jquindi 0\n1non è interpretato come vero! Ma puoi salvare un byte nella versione legacy di 05AB1E (che hai usato anche nel tuo TIO), omettendo il ½, poiché ciò è implicitamente fatto per µ(secondo punto in questo mio suggerimento 05AB1E ). Inoltre, ʒĀ}può essere 0K. 7 byte
Kevin Cruijssen,

@KevinCruijssen Cool. Grazie!
Arnauld,

5

Buccia , 10 byte

!fȯṗ§*ELpN

Provalo online!

Spiegazione

!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

In realtà , 14 byte

Basato sulla soluzione Pyth di Mr. Xcoder . Suggerimenti di golf benvenuti. Provalo online!

;ur♂P;∙⌠iⁿ⌡MSE

Ungolfing

                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&,{#,#}]][[#]]&   

Provalo online!

ma Martin Ender ebbe un'idea migliore e salvò 6 byte

Mathematica, 42 byte

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

Provalo online!


Puoi usare Unioninvece di Joinevitare il Sort.
Martin Ender,

Ma penso che Outersalva un altro byte sopra Array:(Union@@Outer[Power,p=Prime@Range@#,p])[[#]]&
Martin Ender il

Ed Tuplesè ancora più breve:Sort[Power@@@Prime@Range@#~Tuples~2][[#]]&
Martin Ender il


4

Numeri R +, 57 byte

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

Provalo online!

outer è una funzione così utile.

Abbastanza sicuro che funzionerà sempre. Farò una discussione formale quando avrò il tempo.


4

Haskell , 95 85 80 byte

-10 byte grazie a @Lynn
-5 byte grazie a @WillNess

0-based

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

Provalo online!

Spiegazione

(!!)                    -- 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]]salva 10 byte.
Lynn,

può arrivare a 82 byte per 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]]. forse va bene quindi non contare il f=? (mai sicuro delle regole).
Will Ness,

Una volta mi è stato detto che in effetti f=non si poteva contare. Quindi saranno 80 byte, con (!!)[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

  • Hai salvato sei byte usando input()invece di definire una funzione.
  • Quattro byte salvati grazie a Felipe Nardi Batista ; fondendo due anelli.
  • Salvataggio di sedici byte grazie solo a ASCII .
  • Salvataggio di un byte grazie ad 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

Provalo online!


usa invece le liste per salvare un byte: i=[]e....i+=[r]*....
Felipe Nardi Batista,

153 byte rimuovendo il secondofor
Felipe Nardi Batista,

@FelipeNardiBatista Non ho usato le liste, poiché nella sua prima iterazione il programma stava definendo una funzione. Grazie per lo spotting e l'ulteriore golf.
Jonathan Frech,

Non puoi tornare rinvece dii[p]
ASCII il


2

Pyth , 15 byte

e.f/^FR^fP_TSZ2

Provalo qui! oppure Verifica più casi di test.

Spiegazione

ef / ^ FR ^ fP_TSZ2 - Programma completo. Q significa input.

 .f - Primi input Q con risultati veritieri. Utilizza la variabile Z.
        fP_TSZ - Filtra l'intervallo [1, Z] per i numeri primi.
       ^ 2 - Piazza cartesiana. Fondamentalmente il prodotto cartesiano con se stesso.
    ^ FR - Riduci ogni elenco per esponenziale.
  / - Conta le occorrenze di Z in ^.
e - Ultimo elemento.

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

** algoritmo normale (risultato 100ms) 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, questo è code-golf , non il codice più veloce . Pertanto, la velocità di invio rispetto ad altri non è importante, poiché viene conteggiata dal conteggio dei byte. Includi il conteggio dei byte e la lingua dell'invio nella risposta.
Gryphon,

ma dovrebbe avere almeno un limite di tempo, posso giocare a golf, ma che una soluzione da 100ms diventerà una soluzione da 5 secondi, va bene?
DanielIndie,

2
L'esecuzione della soluzione può richiedere qualsiasi tempo finito. L'unico obiettivo è ridurre il codice.
Gryphon,

2

APL (Dyalog Extended) , 15 byte

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

Provalo online!

Spiegazione

{⍵⌷∧∊∘.*⍨¯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]}

Provalo 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

Le ragioni di 24 e 7028 sono che il valore più grande (n = 1000) è 49378729, che è 7027 ^ 2, e la più grande potenza primaria di 2 che si adatta al di sotto è 23. Quindi copre 2..7027 ^ 2 .. 23 include tutti gli articoli nei primi 1000 (e molti pezzi di ricambio).



1

PARI / GP, 48 byte

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

Se non si conta la f(n)=parte, si tratta di 43 byte.


Un altro approccio senza la notazione impostata che non controlla così tanti casi inutili:

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

Metodo molto inefficiente .. Fondamentalmente calcola tutti i PPP da 2 2 a 999 999 132 132 e li memorizza in un Elenco, quindi ordina tale Elenco e quindi ottiene iln elemento da tale Elenco.

EDIT: Invece di utilizzare 999 999 che risulta in un elenco di 28.225 elementi, ora utilizzo 132 132 che risulta in un elenco di soli 1.024 elementi. Ciò migliora un po 'le prestazioni ed è perfettamente accettabile poiché la sfida afferma che dovremmo supportare un input dall'indice 0 a 1.000. (Il passaggio 1e3a 132non influisce sul conteggio dei byte, tuttavia.)

Spiegazione:

Provalo qui.

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.@>:

Funzione anonima zero indicizzata.

Provalo online!

Sto cercando di tornare all'oscillazione delle cose, ma mi sembra di aver dimenticato tutti i trucchi per creare buone catene monadiche.

Breve spiegazione

Costruisce una tabella di potenze prime dal primo al primo nell'indice dell'input più 1 (per tenere conto di 0). Appiattisce questo elenco, lo ordina e quindi gli indici in esso. Mi rendo conto ora che questo potrebbe dare risultati errati per alcuni valori poiché la tabella potrebbe non essere abbastanza grande - in tal caso modificherei un valore codificato come 1e4 che dovrebbe essere sufficiente. Non posso provarlo in un modo o nell'altro (passa per i casi di test forniti), quindi fatemi sapere se questo è un problema.

Anche 21 byte

3 :'y{/:~,^/~p:i.>:y'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.