Eksponen Fibonacci

11

Untuk tantangan ini, Anda harus menampilkan hasil dari jumlah beberapa angka. Berapa angka-angka ini? Nah, Anda diberi input, ( a, b), yang merupakan bilangan bulat (positif, negatif, atau nol) a != b, dan a < b, dan setiap bilangan bulat di dalam adan b(termasuk mereka) akan memiliki eksponen sesuai dengan angka Fibonacci. Itu membingungkan jadi inilah contohnya:

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

Mengingat bahwa angka Fibonacci pertama diwakili oleh f(0), rumusnya adalah:

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

Input, Pemrosesan, Output

Untuk memperjelas hal di atas, berikut adalah beberapa kasus uji, pemrosesan input, dan output yang diharapkan:

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

Aturan

  • Tidak ada celah standar yang diizinkan

  • Eksponen harus dalam urutan sesuai dengan seri Fibonacci

  • Kode harus berfungsi untuk kasus uji di atas

  • Hanya output yang perlu dikembalikan

Kriteria Menang

Kode terpendek menang!

Anthony Pham
sumber
Jadi 0tidak termasuk dalam angka fibonacci di sini?
FlipTack
0 bukan angka Fibonacci tetapi merupakan pilihan input yang valid
Anthony Pham
6
33165 atau 33156?
Neil
@Neil Saya pikir Anda benar
Anthony Pham
Ini di atas "a f (0) + ... + b f (b-a + 1)" itu salah, misalnya untuk a = 1 dan b = 2 akan menjadi 1 f (0) +2 f (2 ). Saya pikir akan menjadi f (0) + ... + b f (ba); di sini f (0) = 0 bukan 1
RosLuP

Jawaban:

2

05AB1E , 9 byte

ŸDg!ÅFsmO

Cobalah online!

Ÿ         # 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.

Tidak berfungsi pada TIO untuk perbedaan besar antara adan b(EG [a..b].length() > 25).

Tetapi tampaknya itu bekerja untuk angka yang lebih besar daripada jawaban rata-rata di sini.

Tidak efisien, karena menghitung urutan fibonacci hingga n!, yang lebih dari yang diperlukan untuk menghitung jawabannya, di mana npanjang urutan a..b.

Guci Gurita Ajaib
sumber
5

Mathematica, 38 byte 37 byte 31 byte

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

Ini hanyalah jawaban rahnema1 yang diangkut ke Mathematica. Di bawah ini adalah solusi asli saya:

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

Penjelasan:

##mewakili urutan semua argumen, #mewakili argumen pertama, #2mewakili argumen kedua. Saat dipanggil dengan dua argumen adan b, Range[##]akan memberikan daftar {a, a+1, ..., b}dan Range[#2-#+1]akan memberikan daftar dengan panjang yang sama {1, 2, ..., b-a+1}. Karena Fibonacciini Listable, Fibonacci@Range[#2-#+1]akan memberikan daftar b-a+1angka Fibonacci pertama . Karena Poweritu Listable, memanggilnya pada dua daftar dengan panjang yang sama akan memasangnya di atas daftar. Kemudian Trambil jumlahnya.

Sunting: Disimpan 1 byte berkat Martin Ender.

ngenisis
sumber
3
Anda bisa menggunakannya Range@##.
Martin Ender
1
Tidak relevan sekarang, tetapi pendekatan asli dapat ditingkatkan menjadi 3 byte Tr[(r=Range@##)^Fibonacci[r-#+1]]&.
Greg Martin
Penggunaan Rangedua kali seharusnya merupakan bendera merah. Terima kasih!
ngenisis
5

Python , 49 byte

Sebuah lambda rekursif yang mengambil adan bsebagai argumen terpisah (Anda juga dapat mengatur dua angka pertama dari fibonacci, xdan y, untuk apa pun yang Anda inginkan - tidak disengaja, tetapi fitur yang bagus):

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

Cobalah online! (termasuk test suite)

Saran bermain golf diterima.

FlipTack
sumber
Kenapa -~adan tidak sederhana a+1? Saya pikir -~aini tergantung mesin.
Titus
4

Perl 6 , 32 30 byte

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

$^adan $^badalah dua argumen untuk fungsi tersebut; $^a..$^badalah rentang angka dari $^ahingga $^b, yang di-zip dengan eksponensial dengan Z**dengan urutan Fibonacci 1, &[+] ... *,.

Terima kasih kepada Brad Gilbert karena telah memangkas dua byte.

Sean
sumber
(1,&[+]...*)lebih pendek satu byte, dan spasi sesudahnya Z**tidak diperlukan.
Brad Gilbert b2gills
@ BradGilbertb2gills Keren, saya tidak tahu urutan Fibonacci dapat diekspresikan seperti itu.
Sean
Sebenarnya itu berfungsi karena &infix:<+>dapat menerima 0,1 atau 2 argumen. ( &[+]Adalah cara singkat menulis &infix:<+>). The Apapun Kode * + *menerima tepat 2 argumen. ( &[0]() == 0jadi Anda harus memiliki di 1sana untuk memulai urutan)
Brad Gilbert b2gills
3

Maxima, 32 byte

f(a,b):=sum(x^fib(x-a+1),x,a,b);
rahnema1
sumber
3

Pyke, 11 byte

h1:Foh.b^)s

Coba di sini!

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

JavaScript (ES7), 42 byte

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

Port langsung ke jawaban Python yang sangat bagus dari @ FlipTack.

Neil
sumber
Bagus, ternyata lebih pendek dalam JavaScript! :)
FlipTack
3

