Số mũ Fibonacci


11

Đối với thử thách này, bạn phải xuất kết quả tổng của một số số. Những con số này là gì? Chà, bạn được cung cấp đầu vào, ( a, b), là các số nguyên (dương, âm hoặc 0) a != b, và a < b, mỗi số nguyên trong ab(bao gồm cả chúng) sẽ có số mũ theo các số Fibonacci. Điều đó thật khó hiểu vì vậy đây là một ví dụ:

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

Cho rằng số Fibonacci đầu tiên được biểu thị bởi f(0), công thức là:

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

Đầu vào, xử lý, đầu ra

Để làm rõ ở trên, đây là một số trường hợp thử nghiệm, xử lý đầu vào và đầu ra dự kiến:

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

Quy tắc

  • Không có sơ hở tiêu chuẩn được phép

  • Các số mũ phải theo thứ tự theo chuỗi Fibonacci

  • Mã phải làm việc cho các trường hợp thử nghiệm ở trên

  • Chỉ có đầu ra cần phải được trả lại

Tiêu chí chiến thắng

Mã ngắn nhất sẽ thắng!


Vì vậy, 0không được bao gồm trong các số Wikipedia ở đây?
FlipTack

0 không phải là số Fibonacci nhưng là lựa chọn hợp lệ cho đầu vào
Anthony Phạm

6
33165 hay 33156?
Neil

@Neil Tôi nghĩ bạn đúng
Anthony Phạm

Điều này ở trên "a f (0) + ... + b f (b-a + 1)" là sai, ví dụ với a = 1 và b = 2, nó sẽ là 1 f (0) +2 f (2 ). Tôi nghĩ rằng sẽ là một f (0) + ... + b f (ba); ở đây f (0) = 0 không phải 1
RosLuP

Câu trả lời:


2

05AB1E , 9 byte

ŸDg!ÅFsmO

Hãy thử trực tuyến!

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

Không hoạt động trên TIO cho sự khác biệt lớn giữa ab(EG [a..b].length() > 25).

Nhưng nó dường như làm việc cho số lượng lớn hơn so với câu trả lời trung bình ở đây.

Không hiệu quả, vì nó tính toán trình tự lên đến n!, nhiều hơn mức cần thiết để tính toán câu trả lời, đâu nlà độ dài của chuỗi a..b.


5

Mathicala, 38 byte 37 byte 31 byte

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

Đây chỉ là câu trả lời của rahnema1 được chuyển đến Mathicala. Dưới đây là giải pháp ban đầu của tôi:

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

Giải trình:

##đại diện cho chuỗi của tất cả các đối số, #đại diện cho đối số thứ nhất, #2đại diện cho đối số thứ hai. Khi được gọi với hai đối số ab, Range[##]sẽ đưa ra danh sách {a, a+1, ..., b}Range[#2-#+1]sẽ đưa ra danh sách có cùng độ dài {1, 2, ..., b-a+1}. Kể từ khi FibonacciListable, Fibonacci@Range[#2-#+1]sẽ cung cấp danh sách các đầu b-a+1số Fibonacci. Kể từ khi PowerListable, gọi đó là trên hai danh sách chiều dài bằng nhau sẽ thread nó trong danh sách. Sau đó Trlấy tổng.

Chỉnh sửa: Đã lưu 1 byte nhờ Martin Ender.


3
Bạn có thể sử dụng Range@##.
Martin Ender

