最短のコードでn番目のフィボナッチプライムを見つける


8

課題はかなり単純です。

  1. 正の整数nを入力として受け取ります。
  2. nth番目のフィボナッチ素数を出力します。

入力は、関数へのパラメーターとして(および出力は戻り値になります)、またはコマンドラインから取得(およびそこに出力)できます。

注:組み込みの素数検査関数またはフィボナッチ級数ジェネレーターの使用は許可されていません。

幸運を!



1
サイズに制限はありますか?
MrZander 2012

@MrZander何のサイズ?
Inkbug 2012

入力/出力のサイズ。prime_fib(1000000000000000000)を説明する必要がありますか?限界はどこですか?
MrZander 2012

@MrZanderアルゴリズムは任意の大きな数をサポートする必要がありますが、結果が通常のintに対して大きすぎる場合、関数は範囲外の例外を発生させる可能性があります。
Inkbug 2012

回答:


2

ルビー、55歳

f=->n,a=1,b=2{n<1?a:f[n-(2..b).find{|f|b%f<1}/b,b,a+b]}

abでフィボナッチ数列の最後の2つの数値と、でこれまでに見た素数の数を追跡しながら、自分自身を再帰的に呼び出しますnnの1より大きい最小の因数をb割りb、最も近い整数に切り捨てて、0ではなく1である場合に減少しbます。これは、primeでのみ発生します。想定されているすべての素数を確認すると、を出力しますa。これは、b素数性についてテストされた最新のものです。


4

C、66

f(n,a,b){int i=2;while(a%i&&i++<a);return(n-=i==a)?f(n,b,a+b):a;}


2
関数の開始値とaそのb内部を定義する必要があると思います。
defhlt 2012

forループは短くなりませんか?(私はCをよく知りません)
Inkbug

1
65文字に減らすことができます:f(n,a,b){int i=2;while(a%i&&i++<a);return(n-=i==a)?f(n,b,a+b):a;}-@ArtemIce:a= 1とb= 2がうまくいきました。
シュナーダー2012

2
@schnaaderはもちろん機能しましたが、aとbを設定するコードはcodegolfであるためカウントする必要があります
defhlt

3
aとbの初期化コードがありません...それで、追加するだけで改善できますg(n){f(n,1,2);}か?
赤ちゃんうさぎ

3

C、8581、76

f(n){int i=1,j=0,k;for(;n;n-=k==i)for(j=i-j,i+=j,k=2;i%k&&k++<i;);return i;}
  • @Gautamから簡略化された素数チェックのコードスタイルを借用

  • 自己完結型のC関数(グローバルなし)

テスト:

main(int n,char**v){printf("%d\n",f(atoi(v[1])));}

./a.out 10
433494437

./a.out 4
13

2

Mathematica、59または63バイト

