課題はかなり単純です。
- 正の整数
n
を入力として受け取ります。 n
th番目のフィボナッチ素数を出力します。
入力は、関数へのパラメーターとして(および出力は戻り値になります)、またはコマンドラインから取得(およびそこに出力)できます。
注:組み込みの素数検査関数またはフィボナッチ級数ジェネレーターの使用は許可されていません。
幸運を!
課題はかなり単純です。
n
を入力として受け取ります。n
th番目のフィボナッチ素数を出力します。入力は、関数へのパラメーターとして(および出力は戻り値になります)、またはコマンドラインから取得(およびそこに出力)できます。
注:組み込みの素数検査関数またはフィボナッチ級数ジェネレーターの使用は許可されていません。
幸運を!
回答:
f(n,a,b){int i=2;while(a%i&&i++<a);return(n-=i==a)?f(n,b,a+b):a;}
a
そのb
内部を定義する必要があると思います。
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がうまくいきました。
g(n){f(n,1,2);}
か?
(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で競争力のある回答を提供するようになると確信しています。;)
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
。
n=->j{a=b=1
while j>0
a,b=b,a+b
(2...b).all?{|m|b%m>0}&&j-=1
end
b}
未ゴルフ:
(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))
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
}
}
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;
}
配列が長さ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はこの課題よりも新しいため、競合していません。
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