Середнє арифметичне значення простих чисел Фібоначчі до 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, тому що 10-е число Фібоначчі є 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


Табло:


Щоб змінити лідера, подайте коротше дійсне рішення. Ваш код повинен бути якомога коротшим, оскільки це , тому найкоротша відповідь у байтах виграє. Удачі!


Чи можна повернути результат як точний дріб замість округлої десяткової?
Мартін Ендер

Так, звичайно, якщо це правильне значення. Редагував питання :))
Містер Xcoder

Якщо відповідь дається у вигляді дробу, чи треба дріб зменшити?
DLosc

Це залежить від вас. Ви можете зменшити його, якщо хочете, але я не думаю, що це потрібно.
Містер Xcoder

Оновіть прийняту відповідь.
Ерік Аутгольфер

Відповіді:


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

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: ОП говорить, що 55 - це 10-е число Фібоначчі, тому їх список повинен бути 0-індексованим (як це найкраща умова). Порівняйте свій вихід за вхідними даними 10та 11з ОП. На щастя, це фактично економить три байти!
Грег Мартін

Ви можете кинути &та замінити #на 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 71 байт

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

Анонімна функція, яка використовує формулу Біне . Введення та вихід у вигляді аргументів функції.

Спробуйте в Інтернеті!


1
+1 за цікаве використання формули Біне в поєднанні з вбудованою, isprimeяка ідеально підходить для цього завдання.
Містер Xcoder


4

Prolog (SWI) , 269 264 254 218 байт

  • Завдяки Fatalize за економію 37 байт!
  • Дякуємо Еміньї за збереження 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

Я впевнений, що такі речі, як N*C:-дозволено, можна оголосити головою в PPCG, що може заощадити кілька байтів.
Фаталізувати

@Fatalize Я щойно вивчив цю мову програмування близько тижня тому, тому я не впевнений, що ти маєш на увазі: p. Ви маєте в виду замінити p(N,C):-з N*C:-?
Аднан

@Adnan Рівно!
Фаталізувати

@Fatalize Oohhh, це дійсно акуратно! Спасибі :).
Аднан

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

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

Фільтруйте ( f) масив до тих елементів, які повертають truthy, коли перевіряється на первинність ( j). Неявно призначити отриманий масив змінній U.
[2,3,5,13,89,233,1597,28657,514229]

x

Зменшіть масив шляхом підсумовування.
544828

/Ul

Ділимо результат на довжину масиву ( l) і неявно виводимо результат.
60536.444444444445


Нічого собі, я люблю нові відповіді на старі запитання. Також близько до інших мов для гольфу, тому +1.
Містер 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

Кулод був на 8 байт коротше, якщо тест на псевдокримію модуля працював так само добре, як у 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 в перл.


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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.