(a=b=1;Do[While[{a,b}={b,a+b};Length@Divisors@b>2],{#}];b)&
(a=b=1;Do[While[{a,b}={b,a+b};b~Mod~Range@b~Count~0>2],{#}];b)&

これらは名前のない関数でn、入力として使用され、正しいフィボナッチ素数を返します。短いバージョンではを使用しDivisorsます。これが許可されているかどうかは完全にはわかりませんが、Mathematicaの他の回答ではも使用していますFactorInteger

2つ目は、因数分解に関連する関数をまったく使用しませんが、代わりに、モジュロ演算nで生成0される整数より小さい整数の数をカウントします。このバージョンでもすべての有効な提出に勝っていますが、この回答を投稿するだけで一部の人々がGolfScript、APLまたはJで競争力のある回答を提供するようになると確信しています。;)


1

Mathematicaの147 143 141文字

f@0 = 0; f@1 = 1; f@n_ := f[n - 1] + f[n - 2]
q@1 = False; q@n_ := FactorInteger@n~MatchQ~{{_, 1}}
p = {}; k = 1; While[Length@p < n, If[q@f@k, p~AppendTo~f[k]]; k++];p[[-1]]

f フィボナッチ数の再帰的な定義です。

q 素数を検出します。

kフィボナッチのプライムイフq@f@kがTrueです。

ためn= 10、出力されます433494437


神よ、誘導...:shudders:
アコライト

@acolyte自分自身を呼び出す関数のトレースを見るのは楽しいです。
DavidC 2012

人:それは私がCompSciからフラックを取り除く必要があることを確認したコースの1つでした。
アコライト2012

1

ルビー、94 68 67

n=->j{a=b=1
while j>0
a,b=b,a+b
(2...b).all?{|m|b%m>0}&&j-=1
end
b}





Clojure、112

未ゴルフ:

(defn nk [n]
  (nth 
    (filter
      (fn[x] (every? #(> (rem x %) 0) (range 2 x)))    ; checks if number is prime
      ((fn z[a b] (lazy-seq (cons a (z b (+ a b))))) 1 2)) ; Fib seq starting from [1, 2]
    n)) ; get nth number

ゴルフ: (defn q[n](nth(filter(fn[x](every? #(>(rem x %)0)(range 2 x)))((fn z[a b](lazy-seq(cons a(z b(+ a b)))))2 3))n))


1

ハスケル108

p=2 : s [3,5..]  where
    s (p:xs) = p : s [x|x<-xs,rem x p /= 0]
f=0:1:(zipWith (+) f$tail f)
fp=intersect p f

nth番号を取得するには、それを呼び出しますfp !! n

編集:シック。間違った答えです。修正します。


0

Groovy:105(空白を含む134)

b フィボナッチ関数です。

if内のクロージャは主要なチェック関数です。更新:小さな修正

r 素数のフィボナッチ数です。

r={ n->
  c=k=0
  while(1) {
    b={a->a<2?a:b(a-1)+b(a-2)}
    f=b k++
    if({z->z<3?:(2..<z).every{z%it}}(f)&&c++==n)return f
  }
}

テストケース:

assert r(0) == 0
assert r(1) == 1
assert r(2) == 1
assert r(3) == 2
assert r(4) == 3
assert r(5) == 5
assert r(6) == 13
assert r(7) == 89
assert r(8) == 233
assert r(9) == 1597

読みやすいバージョン:

def fib(n) { 
  n < 2 ? n : fib(n-1) + fib(n-2)
}
def prime(n) {
  n < 2 ?: (2..<n).every { n % it }
}
def primeFib(n) { 
  primes = inc = 0
  while( 1 ) {
    f = fib inc++
    if (prime( f ) && primes++ == n) return f
  }
}

0

C、105(スペースあり)

動的プログラミングを使用したフィボナッチの実装:

long f(int n){int i;long b2=0,b1=1,n;if(n)return 0;for(i=2;i<n;i++){n=b1+b2;b2=b1;b1=n;}return b1+b2;}

読みやすいコード:

long f(int n)
{
  int i;
  long back2 = 0, back1 = 1;
  long next;

  if ( n == 0 ) return 0;

  for ( i=2; i<n; i++ )
  {
    next  = back1 + back2;
    back2 = back1;
    back1 = next;
  }

  return back1 + back2;
}

これはどうすれば1票を持つことができますか?質問に回答せず(素数チェックなし)、ショートバージョンもコンパイルされません
edc65

0

Pyth -29バイト

配列が長さnになるまでフィボナッチをループしますが、素数の場合にのみ配列に追加します。

J2K1W<lYQAJK,+KJJI!tPK~Y]K;eY

やや遅いが、15秒以内にn = 10に達した。おそらくもっとゴルフすることができます。

J2              J=2
K1              K=1
W        <lYQ   While length of array<input
 AJK,+KJJ       J,K=K+J,J
 I!tPK          If K prime(not builtin prime function, uses prime factorization)
  ~Y]K          append K to Y
;               End loop so next is printed
eY              last element of Y
免責事項:Pythはこの課題よりも新しいため、競合していません。

-1

JavaScript:

Number.prototype.fiboN = function()
{
var r = (Math.pow((1 + Math.sqrt(5)) / 2,this) - (Math.pow(1 - (1 + Math.sqrt(5)) / 2,this))) / Math.sqrt(5);
return r.toFixed(0);
}

alert((10).fiboN()); // = 55 assuming the serie starts with 1,1,2,3,5,8,13,...
alert((46).fiboN()); // = 1836311903

質問に答えません-55は首相ではありません。ただし、その黄金比を使用したのは良いことです。
ジェイコブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.