Średnia arytmetyczna liczb pierwszych Fibonacciego do x liczby Fibonacciego

18

Powinieneś wiedzieć o liczbach Fibonacciego , często nazywanych Sekwencją Fibonacciego. W tej sekwencji pierwsze dwa terminy to 0 i 1, a każda liczba po pierwszych dwóch jest sumą dwóch poprzednich. Innymi słowy F(n) = F(n-1) + F(n-2).

Oto pierwsze 20 liczb Fibonacciego:

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

Zadanie:

Biorąc pod uwagę liczbę całkowitą x, oblicz średnią arytmetyczną (średnią) pierwszych liczb Fibonacciego do xliczby sekwencji Fibonacciego.

Zasady:

  • sekwencja Fibonacciego rozpoczyna się od 0 i 1 dla tego wyzwania
  • 3 < x < 40, ponieważ wyższe wartości xmogą powodować ogromny czas wykonywania lub przepełnienia, a mniejsze wartości nie dają wyniku
  • 1 NIE jest liczbą pierwszą, ponieważ ma tylko 1 dzielnik
  • średnia arytmetyczna powinna obejmować liczby dziesiętne, jeśli tak jest, lub powinna być wyświetlana jako ułamek dokładny
  • możesz brać tylko xjako dane wejściowe, a kod potrzebny do ich wprowadzenia się nie liczy (np .: jeśli potrzebujesz czegoś takiego x = input(), nie powinieneś brać tego pod uwagę przy liczeniu bajtów)

Przykłady:

Dawny. 1: Ponieważ x=10wynikiem jest 5.75, ponieważ dziesiąta liczba Fibonacciego jest, 55a pierwsze liczby Fibonacciego do tego 552, 3, 5, 13, ich średnia jest5.75

Zgodnie z wyjaśnieniem z przykładu 1 inne przykłady to:

Dawny. 2: Dla x=15danych wyjściowych jest57.5

Dawny. 3: W przypadku x=20danych wyjściowych 277.428571428571lub innych bliskich przybliżeń. Na przykład w tym przypadku 277.4286jest wartością akceptowaną

Dawny. 4: Dla x=11danych wyjściowych jest22.4

Dawny. 5: W przypadku x=30danych wyjściowych 60536.4444444444lub innych zbliżeń, takich jak60536.444


Tabela liderów:


Aby zmienić lidera, prześlij krótsze prawidłowe rozwiązanie. Twój kod powinien być możliwie jak najkrótszy, ponieważ jest to , więc wygrywa najkrótsza odpowiedź w bajtach. Powodzenia!

Pan Xcoder
źródło
Czy wynik może zostać zwrócony jako dokładna część zamiast zaokrąglonego miejsca po przecinku?
Martin Ender
Tak, oczywiście, o ile jest to poprawna wartość.
Edytowałem
Jeśli odpowiedź jest podana jako ułamek, czy ułamek musi zostać zmniejszony?
DLosc
To zależy od Ciebie. Możesz go zmniejszyć, jeśli chcesz, ale nie sądzę, że jest to konieczne.
Pan Xcoder,
Zaktualizuj zaakceptowaną odpowiedź.
Erik the Outgolfer

Odpowiedzi:

5

Właściwie 10 bajtów

Kod:

R♂F;Mr♂P∩æ

Wyjaśnienie:

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.

Wykorzystuje kodowanie CP-437 . Wypróbuj online!

Adnan
źródło
Wow, wykonałem taką pracę w zaledwie 10 bajtów. Imponujący!
Pan Xcoder,
12

Python 2 , 71 bajtów

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

Wypróbuj online!

Python nie ma do tego przydatnych wbudowanych funkcji arytmetycznych, więc robimy to ręcznie. Kod iteruje liczby Fibonacciego, a,b=b,a+bzaczynając od a=b=1.

Test pierwszeństwa Fermata z bazą 2 służy do identyfikacji liczb pierwszych jako agdzie 2^a == 2 (mod a). Chociaż sprawdza to tylko prawdopodobne liczby pierwsze, żaden z fałszywych wyników nie mieści się w pierwszych 40 liczbach Fibonacciego.

Bieżąca suma si liczba cliczb pierwszych są aktualizowane przy każdym napotkaniu liczby pierwszej, a ich stosunek (średnia) jest drukowany na końcu. Ponieważ pierwsza kontrola jest nieudana a=2i na pewno znajduje się w zakresie wejściowym, suma zaczyna się od 2, a liczenie zaczyna się od 1, aby to zrekompensować.

xnor
źródło
8

Galaretka , 11 bajtów

ÆḞ€ÆPÐfµS÷L

Wypróbuj online!

Jak to działa

ÆḞ€Æ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.
Dennis
źródło
11
Solidne 2 z 3 na wbudowane matematyki. Fibonacci, sprawdź. Pierwotność, sprawdź. Średnia arytmetyczna, nie.
xnor
Zmieniłem zaakceptowaną odpowiedź, ponieważ została opublikowana krótsza.
Pan Xcoder,
7

Mathematica, 38 bajtów

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

(* or *)

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

