X Fibonacci Numarasına kadar asal Fibonacci Sayılarının aritmetik ortalaması


18

Genellikle Fibonacci Dizisi olarak adlandırılan Fibonacci Sayılarını duymuş olmalısınız . Bu dizide ilk iki terim 0 ve 1'dir ve ilk ikiden sonraki her sayı önceki iki terimin toplamıdır. Başka bir deyişle F(n) = F(n-1) + F(n-2),.

İşte ilk 20 Fibonacci numarası:

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

Görev:

Bir tam sayı verildiğinde x, birincil Fibonacci Sayılarının aritmetik ortalamasını (ortalama) xFibonacci Dizisi sayısına kadar hesaplayın .

Kurallar:

  • Fibonacci dizisi bu zorluk için 0 ve 1 ile başlar
  • 3 < x < 40, çünkü daha yüksek değerleri xbüyük yürütme sürelerine veya taşmalara neden olabilir ve daha küçük değerlerin çıktısı olmaz
  • 1 sadece DEĞİLDİR , çünkü sadece 1 bölen vardır
  • eğer aritmetik ortalama ondalık sayılar içermelidir, eğer öyleyse veya tam kesir olarak gösterilmelidir
  • yalnızca xgirdi olarak almanıza izin verilir ve girişi almak için gereken kod sayılmaz (örneğin: gibi bir şeye ihtiyacınız varsa x = input(), baytları sayarken dikkate almamalısınız)

Örnekler:

Ör. 1: For x=10, çıkışı 5.7510 Fibonacci sayı olduğu için, 55ve asal Fibonacci sayıları kadar 55olan 2, 3, 5, 13, ortalama varlık5.75

Örnek 1'deki açıklamanın ardından, diğer örnekler:

Ör. 2: için x=15, çıkış57.5

Ör. 3: için x=20çıkış, 277.428571428571ya da herhangi bir başka yakın bir tahmindir. Bu durumda 277.4286, örneğin, kabul edilen bir değerdir

Ör. 4: için x=11, çıkış22.4

Ör. 5: için x=30, çıkış 60536.4444444444ya da herhangi bir başka yakın bir değer, örneğin,60536.444


Liderler Sıralaması:


Lideri değiştirmek için daha kısa ve geçerli bir çözüm gönderin. Kodunuz mümkün olduğu kadar kısa olmalıdır, çünkü bu , bu nedenle bayttaki en kısa cevap kazanır. İyi şanslar!


Sonuç, yuvarlanmış ondalık sayı yerine tam kesir olarak döndürülebilir mi?
Martin Ender

Evet, tabii ki, doğru değer olduğu sürece. Soruyu
Bay Xcoder

Cevap kesir olarak verilirse kesir azaltılmalı mı?
DLosc

Sana bağlı. İsterseniz azaltabilirsiniz, ama bunun gerekli olduğunu düşünmüyorum.
Bay Xcoder

Lütfen kabul edilen cevabı güncelleyin.
Outgolfer Erik

Yanıtlar:


5

Aslında 10 bayt

Kod:

R♂F;Mr♂P∩æ

Açıklama:

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 kodlamasını kullanır . Çevrimiçi deneyin!


Vay be, böyle bir işi sadece 10 baytta yaptı. Etkileyici!
Bay Xcoder

12

Python 2 , 71 bayt

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

Çevrimiçi deneyin!

Python'un bunun için yararlı aritmetik yerleşikleri yoktur, bu yüzden işleri elle yaparız. Kod, Fibonacci sayıları üzerinden a,b=b,a+bbaşlayarak yinelenir a=b=1.

Fermat asallık Test tabanı 2 ile olduğu gibi asal tanımlamak için kullanılır . Bu sadece olası primeleri kontrol etmesine rağmen, yanlış pozitiflerin hiçbiri ilk 40 Fibonacci sayısında değildir.a2^a == 2 (mod a)

Mevcut toplamlar sve casal sayım , her bir asal karşılaşma ile güncellenir ve bunların oranı (ortalama) sonunda yazdırılır. Hazır kontrol kaçırdığı a=2ve giriş aralığında olduğu garanti edildiğinden, toplam 2'de başlar ve sayım telafi etmek için 1'de başlar.


8

Jöle , 11 bayt

ÆḞ€ÆPÐfµS÷L

Çevrimiçi deneyin!

Nasıl çalışır

ÆḞ€Æ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
Matematik yerleşik 3 sağlam bir 2. Fibonacci, kontrol et. Öncelik, kontrol edin. Aritmetik ortalama, hayır.
xnor

Kabul edilen cevabı değiştirdim, çünkü daha kısa bir cevap gönderildi.
Bay Xcoder

7

Mathematica, 38 bayt

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

(* or *)

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

