xフィボナッチ数までの素数フィボナッチ数の算術平均


18

よくフィボナッチ数列と呼ばれるフィボナッチ数について聞いたことがあるはずです。このシーケンスでは、最初の2つの用語は0と1であり、最初の2つ以降のすべての数値は、先行する2つの用語の合計です。言い換えれば、F(n) = F(n-1) + F(n-2)

最初の20個のフィボナッチ数列は次のとおりです。

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

仕事:

整数を指定してx、フィボナッチ数x列までの素数フィボナッチ数の算術平均(平均)を計算します。

ルール:

  • このチャレンジのフィボナッチ数列は0と1から始まります
  • 3 < x < 40の値が大きいほど、x実行時間が非常に長くなるかオーバーフローする可能性があり、値が小さいほど出力がない
  • 1は除数が1つしかないため、素数ではありません
  • 算術平均には、小数が含まれている場合は小数を含めるか、正確な分数として表示する必要があります
  • x入力として取得することのみが許可されており、入力を取得するために必要なコードはカウントされません(例:のようなものが必要なx = input()場合は、バイトをカウントするときに考慮しないでください)

例:

例 1:についてはx=10、出力された5.7510番目のフィボナッチ数であるため、55およびプライムフィボナッチ数まで55あり2, 3, 5, 13、それらの平均ビーイング5.75

例1の説明に続いて、他の例は次のとおりです。

例 2:の場合x=15、出力は57.5

例 3:の場合x=20、出力は277.428571428571、またはその他の近似値です。この場合277.4286、たとえば、許容値です

例 4:の場合x=11、出力は22.4

例 5:の場合x=30、出力は60536.4444444444、または次のような他の近似値です。60536.444


リーダーボード:


リーダーを変更するには、短い有効なソリューションを送信してください。これはであるため、はできるだけ短くする必要があります。そのため、バイト単位の最短回答が優先されます。幸運を!


結果は、丸められた小数ではなく正確な小数として返されますか?
マーティンエンダー

もちろん、それが正しい値である限り。質問を編集:))
Xcoder氏17年

答えが分数として与えられている場合、分数を減らす必要がありますか?
DLosc

それはあなた次第です。必要に応じて減らすことができますが、それは必要だとは思いません。
ミスターXcoder

受け入れられた回答を更新してください。
エリックアウトゴルファー

回答:


5

実際には、10バイト

コード:

R♂F;Mr♂P∩æ

説明:

R            # On the input, create the range [1 .. input].
 ♂F          # Map the nth Fibonacci command over it.
   ;M        # Duplicate and get the maximum of the list.
     r       # Create the range [0 .. maximum - 1].
      ♂P     # Map the nth prime operator over each element (zero-indexed).
        ∩    # Intersection of both.
         æ   # Get the mean and implicitly display.

CP-437エンコードを使用します。オンラインでお試しください!


うわー、わずか10バイトでこのような仕事をしました。印象的!
ミスターXcoder

12

Python 2、71バイト

s=2.;a=b=c=1
exec"p=2**a%a==2;c+=p;s+=a*p;a,b=b,a+b;"*input()
print s/c

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

Pythonには便利な算術組み込み機能がないため、手作業で行います。コードは、からa,b=b,a+b開始してフィボナッチ数を反復処理しa=b=1ます。

底が2 のFermat素数性テストを使用して、素数をawhere として識別し2^a == 2 (mod a)ます。これは、可能性のある素数のみをチェックしますが、最初の40個のフィボナッチ数に含まれる誤検出はありません。

現在の素数の合計sと数cは素数に出会うたびに更新され、それらの比率(平均)が最後に出力されます。プライムチェックは失敗a=2し、入力範囲内にあることが保証されるため、合計は2から始まり、カウントは1から始まり、補正します。


8

ゼリー、11バイト

ÆḞ€ÆPÐfµS÷L

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

使い方

ÆḞ€ÆPÐfµS÷L  Main link. Argument: n (integer)

ÆḞ€          Map the Fibonacci atom over [1, ..., n].
   ÆPÐf      Filter by primality.
       µ     Begin a new chain. Argument: A (array of Fibonacci primes)
        S    Yield the sum of A.
          L  Yield the length of A.
         ÷   Compute the quotient.

11
数学組み込みの3分の2の固体。フィボナッチ、チェック。素数、チェック。算術平均、いや。
-xnor

短い回答が投稿されたため、受け入れられた回答を変更しました。
ミスターXcoder

7

Mathematica、38バイト

