最高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,因为第十个斐波那契数为55,而最高达的素数斐波那契数552, 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先生,2017年

如果答案是分数,是否必须减少分数?
DLosc

这取决于你。您可以根据需要减少它,但是我认为这不是必需的。
Xcoder先生17年

请更新接受的答案。
暴民埃里克(Erik the Outgolfer)'17

Answers:


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用于识别素数作为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

我已更改了接受的答案,因为发布了一个较短的答案。
Xcoder先生17年

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是第十个斐波那契数,因此他们的列表必须为0索引(这是最佳约定)。将输出与输入进行比较,1011与OP进行比较。幸运的是,这实际上为您节省了三个字节!
格雷格·马丁

您可以删除&和替换#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

Maxima,49个字节

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

4

序言(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中打高尔夫球是黄金(而且非常艰辛),做得好!
Xcoder先生17年

我很确定N*C:-PPCG中的head声明允许使用诸如此类的东西,这样可以节省一些字节。
致命

@Fatalize我大约一周前才学习这种编程语言,所以我不确定您的意思是:p。你的意思是替代p(N,C):-N*C:-
阿德南

@Adnan就是这样!
致命

@Fatalize Oohhh,这真的很整洁!谢谢 :)。
阿德南

3

Röda98 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'3

@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

直流,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到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。
Xcoder先生17年

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

如果模伪素数测试在perl中的效果与python答案一样好,那么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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.