x 피보나치 수까지의 소수 피보나치 수의 산술 평균


18

피보나치 수열 (Fibonacci Numbers) 에 대해 들어 보셨을 것 입니다. 이 순서에서 처음 두 항은 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.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


리더 보드 :


리더를 변경하려면 더 짧은 유효한 솔루션을 제출하십시오. 이므로 가능한 한 짧아야 하므로 바이트 단위의 최단 답변이 우선합니다. 행운을 빕니다!


반올림 된 소수점 대신 정확한 분수로 결과를 반환 할 수 있습니까?
Martin Ender

물론 올바른 값이라면 가능합니다. 질문을 편집 :))
Mr. Xcoder

답이 분수로 주어지면 분수를 줄여야합니까?
DLosc

그것은 당신에게 달려 있습니다. 원하는 경우 줄일 수 있지만 그럴 필요는 없습니다.
Mr. Xcoder

허용 된 답변을 업데이트하십시오.
Outgolfer Erik

답변:


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

파이썬 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

온라인으로 사용해보십시오!

파이썬에는이를위한 유용한 산술 내장 기능이 없으므로 직접 작업을 수행합니다. 코드는 a,b=b,a+b에서 시작 하여 피보나치 수를 반복합니다 a=b=1.

페르마 소수도 테스트 베이스 2는 소수 식별하는 데 사용됩니다 . 이것은 가능한 소수만 검사하지만 처음 40 피보나치 수 내에는 오 탐지 가 없습니다 .a2^a == 2 (mod a)

프라임이 발생할 때마다 현재 합계 sc프라임 개수 가 업데이트되고 비율 (평균)이 끝에 인쇄됩니다. 프라임 체크가 누락 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

수학, 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: 영업 이익은 목록 (같은 최고의 대회이다) 0 인덱스해야하므로 (55)가 10 일 피보나치 수가이라고 말했다. 입력 1011OP에 대한 출력을 비교하십시오 . 다행히도 실제로 3 바이트를 절약 할 수 있습니다!
Greg Martin

당신은 놓을 수 있습니다 &및 교체 #와 함께 x(문제는 그 입력 복용 코드가 득점하지 않습니다 말한다)
CalculatorFeline

6

펄 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

Maxima, 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 = 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 프롤로그 골프 는 금색이며 매우 힘든 일입니다.
Mr. Xcoder

N*C:-PPCG에서 헤드 선언에 허용되는 것과 같은 것이 바이트를 절약 할 수 있다고 확신합니다.
Fatalize

@ Fatalize 방금 일주일 전에이 프로그래밍 언어를 배웠으므로 무슨 의미인지 모르겠습니다 : p. 당신은 대체하는 의미합니까 p(N,C):-N*C:-?
Adnan

@Adnan 정확하게!
Fatalize

@Fatalize Oohhh, 정말 깔끔합니다! 감사 :).
Adnan

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

apt , 14 바이트

ò@MgXÃfj
x /Ul

그것을 테스트


설명

정수의 묵시적 입력 U.
30

ò

0에서 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

f우선 순위 ( j)를 확인할 때 진실을 반환하는 요소로 배열을 필터링합니다 ( ). 결과 배열을 variable에 암시 적으로 할당합니다 U.
[2,3,5,13,89,233,1597,28657,514229]

x

합산하여 배열을 줄입니다.
544828

/Ul

결과를 배열의 길이 ( l)로 나누고 결과를 내재적으로 출력합니다.
60536.444444444445


와우, 나는 오래된 질문에 대한 새로운 답변을 좋아합니다. 다른 골프 언어와도 비슷하므로 +1입니다.
Mr. Xcoder

1

펄, 91 바이트

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

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)

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, octave 등의 언어 항목을 복제하려고 시도합니다. 평균 () 함수를 계산하지 않으면 여기에 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

자바 스크립트 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.