Знайдіть рекурсивно прем'єр-міністри


17

Рекурсивно прем'єр - це послідовність простих ліній, така що

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

Ось приклад того, як можна розрахувати 4-го рекурсивно-прем'єр-міністра.

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

Ви повинні написати програму або функцію, яка, коли вона задана n, виводить n-й рекурсивно Prime Prime.

Ви можете скористатися індексуванням на основі 0, якщо бажаєте, в такому випадку ви повинні вказати це у своїй відповіді.

Це тому мета - мінімізувати кількість байтів.


Випробування

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

Відповідна запис OEIS : OEIS A007097

Відповіді:


13

Оазис , 3 байти

Програма 0-індексована . Код:

<q2

Використовується формула: a (n) = nth_prime (a (n-1) - 1) , з базовим випадком a (0) = 2 .

Пояснення коду:

  2   = a(0)

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

Спробуйте в Інтернеті!



8

Математика, 16 байт

Nest[Prime,1,#]&

Анонімна функція. Бере число як вхід і повертає число як вихід.


5

Желе , 5 4 байти

1 байт завдяки @Dennis.

1ÆN¡

Спробуйте в Інтернеті!

Пояснення

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

Вам це не потрібно .
Денніс

@Dennis Тож ¡приймає нілади як повторення та за замовчуванням для введення, якщо жоден не знайдений?
PurkkaKoodari

<f><n>¡радісно приймає монадійні або діадичні атоми за <n>. Однак, якщо <f>це nilad, щось має бути не так, тому воно аналізується як <f>¡замість цього і приймає останній вхід (останній аргумент командного рядка, STDIN - немає) <n>.
Денніс

5

JavaScript (ES6), 71 байт

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

Без волі, у вас є три окремі рекурсивні функції:

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 визначає, чи n є простим;
  • N знаходить n го прем'єр;
  • pрекурсивно працює Nу вхідний 1 nчас.


3

R, 98 93 байт

5 байт завдяки @smci

Ось жахливо неефективне рекурсивне рішення:

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}

Тестовий вихід:

f(6)
[1] 127

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

1
Ви можете трохи поголитись, зробившиa<-ifelse(m==0,j,f(m-1,j))
smci


@Giuseppe, ви повинні розмістити це як відповідь ... це значне зменшення !!! Я ніколи не бачив ifтаких, як раніше ... досить круто !!
Джозеф Вуд

@JosephWood так, це просто стандартні гольфи; основний алгоритм не змінився. Я б запропонував прочитати поради щодо гольфу в R для ще декількох крутих порад з гольфу (хоча зазвичай вони страшні стилі R).
Джузеппе

2

Bash + загальні комунальні послуги, 55

Оскільки ми робимо рекурсивні праймери, ось рекурсивна відповідь:

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

Оскільки підрахунок рівня рекурсії ґрунтується на $SHLVLвбудованій змінній, то відповідь може бути вимкнено, якщо у вас вже кілька рівнів оболонки. Можливо, ця відповідь не працює в TIO.


Якщо це не добре, то ось більш звичайна відповідь:

Bash + загальні комунальні послуги, 58

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

Спробуйте в Інтернеті .


1

Хаскелл , 58 байт

1-індексований

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

Спробуйте в Інтернеті!

Пояснення:

Використовує той самий трюк доступу до прем'єр-списку , який відповідає 0, як і відповідь Аднана .
По суті, прямий вгору слідує специфікації в іншому випадку.

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


0

Диво , 23 байти

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

1-індексований. Використання:

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

Пояснення

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.