Haskell, 35 byte

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

Pemakaian:

$ ghc fibexps.hs -e '[4..8]?f'
33156
Roman Czyborra
sumber
Anda dapat mengubah fungsi omenjadi operator infiks, seperti a#b=sum....
nimi
Sudah dianggap infix seperti ... b tetapi baca persyaratan untuk menerima unary (ℤ, ℤ) → ℕ
Roman Czyborra
Banyak jawaban lain mengambil dua argumen terpisah, jadi saya pikir tidak apa-apa.
nimi
Baiklah, itu membuat kita sejajar dengan lambda ECMAscript7. Tetapi jika kami diijinkan untuk pakan (a,b)sebagai a?bmaka mengapa tidak kita diperbolehkan untuk mempersiapkan sebagai segera [a..b]?fke (?)=sum.zipWith(^)?
Roman Czyborra
Saya pikir ini terlalu jauh. Input adalah dua angka (tidak harus sebagai pasangan, dua argumen terpisah akan dilakukan), tetapi Anda memberi makan daftar angka dan fungsi ke fungsi utama Anda.
nimi
2

MATL , 23 byte

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

Cobalah online! Atau verifikasi semua kasus uji .

&:      % 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
Luis Mendo
sumber
1

R, 51 byte

Fungsi anonim.

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

Jelly , 13 byte

ạµ1+⁸С0
r*çS

Cobalah online!

Lynn
sumber
Bagus, satu-satunya jawaban lain yang saya temukan di mana input f(1,25)karya;). +1
Magic Gurita Guci
0

Ruby, 46 byte

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

Tidak ada yang pintar atau orisinal untuk dilihat di sini. Maaf.

GB
sumber
Bagi saya nonspeaker dari Ruby, ℤ.upto(ℤ)metode ini merupakan pengingat yang bagus tentang keindahan perilaku semua objek Ruby. Selanjutnya golf kode dibiarkan sebagai latihan untuk penutur Ruby asli. Sudahkah Anda memindai codegolf.stackexchange.com/questions/363/... ?
Roman Czyborra
0

Java 7, 96 byte

Golf:

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;}

Tidak Disatukan:

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;
}
Peech
sumber
0

R, 57 byte

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

Cukup mudah. gmp::fibnumadalah built-in yang lebih pendek, tetapi tidak mendukung mengembalikan seluruh urutan hingga n, yang numbers::fibonaccitidak dengan menambahkan argumen T.

Pertama saya punya solusi yang lebih rumit gmp::fibnumyang berakhir 2 byte lebih lama dari solusi ini.

x=scan();for(i in x[1]:x[2])F=F+i^gmp::fibnum((T<-T+1)-1);F
JAD
sumber
Menggunakan fungsi anonim daripada scan()menyimpan 6 byte; lihat solusi saya yang diposting.
rturnbull
ah ya, konyol saya.
JAD
0

dc , 56 byte

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

Selesai untuk input [1,30]dalam 51 detik. Mengambil dua input pada dua baris terpisah yang pernah dieksekusi dan angka negatif dengan garis bawah ( _) sebagai ganti tanda hubung (yaitu -4input sebagai _4).

R. Kap
sumber
0

PHP, 77 75 byte

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

mengambil batasan dari argumen baris perintah. Jalankan dengan -nr.
menampilkan variabel variabel PHP lagi (dan apa yang saya ketahui tentang mereka .

kerusakan

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

Jawaban FlipTack yang di- porting ke PHP memiliki 70 byte:

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

Aksioma, 65 byte

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

kode uji dan hasil

(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)
RosLuP
sumber
0

PowerShell , 67 byte

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

Cobalah online!

Menemukan cara yang sedikit lebih baik untuk melakukan urutan, tetapi PowerShell tidak dibandingkan dengan bahasa lain untuk yang satu ini :)

Sinusoid
sumber