Znajdź rekurencyjnie liczby pierwsze

17

Rekurencyjnie liczby pierwsze są sekwencją liczb pierwszych taką, że

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

Oto przykład, w jaki sposób można obliczyć 4. Rekurencyjnie Prime 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

Powinieneś napisać program lub funkcję, która gdy otrzyma n, wyświetla n-ty Rekurencyjnie Prime Prime.

Możesz zdecydować się na użycie indeksowania opartego na 0, jeśli chcesz, w którym to przypadku musisz to zaznaczyć w swojej odpowiedzi.

To jest więc celem jest zminimalizowanie liczby bajtów.


Przypadki testowe

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

Odpowiedni wpis OEIS : OEIS A007097

Post Rock Garf Hunter
źródło

Odpowiedzi:

13

Oaza , 3 bajty

Program ma indeks 0 . Kod:

<q2

Używa wzoru: a (n) = nth_prime (a (n-1) - 1) , z przypadkiem podstawowym a (0) = 2 .

Objaśnienie kodu:

  2   = a(0)

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

Wypróbuj online!

Adnan
źródło
8

Właściwie 7 bajtów

1@⌠DP⌡n

Wypróbuj online!

Wyjaśnienie:

1@⌠DP⌡n
1        push 1
 @       swap 1 with n
  ⌠DP⌡n  do the following n times:
   DP      decrement, prime at index
Mego
źródło
8

Mathematica, 16 bajtów

Nest[Prime,1,#]&

Funkcja anonimowa. Pobiera liczbę jako dane wejściowe i zwraca liczbę jako dane wyjściowe.

LegionMammal978
źródło
5

Galaretka , 5 4 bajtów

1 bajt dzięki @Dennis.

1ÆN¡

Wypróbuj online!

Wyjaśnienie

1        Starting with n = 1,
 ÆN      replace n by the nth prime
   ¡     (input) times.
PurkkaKoodari
źródło
Nie potrzebujesz .
Dennis
@Dennis Czy ¡akceptuje tylko nilady jako powtórzenia i domyślne dane wejściowe, jeśli nie zostaną znalezione?
PurkkaKoodari
<f><n>¡z radością akceptuje monadyczne lub dyadyczne atomy <n>. Jeśli jednak <f>jest to nilad, coś musi być nie tak, więc jest ono analizowane jako <f>¡zamiast i pobiera ostatnie dane wejściowe (ostatni argument wiersza poleceń, STDIN nie istnieje) <n>zamiast tego.
Dennis
5

JavaScript (ES6), 71 bajtów

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, masz trzy oddzielne funkcje rekurencyjne:

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
  • Pokreśla, czy njest liczbą pierwszą;
  • Nznajduje tę npierwszą;
  • prekurencyjnie działa Nna 1 nczasy wejściowe .
ETHprodukcje
źródło
4

MATL , 6 bajtów

1i:"Yq

Wypróbuj online!

Wyjaśnienie

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)
Luis Mendo
źródło
3

R 98 98 bajtów

5 bajtów dzięki @smci

Oto strasznie nieefektywne rozwiązanie rekurencyjne:

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}

Wyjście testowe:

f(6)
[1] 127

f(10)        ### takes almost a minute... YIKES!!!
[1] 648391
Joseph Wood
źródło
1
Możesz trochę się ogolić, robiąca<-ifelse(m==0,j,f(m-1,j))
smci
1
74 bajty
Giuseppe,
@Giuseppe, powinieneś opublikować to jako odpowiedź ... to znaczny spadek !!! Nigdy wcześniej nie widziałem iftakiego użycia ... całkiem spoko !!
Joseph Wood,
@JosephWood nie, to tylko standardowe pola golfowe; algorytm podstawowy nie zmienił się. Sugeruję przeczytanie wskazówek do gry w golfa w R, aby uzyskać więcej fajnych wskazówek do gry w golfa (chociaż zwykle są okropne w stylu R.)
Giuseppe,
2

Bash + wspólne narzędzia, 55

Ponieważ wykonujemy rekurencyjne liczby pierwsze, oto rekurencyjna odpowiedź:

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

Ponieważ zliczanie poziomów rekurencyjnych opiera się na $SHLVLwbudowanej zmiennej, odpowiedź może być wyłączona, jeśli masz już kilka poziomów głębokości powłoki. Prawdopodobnie dlatego ta odpowiedź nie działa w TIO.


Jeśli to nie jest dobre, oto bardziej konwencjonalna odpowiedź:

Bash + wspólne narzędzia, 58

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

Wypróbuj online .

Cyfrowa trauma
źródło
1

Haskell , 58 bajtów

1-indeksowany

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

Wypróbuj online!

Wyjaśnienie:

Używa tej samej sztuczki dostępu do listy pierwszej z indeksowaniem 0 jak odpowiedź Adnana .
Zasadniczo prostota jest zgodna ze specyfikacją w przeciwnym razie.

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
SEJPM
źródło
1

05AB1E , 4 bajty

ÎF<Ø

Wypróbuj online!

Wyjaśnienie

ÎF<Ø
Î    # Push 0 and input
 F   # Do input times...
  <   # Decrement
   Ø  # Get the nth prime (0-indexed) with n being the top of the stack
Datboi
źródło
0

Cud , 23 bajty

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

1-indeksowany. Stosowanie:

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

Wyjaśnienie

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
Mama Fun Roll
źródło