Fibonacci Üsleri


11

Bu meydan okuma için, bazı sayıların toplamının sonucunu çıkarmalısınız. Bu sayılar nedir? Peki, (, giriş verilir a, btam sayılar (pozitif, negatif veya sıfır), hangi,) a != bve a < bve içindeki her tamsayı ave b(onlara dahil) Fibonacci numaralarına göre üstellerini olacaktır. Bu kafa karıştırıcı, işte bir örnek:

Input: (-2, 2)
Output: -2**1 + (-1**1) + 0**2 + 1**3 + 2**5 =
          -2  +    -1   +   0  +   1  +   32 = 30

İlk Fibonacci sayısının temsil edildiği göz önüne alındığında f(0), formül:

a**f(0) + ... + b**f(b-a+1) 

Girdi, İşleme, Çıktı

Yukarıdakileri açıklığa kavuşturmak için, bazı test durumları, girdinin işlenmesi ve beklenen çıktılar:

Input: (1, 2)
Processing: 1**1 + 2**1
Output: 3

Input: (4, 8)
Processing: 4**1 + 5**1 + 6**2 + 7**3 + 8**5
Output: 33156

Input: (-1, 2)
Processing: -1**1 + 0**1 + 1**2 + 2**3
Output: 8

Input: (-4, -1)
Processing: -4**1 + -3**1 + -2**2 + -1**3
Output: -4

kurallar

  • Standart boşluklara izin verilmez

  • Üslerin Fibonacci serisine göre olması gerekir

  • Kod yukarıdaki test senaryoları için çalışmalıdır

  • Yalnızca çıktı iade edilmelidir

Kazanma Kriterleri

En kısa kod kazanır!


Yani 0burada fibonacci sayılarına dahil değil mi?
FlipTack

0 bir Fibonacci numarası değildir, ancak giriş için geçerli bir seçimdir
Anthony Pham

6
33165 veya 33156?
Neil

Sanırım haklısın
Anthony Pham

Bu "a f (0) + ... + b f (b-a + 1)" nin üstünde yanlış, örneğin a = 1 ve b = 2 için 1 f (0) +2 f (2 ). Bence f (0) + ... + b f (ba); burada f (0) = 0 değil 1
RosLuP

Yanıtlar:


2

05AB1E , 9 bayt

ŸDg!ÅFsmO

Çevrimiçi deneyin!

Ÿ         # Push [a, ..., b].
 Dg!      # Calculate ([a..b].length())! because factorial grows faster than fibbonacci...
    ÅF    # Get Fibonacci numbers up to FACTORIAL([a..b].length()).
      s   # Swap the arguments because the fibb numbers will be longer.
       m  # Vectorized exponentiation, dropping extra numbers of Fibonacci sequence.
        O # Sum.

aVe b(EG [a..b].length() > 25) arasındaki büyük tutarsızlıklar için TIO üzerinde çalışmaz .

Ancak buradaki ortalama yanıttan daha büyük sayılar için işe yarıyor gibi görünüyor.

Verimsiz, çünkü n!cevabı hesaplamak için gerekenden daha fazla olan fibonacci sekansını hesaplar, çünkü sekansın nuzunluğu a..b.


5

Mathematica, 38 bayt 37 bayt 31 bayt

