プライムプライムを再帰的に見つける


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番目の再帰的プライムプライムを出力するプログラムまたは関数を作成する必要があります。

希望する場合は、0ベースのインデックスを使用することを選択できます。その場合、回答でそのように指定する必要があります。

これはので、目標はバイト数を最小限にすることです。


テストケース

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

関連するOEISエントリ:OEIS A007097

回答:




8

Mathematica、16バイト

Nest[Prime,1,#]&

匿名関数。入力として数値を受け取り、出力として数値を返します。


5

ゼリー5 4バイト

@Dennisのおかげで1バイト。

1ÆN¡

オンラインでお試しください!

説明

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

あなたは必要ありません
デニス

@Dennisでは¡、繰り返しとしてniladsのみを受け入れ、何も見つからない場合はデフォルトで入力になりますか?
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

Ungolfedには、3つの独立した再帰関数があります。

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
  • Pn素数かどうかを決定します。
  • Nn番目の素数を見つける;
  • pN入力1 n時間に再帰的に実行します。


3

R、98 93バイト

@smciのおかげで5バイト

これは恐ろしく非効率的な再帰的ソリューションです:

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


@ジュゼッペ、あなたは答えとしてそれを投稿する必要があります...それはかなりの減少です!!! こんなif風に使われるのを見たことがありません...かなりクール!!
ジョセフウッド

@JosephWood nah、これらは単なる標準的なゴルフです。コアアルゴリズムは変更されませんでした。もっとクールなゴルフのヒントについては、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

Haskell、58バイト

1インデックス付き

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

オンラインでお試しください!

説明:

Adnanのanswerと同じ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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.