açıklama

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
İstediğinizi #değil de düşünüyorum #-1: OP 55'in 10. Fibonacci numarası olduğunu söylüyor, bu yüzden onların listesi 0-endeksli olmalıdır (en iyi kongre gibi). Çıktılarınızı girişler 10ve 11OP ile karşılaştırın. Neyse ki bu size üç bayt kazandırır!
Greg Martin

Sen bırak &ve değiştirme #ile x(soru bu giriş alma kodu attı değildir diyor)
CalculatorFeline


5

MATL , 16 bayt

lOi:"yy+]vtZp)Ym

Çevrimiçi deneyin!

açıklama

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

Oktav , 75 71 bayt

@(n)mean((t=fix(((1+(s=5^.5)).^(x=1:n)-(1-s).^x)/s./2.^x))(isprime(t)))

Binet formülünü kullanan anonim işlev . Girdi ve çıktı işlev argümanları biçimindedir.

Çevrimiçi deneyin!


1
Binet formülünün ilginç kullanımı için +1, isprimebu meydan okuma için mükemmel olan yerleşik ile birlikte .
Bay Xcoder

4

Maxima, 49 bayt

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

4

Prolog (SWI) , 269 264 254 218 bayt

  • 37 bayt kazandığı için Fatalize'a teşekkürler !
  • 9 bayt kaydettiği için Emigna'ya teşekkürler !

Ben biraz daha bayt aşağı golf olabilir eminim.

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.

X = 15a(15, R). için olduğu gibi çalıştırın , R çıkış değişkenidir.

Çevrimiçi deneyin!


Daha okunabilir bir versiyon:

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'da golf altın (ve çok zor), çok güzel bir iş!
Bay Xcoder

Eminim N*C:-PPCG'de baş bildirimleri için bazı baytlardan tasarruf edebileceğiniz gibi şeylere izin verilir.
17'de

@Fatalize Bu programlama dilini yaklaşık bir hafta önce öğrendim, bu yüzden ne demek istediğinizden emin değilim: p. Eğer yerine ifade ediyor p(N,C):-ile N*C:-?
Adnan

@Adnan Kesinlikle!
Mart'ta

@ Oohhh'i süsle, bu gerçekten temiz! Teşekkürler :).
Adnan

3

Röda , 98 94 93 bayt

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]}

Sonucu kayan nokta sayısı olarak döndüren bir işlevdir.

Ungolfed sürümü:

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>0Bunun yerine yapabilir misin c%p!=0?
Kritixi Lithos

@KritixiLithos Evet! Teşekkür ederim.
fergusq

3

05AB1E , 13 bayt

!ÅF¹£DpÏDOsg/

Çevrimiçi deneyin! veya olarak Test takımı olarak

açıklama

!Å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

dc , 129 bayt

?sa0sb1sd0ss0sz[[lF1+sF]sqlelG!=q]si[ls+sslz1+sz]sw[lddlb+dsdrsbdsG2se0sF[lGdle%0=ile1+dse<p]dspxlF0=wla1-dsa1<c]dscxEkls1-lz1-/p

Hepsi bir arada Fibonacci sayı üreteci ve öncelik kontrolörü. Güzel.

Çevrimiçi deneyin!


2

Japt , 14 bayt

ò@MgXÃfj
x /Ul

Dene


açıklama

Örtük tamsayı girişi U.
30

ò

0 ile Ukapsayıcı arasında bir tamsayı dizisi oluşturun .
[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]

@   Ã

Her tamsayıyı bir işlevden geçirin.

MgX

Geçerli elemanın Xnerede Xolduğu Fibonacci numarasını alın .

[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

fDizi ( ), öncelik ( j) için kontrol edildiğinde doğrulukla dönen öğelere filtre uygular . Ortaya çıkan diziyi değişkene dolaylı olarak atayın U.
[2,3,5,13,89,233,1597,28657,514229]

x

Toplayarak diziyi azaltın.
544828

/Ul

Sonucu dizinin uzunluğuna ( l) bölün ve sonucu dolaylı olarak çıktılayın.
60536.444444444445


Vay be, eski soruların yeni cevaplarını seviyorum. Ayrıca diğer golf dillerine yakın, yani +1.
Bay Xcoder

1

perl, 91 bayt

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

Modulo psödoprime testi python cevabındaki gibi perl'de de işe yaradıysa Cuold 8 bayt daha kısa olmuştur:

$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

... ancak bu perl cinsinden> 16 girişi için yanlış cevap veriyor.


1

Aksiyom, 104 bayt

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)

ungolfed, test kodu ve sonuçları

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]]

i ortalama () işlevi saymazsanız, matematika, oktav vb dil girişini çoğaltmaya çalışın, burada uygulamak için 62 bayt çok iyi olurdu

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 bayt

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))


Tarih

118 bayt

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 bayt

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 bayt

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.