Sum[x^Fibonacci[x-#+1],{x,##}]&

Bu sadece rahnema1'in Mathematica'ya taşınan cevabı. Aşağıda benim orijinal çözümüm:

Tr[Range@##^Fibonacci@Range[#2-#+1]]&

Açıklama:

##tüm argümanların dizisini #temsil eder, ilk argümanı, #2ikinci argümanı temsil eder. İki argümanlarla çağrıldığında ave b, Range[##]liste verecektir {a, a+1, ..., b}ve Range[#2-#+1]aynı uzunlukta listesini verecektir {1, 2, ..., b-a+1}. Olduğu Fibonacciiçin Listable, Fibonacci@Range[#2-#+1]ilk b-a+1Fibonacci sayılarının listesini verecektir . Olduğu Poweriçin Listable, eşit uzunluktaki iki listede çağırmak listelerin üzerine yazacaktır. Sonra Trtoplamı alır.

Düzenleme: Martin Ender sayesinde 1 bayt kaydedildi.


3
Kullanabilirsiniz Range@##.
Martin Ender

1
Şu an kadar geçerli değil, ancak orijinal yaklaşım 3 bayt geliştirilebilir Tr[(r=Range@##)^Fibonacci[r-#+1]]&.
Greg Martin

Rangeİki kez kullanmak kırmızı bir bayrak olmalı. Teşekkürler!
ngenisis

5

Python , 49 bayt

Ayrı argümanlar alan ave bayrı bir argüman olarak tekrarlayan bir lambda (ayrıca ilk iki sayıdaki fibonacci'yi xve yne istersen - kasıtlı değil, hoş bir özellik ayarlayabilirsiniz ):

f=lambda a,b,x=1,y=1:a<=b and a**x+f(a+1,b,y,x+y)

Çevrimiçi deneyin! (test paketini içerir)

Golf önerileri hoş geldiniz.


Neden -~ave basit değil a+1? Bence -~amakineye bağımlı.
Titus

4

Perl 6 , 32 30 bayt

{sum $^a..$^b Z**(1,&[+]...*)}

$^ave $^bişlevin iki argümanıdır; $^a..$^bgelen sayı aralığı olduğu $^aiçin $^bile üs ile sıkıştırılmış olan, Z**Fibonacci dizisi ile 1, &[+] ... *.

Brad Gilbert'a iki bayt tıraş ettiği için teşekkürler.


(1,&[+]...*)bir bayt daha kısadır ve sonraki boşluğa Z**gerek yoktur.
Brad Gilbert B2

@ BradGilbertb2gills Cool, Fibonacci dizisinin bu şekilde ifade edilebileceği hakkında hiçbir fikrim yoktu.
Sean

Aslında çalışır çünkü &infix:<+>0,1 veya 2 argümanı kabul edebilir. ( &[+]yazmanın kısa bir yoludur &infix:<+>). WhateverCode * + *tam olarak 2 argümanı kabul eder. ( &[0]() == 0bu yüzden 1diziyi başlatmak için orada olmanız gerekir )
Brad Gilbert b2gills


3

Pyke, 11 bayt

h1:Foh.b^)s

Burada deneyin!

h1:         -   range(low, high+1)
   F     )  -  for i in ^:
    oh      -     (o++)+1
      .b    -    nth_fib(^)
        ^   -   i ** ^
          s - sum(^)

3

JavaScript (ES7), 42 bayt

f=(a,b,x=1,y=1)=>a<=b&&a**x+f(a+1,b,y,x+y)

@ FlipTack'in mükemmel Python cevabının doğrudan portu.


Güzel, JavaScript'te daha da kısa çıktı! :)
FlipTack

3

Haskell, 35 bayt

f=scanl(+)1(0:f);(?)=sum.zipWith(^)

Kullanımı:

$ ghc fibexps.hs -e '[4..8]?f'
33156

İşlevi ogibi bir infix operatörüne dönüştürebilirsiniz a#b=sum....
nimi

Infix'i… b gibi düşünmüştü ama tekli (ℤ, ℤ) kabul etme gerekliliğini okumuştu → ℕ
Roman Czyborra

Diğer birçok cevap iki ayrı argüman alıyor, bu yüzden bence iyi.
nimi

Alrightie zaten, bu bizi ECMAscript7 lambda ile eşit hale getiriyor. Biz beslemesine izin verilmesi halinde Fakat (a,b)olarak a?bo zaman derhal olarak hazırlamak için izin verilmez neden [a..b]?füzerine (?)=sum.zipWith(^)?
Roman Czyborra

Bence bu çok ileri gidiyor. Giriş iki sayıdır (bir çift olarak olması gerekmez, iki ayrı bağımsız değişken yapar), ancak ana işlevinize bir sayı listesi ve bir işlev besliyorsunuz.
nimi

2

MATL , 23 bayt

&:ll&Gw-XJq:"yy+]JQ$h^s

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

&:      % Binary range between the two implicit inputs: [a a+1 ... b] 
ll      % Push 1, 1. These are the first two Fibonacci numbers
&G      % Push a, b again
w-      % Swap, subtract: gives b-a
XJ      % Copy to cilipboard J
q:      % Array [1 2 ... b-a-1]
"       % For each (repeat b-a-1 times)
  yy    %    Duplicate the top two numbers in the stack
  +     %    Add
]       % End
J       % Push b-a
Q       % Add 1: gives b-a+1
$       % Specify that the next function takes b-a+1 inputs
h       % Concatenate that many elements (Fibonacci numbers) into a row vector
^       % Power, element-wise: each entry in [a a+1 ... b] is raised to the
        % corresponding Fibonacci number
s       % Sum of array. Implicitly display

1

R, 51 bayt

Anonim bir işlev.

function(a,b)sum((a:b)^numbers::fibonacci(b-a+1,T))


0

Yakut, 46 bayt

->a,b{n=s=0;m=1;a.upto(b){|x|s+=x**n=m+m=n};s}

Burada görmek için özellikle akıllı veya orijinal bir şey yok. Afedersiniz.


Benim için Ruby'i bilmeyen ℤ.upto(ℤ)yöntem, Ruby'nin tüm nesne davranışı güzelliğinin güzel bir hatırlatıcısı. Daha fazla golf kodu, yerel Ruby hoparlörlerine bir egzersiz olarak bırakılmıştır. Henüz kod tarama yapmadınız mı ?
Roman Czyborra

0

Java 7, 96 bayt

golfed:

int n(int a, int b){int x=1,y=1,z=0,s=0;while(a<=b){s+=Math.pow(a++,x);z=x+y;x=y;y=z;}return s;}

Ungolfed:

int n(int a, int b)
{
    int x = 1, y = 1, z = 0, s = 0;
    while (a <= b)
    {
        s += Math.pow(a++, x);
        z = x + y;
        x = y;
        y = z;
    }

    return s;
}

0

R, 57 bayt

x=scan();sum((x[1]:x[2])^numbers::fibonacci(diff(x)+1,T))

Oldukça basit. gmp::fibnumDaha kısa dahili, ancak kadar tüm diziyi dönen desteklemez n, numbers::fibonacciargüman ekleyerek yapar T.

İlk olarak, daha zor bir çözüm vardı ve gmp::fibnumbu çözümden 2 bayt daha uzun sürdü.

x=scan();for(i in x[1]:x[2])F=F+i^gmp::fibnum((T<-T+1)-1);F

scan()6 bayt yerine anonim bir işlev kullanmak ; yayınlanan çözümüme bakın.
rturnbull

ah evet, aptal benim.
JAD

0

dc , 56 bayt

?sf?sa0dsbsg1sc[lblcdlfrdsb^lg+sg+sclf1+dsfla!<d]dsdxlgp

[1,30]51 saniye içinde girişi bitirir . İki girişi yürütüldükten sonra iki ayrı satıra ve bir tire yerine alt çizgi ( _) içeren negatif sayılar alır (yani -4, giriş olarak verilir _4).


0

PHP, 77 75 bayt

for($b=$argv[$$x=1];$b<=$argv[2];${$x=!$x}=${""}+${1})$s+=$b++**$$x;echo$s;

komut satırı bağımsız değişkenlerinden sınırları alır. İle çalıştırın -nr.
PHP'nin değişken değişkenlerini tekrar (ve onlar hakkında öğrendiklerimi) .

Yıkmak

for($b=$argv[$$x=0}=1]; # $"" to 1st Fibonacci and base to 1st argument
    $b<=$argv[2];           # loop $b up to argument2 inclusive
    ${$x=!$x}                   # 5. toggle $x,             6. store to $1/$""
        =${""}+${1}             # 4. compute next Fibonacci number
)
    $s+=$b++**                  # 2. add exponential to sum,    3. post-increment base
        $$x;                    # 1. take current Fibonacci from $""/$1 as exponent
echo$s;                     # print result

FlipTack'in PHP'ye taşınan cevabı 70 bayttır:

function f($a,$b,$x=1,$y=1){return$a>$b?0:$a**$x+f($a+1,$b,$y,$x+$y);}

0

Aksiyom, 65 bayt

f(a,b)==reduce(+,[i^fibonacci(j)for i in a..b for j in 1..b-a+1])

test kodu ve sonuçları

(74) -> f(1,2)
   (74)  3
                                                   Type: Fraction Integer
(75) -> f(4,8)
   (75)  33156
                                                   Type: Fraction Integer
(76) -> f(-1,2)
   (76)  8
                                                   Type: Fraction Integer
(77) -> f(-4,-1)
   (77)  - 4
                                                   Type: Fraction Integer
(78) -> f(3,1)
   >> Error detected within library code:
   reducing over an empty list needs the 3 argument form
    protected-symbol-warn called with (NIL)

0

PowerShell , 67 bayt

$e=1;$args[0]..$args[1]|%{$s+=("$_*"*$e+1|iex);$e,$f=($e+$f),$e};$s

Çevrimiçi deneyin!

Diziyi yapmanın biraz daha iyi bir yolunu buldum, ancak powershell bunun için diğer dillerle karşılaştırılmıyor :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.