Mean@Select[Fibonacci@Range@#,PrimeQ]&

(* or *)

Mean@Select[Fibonacci~Array~#,PrimeQ]&

説明

Mean@Select[Fibonacci@Range@#,PrimeQ]&  
                                     &  (* For input # *)
                      Range@#           (* List {1, 2, 3, ... #} *)
            Fibonacci@                  (* Find the corresponding fibonacci numbers *)
     Select[                 ,PrimeQ]   (* Select the prime terms *)
Mean@                                   (* Take the Mean *)

2
私は、あなたがしたいと思う#とない#-1:OPは(最高の大会のように)自分のリストには、0 -インデックスを作成する必要がありますので、55は、10日のフィボナッチ数であることを述べています。入力の出力1011OP を比較します。幸いなことに、これにより実際に3バイト節約できます!
グレッグマーティン

あなたがドロップすることができます&し、置き換え#x(質問は、その入力された撮影コードが得点されていないと言う)
CalculatorFeline


5

MATL、16バイト

lOi:"yy+]vtZp)Ym

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

説明

lO     % Push 1, then 0. This way the generated numbers with indices 1, 2, 3, ...
       % will be 1, 1, 2, ... as required
i      % Input n
:"     % Do the following n times
  yy   %   Duplicate top two numbers
  +    %   Add
]      % End
v      % Concatenate all numbers into a column vector
t      % Duplicate
Zp     % Vector of logical values: true for prime numbers, false otherwise
)      % Apply that vector as an index. This keeps only prime numbers
Ym     % Mean. Implicitly display


4

最大値、49バイト

f(n):=mean(sublist(makelist(fib(x),x,n),primep));

4

プロローグ(SWI) 269の 264 254 218バイト

  • 37バイトを節約してくれたFatalizeに感謝します!
  • 9バイトを節約してくれたEmignaに感謝します!

私はもう少しバイトをゴルフできると確信しています。

X/X:-X<3.
N/R:-A is N-1,B is N-2,A/C,B/D,R is C+D.
2^0^0.
C^S^E:-G is C-1,G/M,G^Q^R,(p(M)->S=M+Q,E is R+1;S=Q,E is R).
a(X,S):-X^R^Q,S is R/Q.
p(N):-N*(N-1).
p(2).
p(3).
N*2:-N mod 2=\=0.
N*C:-N mod C=\=0,D is C-1,N*D.

以下のようにそれを実行a(15, R).するための、X = 15Rは、出力変数です。

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


より読みやすいバージョン:

fibonacci(1, 1) :- !.
fibonacci(2, 2) :- !.

fibonacci(N, R) :-
  N0 is N - 1,
  N1 is N - 2,
  fibonacci(N0, R1),
  fibonacci(N1, R2),
  R is R1 + R2.

listed(2, 0, 0) :- !.

listed(C, S, Successes) :-
  C0 is C - 1,
  fibonacci(C0, Result),
  listed(C0, S0, S1),
  (
    is_prime(Result)
    ->
      S = Result + S0, Successes is S1 + 1
    ; S = S0, Successes is S1
  ).

f(X, S) :-
  listed(X, R, Q),
  S is R / Q.

is_prime(Num) :- is_prime(Num, Num - 1).

is_prime(2).
is_prime(3).

is_prime(Num, 2) :- Num mod 2 =\= 0, !.

is_prime(Num, C) :-
  Num mod C =\= 0,
  C0 is C - 1,
  is_prime(Num, C0).

1
SWI Prologでのゴルフは黄金色(そして非常に難しい)なので、素晴らしい仕事です!
ミスターXcoder

N*C:-PPCGのhead宣言には次のようなものが許可されているので、バイトを節約できます。
致命的

@Fatalizeこのプログラミング言語は1週間ほど前に習ったばかりなので、どういう意味かわかりません:p。あなたは代用する意味するかp(N,C):-N*C:-
アドナン

@Adnanまさに!
致命的

@Fatalize Oohhh、それは本当にすてきです!ありがとう:)。
アドナン

3

ローダ98 94 93バイト

f n{z=0;i=1;j=1;s=0;seq 2,n-1|{|_|c=i+j;i=j;j=c;seq 2,c-1|{z+=1;s+=c}if[c%p>0]()for p}_[s/z]}

結果を浮動小数点数として返す関数です。

ゴルフされていないバージョン:

function f(n) {
    i = 1
    j = 1
    sum = 0
    num = 0
    seq(2, n-1) | for _ do
        /* calculate next fibonacci number: */
        c = i+j
        i = j
        j = c
        /* if it's prime: */
        {
            num += 1
            sum += c
        /* primality test: */
        } if [c%p > 0]() for p in [seq(2, c-1)]
    done
    return sum/num
}

c%p>0代わりにできますc%p!=0か?
クリチキシリトス

@KritixiLithosはい!ありがとうございました。
fergusq

3

05AB1E、13バイト

!ÅF¹£DpÏDOsg/

オンラインでお試しください! またはテストスイートとして

説明

!ÅF             # get a list of fibonacci numbers up to fac(input)
   ¹£           # take the first input elements of that list
     D          # duplicate
      p         # isprime on the copy
       Ï        # keep the fibonacci numbers which are true in the isprime list
        D       # duplicate the list of fibonacci primes
         O      # sum the list
          s     # swap the other copy to the top of the stack
           g    # get its length
            /   # divide sum by length



2

Japt、14バイト

ò@MgXÃfj
x /Ul

試して


説明

integerの暗黙的な入力U
30

ò

0以上の整数の配列を生成しUます。
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]