Wyjaśnienie

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 *)
JungHwan Min
źródło
2
Myślę, że chcesz, #a nie #-1: OP mówi, że 55 to 10. liczba Fibonacciego, więc ich lista musi być indeksowana przez zero (zgodnie z najlepszą konwencją). Porównaj swoje wyniki dla danych wejściowych 10i 11z OP. Na szczęście oszczędza to trzy bajty!
Greg Martin
Można upuścić &i wymienić #z x(pytanie mówi, że kod wejściowy nie podejmowanie padnie)
CalculatorFeline
6

Perl 6 , 51 bajtów

{sum($/=[grep *.is-prime,(0,1,*+*...*)[0..$_]])/$/}

Spróbuj

Rozszerzony:

{
  sum(
    $/ = [                # store as an Array in $/

      grep
        *.is-prime,       # find the primes
        (
          0, 1, *+* ... * # Fibonacci sequence
        )[ 0 .. $_ ]      # grab the indicated values in the sequence

    ]
  )

  /

  $/   # use the Array as a number (elems)
}
Brad Gilbert b2gills
źródło
5

MATL , 16 bajtów

lOi:"yy+]vtZp)Ym

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
4

Oktawa , 75 71 bajtów

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

Anonimowa funkcja korzystająca ze wzoru Bineta . Dane wejściowe i wyjściowe mają postać argumentów funkcji.

Wypróbuj online!

Luis Mendo
źródło
1
+1 za ciekawe użycie formuły Bineta w połączeniu z wbudowanym, isprimektóry jest idealny do tego wyzwania.
Pan Xcoder,
4

Maxima, 49 bajtów

f(n):=mean(sublist(makelist(fib(x),x,n),primep));
rahnema1
źródło
4

Prolog (SWI) , 269 264 254 218 bajtów

  • Dzięki Fatalize za oszczędność 37 bajtów!
  • Dzięki Emigna za oszczędność 9 bajtów!

Jestem całkiem pewien, że mógłbym zagrać w golfa więcej bajtów w dół.

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.

Uruchom go jak a(15, R).dla x = 15 , R jest zmienną wyjściową.

Wypróbuj online!


Bardziej czytelna wersja:

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).
Adnan
źródło
1
Gra w SWI Prolog jest złota (i bardzo ciężka), więc fajna robota!
Pan Xcoder,
Jestem całkiem pewien, że takie rzeczy N*C:-są dozwolone w deklaracjach głównych w PPCG, co może zaoszczędzić trochę bajtów.
Fatalize
@Fatalize Właśnie nauczyłem się tego języka programowania tydzień temu, więc nie jestem pewien, co masz na myśli: p. Czy to znaczy, aby zastąpić p(N,C):-z N*C:-?
Adnan,
@Adnan Dokładnie!
Fatalize
@ Fatalizuj Oohhh, to naprawdę fajne! Dzięki :).
Adnan
3

Röda , 98 94 93 bajty

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

Jest to funkcja, która zwraca wynik jako liczbę zmiennoprzecinkową.

Wersja bez golfa:

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
}
fergusq
źródło
Czy możesz to zrobić c%p>0zamiast c%p!=0?
Kritixi Lithos
@KritixiLithos Tak! Dziękuję Ci.
fergusq
3

05AB1E , 13 bajtów

!ÅF¹£DpÏDOsg/

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

!Å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
Emigna
źródło
2

dc , 129 bajtów

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

Generator liczb Fibonacciego i sprawdzanie pierwotności wszystko w jednym. Ładny.

Wypróbuj online!

R. Kap
źródło
2

Japt , 14 bajtów

ò@MgXÃfj
x /Ul

Sprawdź to


Wyjaśnienie

Domniemane wprowadzenie liczby całkowitej U.
30

ò

Wygeneruj tablicę liczb całkowitych od 0 do Uwłącznie.
[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]

@   Ã

Przekaż każdą liczbę całkowitą przez funkcję.

MgX

Uzyskaj Xliczbę th Fibonacciego, gdzie Xjest bieżący element.

[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

Filtruj ( f) tablicę do tych elementów, które zwracają wartość true po sprawdzeniu pierwotności ( j). Niejawnie przypisz wynikową tablicę do zmiennej U.
[2,3,5,13,89,233,1597,28657,514229]

x

Zmniejsz tablicę sumując.
544828

/Ul

Podziel wynik przez długość tablicy ( l) i domyślnie wyślij wynik.
60536.444444444445

Kudłaty
źródło
Wow, uwielbiam nowe odpowiedzi na stare pytania. Również blisko innych języków golfowych, więc +1.
Pan Xcoder,
1

perl, 91 bajtów

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

Cuold był o 8 bajtów krótszy, jeśli test pseudoprime modulo działał równie dobrze w perlu, jak w pythonowej odpowiedzi:

$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

... ale daje to złą odpowiedź na wejście> 16 w perlu.

Kjetil S.
źródło
1

Aksjomat, 104 bajty

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)

bez golfa, kod testowy i wyniki

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

staram się powielić wpis matematyki, oktawy itp. języków, jeśli nie liczyć funkcji mean (), aby ją zaimplementować, byłoby tu 62 bajtów, więc też dobrze

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]))
RosLuP
źródło
1

JavaScript ES6, 137 136 118 113 bajtów

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


Historia

118 bajtów

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 bajtów

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 bajtów

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)
Kudłaty
źródło