Fibonacci Exponents


11

สำหรับความท้าทายนี้คุณจะต้องแสดงผลลัพธ์ของผลรวมของตัวเลขบางจำนวน ตัวเลขเหล่านี้คืออะไร? คุณได้รับอินพุต ( a, b) ซึ่งเป็นจำนวนเต็ม (บวกลบหรือศูนย์) a != bและa < bและแต่ละจำนวนเต็มภายในaและb(รวมถึงพวกเขา) จะมีเลขชี้กำลังตามตัวเลขฟีโบนักชี นี่เป็นตัวอย่างที่สับสน:

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

ระบุว่าหมายเลข Fibonacci แรกถูกแทนด้วยf(0)สูตรคือ:

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

อินพุต, การประมวลผล, เอาท์พุท

เพื่อชี้แจงด้านบนนี่คือกรณีทดสอบบางส่วนการประมวลผลอินพุตและเอาต์พุตที่คาดหวัง:

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

กฎระเบียบ

  • ไม่อนุญาตช่องโหว่มาตรฐาน

  • เลขชี้กำลังต้องเป็นระเบียบตามลำดับฟีโบนักชี

  • รหัสจะต้องใช้สำหรับกรณีทดสอบด้านบน

  • จะต้องส่งคืนเฉพาะเอาต์พุตเท่านั้น

เกณฑ์การชนะ

รหัสที่สั้นที่สุดชนะ!


ดังนั้น0ไม่รวมอยู่ในตัวเลขฟีโบนักชีที่นี่?
FlipTack

0 ไม่ใช่หมายเลขฟีโบนักชี แต่เป็นตัวเลือกที่ถูกต้องสำหรับการป้อนข้อมูล
Anthony Pham

6
33165 หรือ 33156?
Neil

@ Neil ฉันคิดว่าคุณพูดถูก
Anthony Pham

นี่คือ "a f (0) + ... + b f (b-a + 1)" มันผิดตัวอย่างเช่น a = 1 และ b = 2 มันจะเป็น 1 f (0) +2 f (2 ) ฉันคิดว่าจะเป็นf (0) + ... + b f (ba); ที่นี่ f (0) = 0 ไม่ใช่ 1
RosLuP

คำตอบ:


2

05AB1E , 9 ไบต์

ŸDg!ÅFsmO

ลองออนไลน์!

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

ไม่ทำงานบน TIO สำหรับความคลาดเคลื่อนจำนวนมากระหว่างaและb(EG [a..b].length() > 25)

แต่ดูเหมือนว่าจะได้ผลสำหรับจำนวนที่มากกว่าคำตอบทั่วไปที่นี่

ไม่มีประสิทธิภาพเพราะมันคำนวณ fibonacci ลำดับขึ้นไปn!ซึ่งเป็นมากกว่าเป็นสิ่งจำเป็นในการคำนวณคำตอบที่มีความยาวของลำดับของna..b


5

Mathematica, 38 ไบต์ 37 ไบต์ 31 ไบต์

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

นี่เป็นเพียงคำตอบของ rahnema1 ที่ส่งไปยัง Mathematica ด้านล่างนี้เป็นโซลูชันดั้งเดิมของฉัน:

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

คำอธิบาย:

##แสดงถึงลำดับของการขัดแย้งทั้งหมด#หมายถึงการโต้แย้งครั้งแรก#2หมายถึงการโต้แย้งที่สอง เมื่อเรียกว่ามีสองข้อโต้แย้งaและb, Range[##]จะให้รายการ{a, a+1, ..., b}และจะให้รายการของความยาวเดียวกันRange[#2-#+1] {1, 2, ..., b-a+1}ตั้งแต่Fibonacciเป็นListable, Fibonacci@Range[#2-#+1]จะให้รายการแรกb-a+1ตัวเลขฟีโบนักชี เนื่องจากPowerเป็นการListableเรียกมันในสองรายการที่มีความยาวเท่ากันจะมีเธรดอยู่เหนือรายการ จากนั้นTrนำผลรวม

แก้ไข: บันทึก 1 ไบต์ขอบคุณ Martin Ender


3
Range@##คุณสามารถใช้
Martin Ender

