ค่าเฉลี่ยเลขคณิตของจำนวนฟีโบนัชชีสำคัญถึงจำนวน x ฟีโบนักชี


18

คุณควรได้ยินเกี่ยวกับตัวเลขฟีโบนักชีหรือที่เรียกกันว่าฟีโบนักชีลำดับ ในลำดับนี้สองคำแรกคือ 0 และ 1 และทุก ๆ ตัวเลขหลังจากสองคำแรกคือผลรวมของสองคำก่อนหน้า กล่าวอีกนัยหนึ่ง, 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.75เนื่องจากจำนวน Fibonacci 10 เป็น55และตัวเลข Fibonacci ที่สำคัญขึ้นอยู่กับ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


ลีดเดอร์บอร์ด:


หากต้องการเปลี่ยนผู้นำให้ส่งวิธีแก้ไขปัญหาที่สั้นลง รหัสของคุณควรสั้นที่สุดเนื่องจากเป็นดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์จะชนะ โชคดี!


สามารถส่งคืนผลลัพธ์เป็นเศษส่วนที่แน่นอนแทนที่จะเป็นทศนิยมที่ปัดเศษได้หรือไม่
Martin Ender

ใช่แน่นอนตราบใดที่มันเป็นค่าที่ถูกต้อง แก้ไขคำถาม :))
นาย Xcoder

หากได้รับคำตอบเป็นเศษส่วนเศษส่วนจะต้องลดลงหรือไม่?
DLosc

ขึ้นอยู่กับคุณ คุณสามารถลดได้ถ้าคุณต้องการ แต่ฉันไม่คิดว่ามันจำเป็น
Mr. Xcoder

โปรดอัปเดตคำตอบที่ยอมรับ
Erik the Outgolfer

คำตอบ:


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 ไบต์ ที่น่าประทับใจ!
Mr. 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 ไม่มีตัวคำนวณทางคณิตศาสตร์ที่มีประโยชน์สำหรับสิ่งนี้ดังนั้นเราจึงทำสิ่งต่างๆด้วยมือ iterates รหัสผ่านตัวเลข Fibonacci ผ่านทางเริ่มต้นจากa,b=b,a+ba=b=1

primality ทดสอบแฟร์มาต์ที่มีฐาน 2 จะใช้เพื่อระบุช่วงเวลาที่เป็นที่a 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
ของแข็ง 2 ใน 3 ของคณิตศาสตร์ในตัว ฟีโบนักชีตรวจสอบ อันดับแรกให้ตรวจสอบ ค่าเฉลี่ยเลขคณิต, ไม่
xnor

ฉันเปลี่ยนคำตอบที่ยอมรับแล้วเพราะคำตอบสั้นกว่านั้น
Mr. 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 บอกว่า 55 คือหมายเลขฟีโบนักชีอันดับที่ 10 ดังนั้นรายการของพวกเขาจะต้องได้รับการจัดทำดัชนี 0 (ตามแบบแผนที่ดีที่สุด) เปรียบเทียบเอาต์พุตของคุณสำหรับอินพุต10และ11กับ OP โชคดีที่สิ่งนี้ช่วยให้คุณประหยัดได้สามไบต์!
Greg Martin

คุณสามารถวาง&และแทนที่#ด้วยx(คำถามบอกว่ารหัสการป้อนข้อมูลไม่ได้รับคะแนน)
CalculatorFeline

6

Perl 6 , 51 ไบต์

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

ลองมัน

ขยาย:

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

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

อ็อกเท75 75ไบต์

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

ฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้สูตรของ Binet อินพุตและเอาต์พุตอยู่ในรูปแบบของฟังก์ชันอาร์กิวเมนต์

ลองออนไลน์!


1
+1 สำหรับการใช้สูตรของ Binet ที่น่าสนใจบวกกับการสร้างในตัวisprimeซึ่งเหมาะสำหรับความท้าทายนี้
Mr. Xcoder


4

Prolog (SWI) , 269 264 254 218 ไบต์

  • ขอบคุณFatalizeสำหรับการบันทึก 37 ไบต์!
  • ขอบคุณEmignaสำหรับการบันทึก 9 ไบต์!

ฉันค่อนข้างแน่ใจว่าฉันสามารถตีกอล์ฟได้มากกว่าไบต์

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 = 15 , Rคือตัวแปรเอาต์พุต

ลองออนไลน์!


รุ่นที่อ่านได้มากขึ้น:

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นั้นเป็นทองคำ (และยากมาก) งานนี้ดีมาก!
Mr. Xcoder

ฉันค่อนข้างแน่ใจว่าสิ่งที่ชอบN*C:-จะได้รับอนุญาตสำหรับการประกาศหัวใน PPCG ซึ่งสามารถช่วยคุณประหยัดบางไบต์
ทำให้เสียชีวิต

@ ทำให้ฉันเพิ่งเรียนรู้ภาษาการเขียนโปรแกรมนี้เมื่อประมาณหนึ่งสัปดาห์ที่แล้วดังนั้นฉันไม่แน่ใจว่าคุณหมายถึงอะไร: p คุณหมายถึงการแทนที่p(N,C):-ด้วยN*C:-?
Adnan

@Adnan แน่นอน!
ทำให้เสียชีวิต

@ ทำให้ Oohhh เรียบร้อยดีจริงๆ! ขอบคุณ :)
Adnan

3

Röda , 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?
Kritixi Lithos

@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

dc , 129 ไบต์

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

ตัวสร้างหมายเลขฟีโบนักชีและตัวตรวจสอบการปกครองทั้งหมดในที่เดียว ดี

ลองออนไลน์!


2

Japt , 14 ไบต์

ò@MgXÃfj
x /Ul

ทดสอบมัน


คำอธิบาย

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

รับXหมายเลขฟีโบนักชีซึ่งXเป็นองค์ประกอบปัจจุบัน

[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

Filter ( f) อาร์เรย์ไปยังองค์ประกอบเหล่านั้นที่คืนค่าความจริงเมื่อตรวจสอบ primality ( j) Uโดยปริยายกำหนดอาร์เรย์ส่งผลให้กับตัวแปร
[2,3,5,13,89,233,1597,28657,514229]

x

ลดอาเรย์โดยการรวม
544828

/Ul

หารผลลัพธ์ด้วยความยาวของอาร์เรย์ ( l) และส่งออกผลลัพธ์โดยปริยาย
60536.444444444445


ว้าวฉันรักคำตอบใหม่สำหรับคำถามเก่า ๆ ใกล้เคียงกับภาษาอื่นของการเล่นกอล์ฟด้วยดังนั้น +1
Mr. 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

Cuold สั้นลง 8 ไบต์หากการทดสอบโมดูโล pseudoprime ทำงานได้ดีในภาษา perl เช่นเดียวกับคำตอบของ python:

$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

... แต่นี่เป็นคำตอบที่ผิดสำหรับอินพุต> 16 ในภาษา Perl


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)

ungolfed รหัสการทดสอบและผลลัพธ์

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, รายการอ็อกเทฟภาษา ฯลฯ หากไม่มีการนับฟังก์ชั่น 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.