Trova Primes ricorsivamente Prime


17

I Primi ricorsivamente primi sono una sequenza di numeri primi tale che

p(1) = 2
p(n) = the p(n-1)th prime

Ecco un esempio di come si potrebbe calcolare il 4 ° Prime ricorsivamente Prime.

p(4) = the p(3)th prime
p(3) = the p(2)th prime
p(2) = the p(1)th prime
p(1) = 2
p(2) = the 2nd prime
p(2) = 3
p(3) = the 3rd prime
p(3) = 5
p(4) = the 5th prime
p(4) = 11

Dovresti scrivere un programma o una funzione che quando viene dato n, genera l'ennesimo Recursively Prime Prime.

Puoi scegliere di utilizzare l'indicizzazione basata su 0 se lo desideri, nel qual caso devi indicarlo nella tua risposta.

Questo è quindi l'obiettivo è ridurre al minimo il numero di byte.


Casi test

1 -> 2
2 -> 3
3 -> 5
4 -> 11
5 -> 31
6 -> 127
7 -> 709
8 -> 5381
9 -> 52711

Voce OEIS pertinente: OEIS A007097

Risposte:


13

Oasi , 3 byte

Il programma è indicizzato 0 . Codice:

<q2

Usa la formula: a (n) = nth_prime (a (n-1) - 1) , con il caso base a (0) = 2 .

Spiegazione del codice:

  2   = a(0)

<     # Decrement a(n - 1) to get a(n - 1) - 1
 q    # prime(a(n - 1) - 1)

Provalo online!


8

In realtà , 7 byte

1@⌠DP⌡n

Provalo online!

Spiegazione:

1@⌠DP⌡n
1        push 1
 @       swap 1 with n
  ⌠DP⌡n  do the following n times:
   DP      decrement, prime at index

8

Mathematica, 16 byte

Nest[Prime,1,#]&

Funzione anonima. Prende un numero come input e restituisce un numero come output.


5

Gelatina , 5 4 byte

1 byte grazie a @Dennis.

1ÆN¡

Provalo online!

Spiegazione

1        Starting with n = 1,
 ÆN      replace n by the nth prime
   ¡     (input) times.

Non hai bisogno del .
Dennis,

@Dennis Quindi ¡accetta solo nilad come ripetizioni e, di default, si immette se non ne viene trovato nessuno?
PurkkaKoodari,

<f><n>¡accetta felicemente atomi monadici o diadici per <n>. Tuttavia, se <f>è un nilad, qualcosa deve essere sbagliato, quindi viene analizzato come <f>¡invece e accetta l'ultimo input (ultimo argomento della riga di comando, STDIN è non ce ne sono) come <n>invece.
Dennis,

5

JavaScript (ES6), 71 byte

p=(n,x=1)=>n?p(n-1,(N=y=>x?N(++y,x-=(P=z=>y%--z?P(z):z==1)(y)):y)(1)):x

Ungolfed, hai tre funzioni ricorsive separate:

P=(n,x=n)=>n%--x?P(n,x):x==1
N=(n,x=1)=>n?N(n-P(++x),x):x
p=(n,x=1)=>n?p(n-1,N(x)):x
  • P determina se n è primo;
  • N trova il n primo;
  • pfunziona in modo ricorsivo Nsui 1 ntempi di input .

4

MATL , 6 byte

1i:"Yq

Provalo online!

Spiegazione

1      % Push 1
i      % Input n
:      % Range [1 2 ... N]
"      % For each (that is, do the following N times)
  Yq   %   k-th prime, where k is the input
       % End for each (implicit)
       % Display stack (implicit)

3

R, 98 93 byte

5 byte grazie a @smci

Ecco una soluzione ricorsiva orribilmente inefficiente:

f<-function(m,n=1){j<-1;for(i in 1:n){j<-numbers::nextPrime(j)};a<-ifelse(m==0,j,f(m-1,j));a}

Uscita di prova:

f(6)
[1] 127

f(10)        ### takes almost a minute... YIKES!!!
[1] 648391

1
Puoi a<-ifelse(m==0,j,f(m-1,j))
raderti


@Giuseppe, dovresti postarlo come risposta ... che è una notevole diminuzione !!! Non l'avevo mai visto ifusato così prima ... abbastanza fico !!
Joseph Wood,

@JosephWood nah, quelli sono solo golf standard; l'algoritmo core non è cambiato. Suggerirei consigli di lettura per giocare a golf in R per alcuni suggerimenti più interessanti per il golf (anche se di solito sono terribili in stile R).
Giuseppe,

2

Bash + utility comuni, 55

Dato che stiamo facendo numeri primi ricorsivi, ecco una risposta ricorsiva:

((SHLVL-2<$1))&&primes 2|sed -n "`$0 $1`{p;q}"||echo 1

Poiché il conteggio del livello di ricorsione si basa sulla $SHLVLvariabile incorporata, la risposta può essere disattivata se si è già a pochi livelli di shell. Questo è probabilmente il motivo per cui questa risposta non funziona su TIO.


Se non va bene, ecco una risposta più convenzionale:

Bash + utility comuni, 58

for((i=$1;i--;));{
n=`primes 2|sed -n "$n{p;q}"`
}
echo $n

Provalo online .


1

Haskell , 58 byte

1-indicizzato

f 1=2;f n=[x|x<-[2..],all((>)2.gcd x)[2..x-1]]!!(f(n-1)-1)

Provalo online!

Spiegazione:

Utilizza lo stesso trucco di accesso alla lista principale con indice 0 della risposta di Adnan .
Sostanzialmente, il principio segue le specifiche altrimenti.

f 1=2; -- base case
f n= -- main case
    [x|x<-[2..],all((>)2.gcd x)[2..x-1]]             -- list of all primes
    [x|x<-[2..],                                     -- consider all numbers
                               [2..x-1]              -- consider all smaller numbers
                all((>)2.gcd x)                      -- is coprime with them?
                    (>)2.                            -- 2 is greater than
                         gcd x                       -- gcd(x,lambda input)
                                        !!(f(n-1)-1) -- access the
                                                     -- f(n-1)-th 1-indexed prime

1

05AB1E , 4 byte

ÎF<Ø

Provalo online!

Spiegazione

ÎF<Ø
Î    # Push 0 and input
 F   # Do input times...
  <   # Decrement
   Ø  # Get the nth prime (0-indexed) with n being the top of the stack

0

Meraviglia , 23 byte

p\.{1\2@:^(- p -#0 1)1P

1-indicizzati. Uso:

p\.{1\2@:^(- p -#0 1)1P}; p 3

Spiegazione

p\.{                #. Pattern matching syntax
  1\2               #. Base case p(1)=2
  @:^(- p -#0 1)1P  #. Other cases p(n)=nthprime(p(n-1)-1)
                    #. nthprime is 0-indexed
}                   #. Trailing bracket is optional in this case
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.