1
ไม่เกี่ยวข้องในขณะนี้ แต่วิธีการเดิมสามารถปรับปรุง 3 Tr[(r=Range@##)^Fibonacci[r-#+1]]&ไบต์
Greg Martin

การใช้Rangeสองครั้งควรเป็นธงสีแดง ขอบคุณ!
ngenisis

5

Pythonขนาด 49 ไบต์

แลมบ์ดาแบบเรียกซ้ำซึ่งใช้aและbแยกกันเป็นอาร์กิวเมนต์ (คุณยังสามารถตั้งค่าตัวเลขฟีโบนักชีสองตัวเลขแรกxและyตามที่คุณต้องการ - ไม่ใช่ความตั้งใจ แต่เป็นคุณสมบัติที่ดี):

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

ลองออนไลน์! (รวมถึงชุดทดสอบ)

ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ


ทำไม-~aและไม่ใช่แค่a+1? ฉันคิดว่า-~aมันขึ้นอยู่กับเครื่องจักร
ติตัส

4

Perl 6 , 32 30 ไบต์

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

$^aและ$^bเป็นทั้งสองข้อโต้แย้งกับฟังก์ชั่น; $^a..$^bเป็นช่วงของตัวเลขจาก$^aไป$^bซึ่งเป็นซิปที่มีการยกกำลังโดยมีลำดับฟีโบนักชีZ**1, &[+] ... *

ขอบคุณ Brad Gilbert ที่โกนหนวดออกสองไบต์


(1,&[+]...*)สั้นลงหนึ่งไบต์และZ**ไม่จำเป็นต้องเว้นวรรค
แบรดกิลเบิร์ต b2gills

@ BradGilbertb2gills ยอดเยี่ยมฉันไม่รู้เลยว่าลำดับ Fibonacci สามารถแสดงออกได้เช่นนั้น
ฌอน

ใช้งานได้จริงเพราะ&infix:<+>สามารถยอมรับอาร์กิวเมนต์ 0,1 หรือ 2 ( &[+]เป็นวิธีการเขียนสั้น ๆ&infix:<+>) AnythingCode * + *ยอมรับ 2 ข้อโต้แย้งทั้งหมด ( &[0]() == 0ดังนั้นคุณต้องมีที่1นั่นเพื่อเริ่มต้นลำดับ)
Brad Gilbert b2gills



3

JavaScript (ES7), 42 ไบต์

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

พอร์ตที่ตรงไปตรงมาของคำตอบ Python ที่ยอดเยี่ยมของ @ FlipTack


เยี่ยมมากเปิดใช้งานสั้นลงใน JavaScript! :)
FlipTack

3

Haskell, 35 ไบต์

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

การใช้งาน:

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

คุณสามารถเปิดฟังก์ชั่นเป็นผู้ประกอบการมัดเช่นo a#b=sum...
nimi

เคยพิจารณามัดเหมือน… b แต่อ่านข้อกำหนดที่จะยอมรับเอก (ℤ, ℤ) →ℕ
Roman Czyborra

คำตอบอื่น ๆ อีกมากมายใช้อาร์กิวเมนต์ที่แยกกันสองครั้งดังนั้นฉันคิดว่าไม่เป็นไร
nimi

เอาล่ะแล้วนั่นทำให้เราได้เปรียบกับแลมบ์ดา ECMAscript7 แต่ถ้าเราได้รับอนุญาตให้ฟีด(a,b)เป็นa?bแล้วทำไมเราจะไม่ได้รับอนุญาตให้เตรียมความพร้อมเป็นทันที[a..b]?fบน(?)=sum.zipWith(^)?
Roman Czyborra

ฉันคิดว่ามันไปไกลเกินไป อินพุตเป็นตัวเลขสองตัว (ไม่จำเป็นต้องเป็นคู่อาร์กิวเมนต์สองตัวจะแยกกัน) แต่คุณกำลังป้อนรายการตัวเลขและฟังก์ชันในฟังก์ชันหลักของคุณ
nimi

2

MATL , 23 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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



0

ทับทิมขนาด 46 ไบต์

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

ไม่มีอะไรฉลาดหรือเป็นต้นฉบับให้ดูที่นี่ ขอโทษ


สำหรับฉันผู้ไม่สูบบุหรี่แห่ง Ruby ℤ.upto(ℤ)วิธีการนี้เป็นเครื่องเตือนความจำที่ดีเกี่ยวกับความงามของพฤติกรรมทุกอย่างของรูบี้ การตีกอล์ฟต่อไปจะทำให้รหัสเป็นแบบฝึกหัดสำหรับเจ้าของภาษา Ruby คุณสแกนcodegolf.stackexchange.com/questions/363/หรือยัง
Roman Czyborra

0

Java 7, 96 ไบต์

แข็งแรงเล่นกอล์ฟ:

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 ไบต์

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

ค่อนข้างตรงไปตรงมา gmp::fibnumเป็นสั้นในตัว แต่ก็ไม่ได้สนับสนุนการส่งกลับลำดับทั้งหมดขึ้นไปnซึ่งไม่โดยการเพิ่มการโต้แย้งnumbers::fibonacciT

ก่อนอื่นฉันมีทางออกที่ยุ่งยากกว่าgmp::fibnumซึ่งจบลงด้วยความยาวมากกว่า 2 ไบต์

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

การใช้ฟังก์ชันที่ไม่ระบุชื่อแทนที่จะscan()บันทึก 6 ไบต์ ดูโซลูชันที่โพสต์ของฉัน
rturnbull

อาใช่โง่ของฉัน
JAD

0

dc , 56 ไบต์

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

เสร็จสิ้นการป้อนข้อมูล[1,30]ใน 51 วินาที รับอินพุตทั้งสองในสองบรรทัดแยกกันเมื่อดำเนินการแล้วและจำนวนลบด้วยเครื่องหมายขีดล่าง ( _) แทนเครื่องหมายขีดกลาง (เช่น-4จะป้อนเป็น_4)


0

PHP, 77 75 ไบต์

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

ใช้ขอบเขตจากอาร์กิวเมนต์บรรทัดคำสั่ง -nrทำงานด้วย
การจัดแสดง PHP's ตัวแปรตัวแปรอีกครั้ง (และสิ่งที่ฉันได้พบกับพวกเขา

แตกหัก

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 ที่ส่งไปยัง PHP มี 70 ไบต์:

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

0

ความจริง 65 ไบต์

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

รหัสทดสอบและผลลัพธ์

(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 ไบต์

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

ลองออนไลน์!

พบวิธีที่ดีกว่าเล็กน้อยในการจัดลำดับ แต่ PowerShell ไม่ได้เปรียบเทียบกับภาษาอื่นสำหรับภาษานี้ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.