1
Không liên quan như bây giờ, nhưng cách tiếp cận ban đầu có thể được cải thiện 3 byte thành Tr[(r=Range@##)^Fibonacci[r-#+1]]&.
Greg Martin

Sử dụng Rangehai lần nên là một lá cờ đỏ. Cảm ơn!
ngenisis

5

Python , 49 byte

Một lambda đệ quy lấy ablàm các đối số riêng biệt (bạn cũng có thể đặt hai số đầu tiên của MySpace xy, theo bất cứ điều gì bạn muốn - không cố ý, nhưng là một tính năng hay):

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

Hãy thử trực tuyến! (bao gồm bộ kiểm tra)

Gợi ý chơi golf chào mừng.


Tại sao -~avà không đơn giản a+1? Tôi nghĩ -~alà phụ thuộc máy.
Tít

4

Perl 6 , 32 30 byte

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

$^a$^blà hai đối số cho hàm; $^a..$^blà phạm vi các số từ $^ađến $^b, được nén với cấp số mũ bằng Z**chuỗi Fibonacci , 1, &[+] ... *.

Cảm ơn Brad Gilbert đã cạo sạch hai byte.


(1,&[+]...*)ngắn hơn một byte và không gian sau Z**không cần thiết.
Brad Gilbert b2gills

@ BradGilbertb2gills Thật tuyệt, tôi không biết chuỗi Fibonacci có thể được thể hiện theo cách đó.
Sean

Trên thực tế, nó hoạt động vì &infix:<+>có thể chấp nhận 0,1 hoặc 2 đối số. ( &[+]là một cách viết ngắn &infix:<+>). AnyCode * + *chấp nhận chính xác 2 đối số. ( &[0]() == 0vì vậy bạn phải có 1ở đó để bắt đầu trình tự)
Brad Gilbert b2gills



3

JavaScript (ES7), 42 byte

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

Cổng đơn giản của câu trả lời Python tuyệt vời của @ FlipTack.


Thật tuyệt, hóa ra còn ngắn hơn trong JavaScript! :)
FlipTack

3

Haskell, 35 byte

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

Sử dụng:

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

Bạn có thể biến hàm othành toán tử infix, như thế a#b=sum....
nimi

Đã coi infix như một người b nhưng đọc yêu cầu chấp nhận unary (ℤ, ℤ) →
Roman Czyborra

Nhiều câu trả lời khác có hai đối số riêng biệt, vì vậy tôi nghĩ rằng nó ổn.
nimi

Được rồi, điều đó mang lại cho chúng ta ngang hàng với lambda ECMAscript7. Nhưng nếu chúng ta được phép ăn (a,b)như a?bthì tại sao chúng ta không được phép để chuẩn bị nó như là ngay lập tức [a..b]?flên (?)=sum.zipWith(^)?
Roman Czyborra

Tôi nghĩ rằng điều này đi quá xa. Đầu vào là hai số (không nhất thiết phải là một cặp, hai đối số riêng biệt sẽ làm), nhưng bạn đang cung cấp danh sách các số và hàm cho hàm chính của mình.
nimi

2

MATL , 23 byte

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

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

&:      % 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 byte

Một chức năng ẩn danh.

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


0

Ruby, 46 byte

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

Không có gì đặc biệt thông minh hoặc nguyên bản để xem ở đây. Lấy làm tiếc.


Đối với tôi không phải là người không biết về Ruby, ℤ.upto(ℤ)phương pháp này là một lời nhắc nhở tốt đẹp về vẻ đẹp hành vi của mọi đối tượng của Ruby. Việc đánh gôn thêm mã được để lại như một bài tập cho những người nói tiếng Ruby bản địa. Bạn đã quét codegolf.stackexchange.com/questions/363/ trên chưa?
Roman Czyborra

0

Java 7, 96 byte

Chơi gôn

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

Ung dung:

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 byte

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

Khá đơn giản. gmp::fibnumlà một tích hợp ngắn hơn, nhưng nó không hỗ trợ trả về toàn bộ chuỗi lên n, numbers::fibonaccibằng cách thêm đối sốT .

Đầu tiên tôi có một giải pháp phức tạp hơn với gmp::fibnumkết quả dài hơn 2 byte so với giải pháp này.

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

Sử dụng một hàm ẩn danh thay vì scan()tiết kiệm 6 byte; xem giải pháp được đăng của tôi.
rturnbull

ah vâng, ngớ ngẩn của tôi.
JAD

0

dc , 56 byte

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

Kết thúc cho đầu vào [1,30]trong 51 giây. Đưa hai đầu vào trên hai dòng riêng biệt sau khi được thực hiện và các số âm có dấu gạch dưới hàng đầu ( _) thay vì dấu gạch ngang (nghĩa là -4sẽ là đầu vào dưới dạng _4).


0

PHP, 77 75 byte

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

lấy ranh giới từ các đối số dòng lệnh. Chạy với -nr.
hiển thị lại các biến số của PHP và một lần nữa (và những gì tôi đã tìm thấy về chúng .

phá vỡ

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

Câu trả lời của FlipTack được chuyển sang PHP có 70 byte:

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

0

Tiên đề, 65 byte

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

mã kiểm tra và kết quả

(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 byte

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

Hãy thử trực tuyến!

Tìm thấy một cách tốt hơn một chút để thực hiện trình tự, nhưng powershell không so sánh với các ngôn ngữ khác cho ngôn ngữ này :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.