@   Ã

各整数を関数に渡します。

MgX

現在の要素XXあるフィボナッチ数を取得します。

[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040]

fj

f素数(j)がチェックされたときに真実を返す要素に配列をフィルターします()。結果の配列を暗黙的にvariableに割り当てますU
[2,3,5,13,89,233,1597,28657,514229]

x

加算して配列を減らします。
544828

/Ul

結果を配列の長さ(l)で除算し、結果を暗黙的に出力します。
60536.444444444445


うわー、古い質問に対する新しい答えが大好きです。他のゴルフ言語にも近いので、+ 1。
ミスターXcoder

1

perl、91バイト

$b=1;map{($a,$b)=($b,$a+$b),$p=("x"x$b)!~/^(.|(..+)\2+)$/,$s+=$b*$p,$c+=$p}2..$x;print$s/$c

modulo pseudoprimeテストがPythonの回答と同様にperlでも機能した場合、Cuoldは8バイト短くなりました。

$b=1;$s=2;map{($a,$b)=($b,$a+$b),$p=2**$b%$b==2,$s+=$b*$p,$c+=$p}2..$x;print$s/++$c

...しかし、これはperlで16以上の入力に対して間違った答えを与えます。


1

公理、104バイト

g(n)==(y:=x:=r:=0;repeat(x>n=>break;j:=fibonacci(x);x:=x+1;if prime?(j)then(r:=r+j;y:=y+1));y=0=>-1;r/y)

改変されていない、テストコードと結果

f(n)==
  y:=x:=r:=0
  repeat
     x>n=>break
     j:=fibonacci(x)
     x:=x+1
     if prime?(j) then(r:=r+j;y:=y+1)
  y=0=>-1
  r/y

(3) -> [[i,g(i)::Float] for i in [1,2,3,10,15,20,11,30,50]]
   Compiling function g with type PositiveInteger -> Fraction Integer
   (3)
   [[1.0,- 1.0], [2.0,- 1.0], [3.0,2.0], [10.0,5.75], [15.0,57.5],
    [20.0,277.4285714285 7142857], [11.0,22.4], [30.0,60536.4444444444 44444],
    [50.0,309568576.1818181818 2]]

matematica、octaveなどの言語エントリを複製しようとしますが、mean()関数をカウントしない場合は、ここで実装すると62バイトにもなります

mean(a:List Float):Any== 
    i:=1; s:=0.0
    repeat  
       if~index?(i,a)then break
       s:=s+a.i
       i:=i+1
    i=1=>[]
    s/(i-1)

--62 bytes
f(x:NNI):Any==mean(select(prime?,[fibonacci(i)for i in 1..x]))

1

JavaScriptのES6、137の 136 118 113バイト

m=

n=>(a=[],(f=x=>a[x]=x<2?x:f(--x)+f(--x))(n),eval((a=a.filter(x=>eval("for(y=x;x%--y;);y==1"))).join`+`)/a.length)

console.log(m(10))
console.log(m(15))
console.log(m(20))
console.log(m(11))
console.log(m(30))


歴史

118バイト

n=>(a=[0,1,1],(f=x=>a[--x]=a[x]||f(x)+f(--x))(n),eval((a=a.filter(x=>eval("for(y=x;x%--y;);y==1"))).join`+`)/a.length)

136バイト

n=>(a=[0,1,1],(f=x=>a[--x]=a[x]||f(x)+f(--x))(n),eval((a=a.filter(x=>x>1&&!Array(x).fill().some((i,j)=>j>1&&!(x%j)))).join`+`)/a.length)

137バイト

n=>(a=[0,1,1],(f=x=>a[--x]=a[x]||f(x)+f(--x))(n),eval((a=a.filter(x=>{d=x;while(--d>1)if(!(x%d))return 0;return x>1})).join`+`)/a.length)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.