Fibonacci ผลรวมดิจิตอล


30

เราทุกคนคุ้นเคยกับลำดับฟีโบนักชี :

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765

อย่างไรก็ตามแทนที่จะf(n) = f(n-1) + f(n-2)เราจะนำผลรวมดิจิตอลของ 2 รายการก่อนหน้า


ลำดับควรเริ่มต้นด้วย0, 1หลังจากนั้นความแตกต่างจะปรากฏอย่างรวดเร็ว รายการนี้ได้รับการจัดทำดัชนี 0 คุณสามารถใช้ 1 ดัชนีเช่นกันซึ่งเป็นสถานะที่คุณใช้

f(0)  = 0
f(1)  = 1
f(2)  = 1   # 0 + 1
f(3)  = 2   # 1 + 1
f(4)  = 3   # 1 + 2
f(5)  = 5   # 2 + 3
f(6)  = 8   # 3 + 5
f(7)  = 13  # 8 + 5
f(8)  = 12  # 8 + 1 + 3
f(9)  = 7   # 1 + 3 + 1 + 2
f(10) = 10  # 1 + 2 + 7
f(11) = 8   # 7 + 1 + 0
f(12) = 9   # 1 + 0 + 8
f(13) = 17  # 8 + 9
f(14) = 17  # 9 + 1 + 7
f(15) = 16  # 1 + 7 + 1 + 7
f(16) = 15  # 1 + 7 + 1 + 6
f(17) = 13  # 1 + 6 + 1 + 5
f(18) = 10  # 1 + 5 + 1 + 3
f(19) = 5   # 1 + 3 + 1 + 0
f(20) = 6   # 1 + 0 + 5
f(21) = 11  # 5 + 6
f(22) = 8   # 6 + 1 + 1
f(23) = 10  # 1 + 1 + 8
f(24) = 9   # 8 + 1 + 0
f(25) = 10  # 1 + 0 + 9
f(26) = 10  # 9 + 1 + 0
f(27) = 2   # 1 + 0 + 1 + 0
(After this point it repeats at the 3rd term, 0-indexed)

หมายเหตุ: ฉันไม่ได้สังเกตเห็นการทำซ้ำจนกว่าฉันจะโพสต์ความท้าทายของตัวเองและที่นี่ฉันคิดว่ามันเป็นไปไม่ได้ที่จะเขียนอีกความท้าทาย Fibonacci ใหม่


งานของคุณคือให้ตัวเลขnเอาท์พุทตัวเลขที่ n ของลำดับนี้

3 หลักแรก: [0,1,1],

รูปแบบการทำซ้ำ 24 หลัก: [2,3,5,8,13,12,7,10,8,9,17,17,16,15,13,10,5,6,11,8,10,9,10,10]

คำแนะนำ: คุณอาจสามารถใช้ประโยชน์จากการทำซ้ำนี้เพื่อประโยชน์ของคุณ


นี่คือไบต์ต่ำสุดคือผู้ชนะ


โบนัส:หากคุณใช้การทำซ้ำในคำตอบของคุณฉันจะให้รางวัลคำตอบนับไบต์ต่ำสุดที่ใช้ประโยชน์จากการทำซ้ำในลำดับที่ได้รับรางวัล 100 คะแนน ควรส่งสิ่งนี้เป็นส่วนหนึ่งของคำตอบเดิมของคุณหลังจากคำตอบเดิมของคุณ ดูโพสต์นี้เป็นตัวอย่างของสิ่งที่ฉันกำลังพูดถึง: https://codegolf.stackexchange.com/a/108972/59376

ในการรับโบนัสนี้รหัสของคุณจะต้องทำงานในเวลาคงที่ ( O(1)) พร้อมคำอธิบาย

ผู้ชนะโบนัส: เดนนิสhttps://codegolf.stackexchange.com/a/108967/59376 <เดนนิสชนะ

การติดตั้งที่ไม่ซ้ำใครมากที่สุด: https://codegolf.stackexchange.com/a/108970/59376
(จะได้รับ 100 คะแนนซึ่งจะสรุปหลังจากเลือกคำตอบที่ถูกต้องแล้ว)


2
เราสามารถใช้การจัดทำดัชนีแบบ 1 หรือเป็นแบบอิง 0 ได้หรือไม่
แมวธุรกิจ

1
@ BusinessCat ใช่แน่นอนว่าสกรู
Magic Octopus Urn

1
คุณกำหนดให้ใช้ประโยชน์จากการซ้ำซ้อนอย่างไร ต้องฮาร์ดโค้ดหรือเพิ่ม%24โซลูชัน "ปกติ" หรือไม่
Dennis

1
@Dennis O(1)ฉันกำหนดการใช้ประโยชน์จากการทำซ้ำหมายถึง รหัสของคุณควรจะทำงานในเวลาคงที่หากมีการใช้ประโยชน์จากการทำซ้ำอย่างแท้จริง
Magic Octopus Urn

1
@Dennis ทางเทคนิค% 24 ของอินพุตจะทำให้มีขอบเขตบนที่ 27 การวนซ้ำ; ในขณะที่ไม่น่าสนใจมันนับอย่างแน่นอน
Magic Octopus Urn

คำตอบ:



28

JavaScript (ES6), 45 ไบต์

f=(n,x=0,y=1)=>n?f(n-1,y,(x%9||x)+(y%9||y)):x
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

xและyจะต้องไม่9เนื่องจากว่าจะต้องมีจำนวนก่อนหน้าจะเป็นดังนั้นผลรวมดิจิตอลของพวกเขาจะต้องไม่เกิน0 17ซึ่งหมายความว่ารากดิจิตอลสำหรับตัวเลขที่มากกว่าเป็นเช่นเดียวกับโมดูโลที่เหลือ99


6
สิ่งนี้สิ่งนี้จะได้รับค่าตอบแทนเทียบเท่ากับผู้นำการทำซ้ำ ... นี่คือความเข้าใจด้านคณิตศาสตร์ที่ยอดเยี่ยม
Magic Octopus Urn

13

Python 2, 53 ไบต์

f=lambda n:n>1and sum(map(int,`f(n-1)`+`f(n-2)`))or n

ฟังก์ชั่นวนซ้ำ ตัวพิมพ์ใหญ่ของn=0และn=1ให้ผลเป็นnจำนวนที่มากขึ้นคำนวณค่าโดยการโทรf(n-1)และf(n-2)แปลงแต่ละสตริงให้เป็นสตริงเชื่อมโยงสองสตริงแปลงอักขระแต่ละตัวให้เป็นจำนวนเต็มโดยใช้ a mapพร้อมกับintฟังก์ชันจากนั้นสรุปรายการผลลัพธ์


การใช้ข้อมูล modulo-24 ฉันสามารถรับฟังก์ชั่นที่ไม่มีชื่อแบบ 56 ไบต์ไม่เรียกซ้ำ:

lambda n:int(('011'+'2358dc7a89hhgfda56b8a9aa'*n)[n],18)

1
ใช่ +1 มาก! คำตอบซ้ำ :) ฉันได้เพิ่มส่วนโบนัสในเกียรติคุณของคุณตอนนี้คุณเป็นผู้นำในการประกวดรางวัล 100 คะแนน!
Magic Octopus Urn

11

JavaScript (ES6), 34 ไบต์

f=n=>n<2?n:~-f(--n)%9+~-f(--n)%9+2

อาจตรึงเบราว์เซอร์ของคุณสำหรับอินพุตที่สูงกว่า 27 หรือมากกว่านั้น แต่ใช้ได้กับค่าอินพุตทั้งหมด สิ่งนี้สามารถตรวจสอบได้ด้วยแคชอย่างง่าย:

c=[];f=n=>n<2?n:c[n]=c[n]||~-f(--n)%9+~-f(--n)%9+2
<input type=number value=0 min=0 step=1 oninput="O.value=f(this.value)"> <input id=O value=0 disabled>

เป็นแหลมออกในคำตอบที่ยอดเยี่ยมของนีลเอาท์พุทไม่เคยเกิน 17 ดังนั้นผลรวมของการส่งออกดิจิตอลใด ๆ ดังกล่าวข้างต้นที่ 9 n%9จะมีค่าเท่ากับ นอกจากนี้ยังใช้งานได้กับเอาต์พุตด้านล่าง 9 เราสามารถทำให้มันใช้งานได้ 9 ด้วยการลบ 1 ด้วย~-โมดูลัสก่อนจากนั้นบวกกลับใน 1 หลัง


สิ่งที่ดีที่สุดที่ฉันสามารถทำได้กับการเข้ารหัสฮาร์ดดิคคือ 50 ไบต์:

n=>"0x"+"7880136ba5867ffedb834968"[n%24]-(n<3)*9+2

6

เยลลี่ขนาด 8 ไบต์

;DFS
ç¡1

ลองออนไลน์!

มันทำงานอย่างไร

ç¡1   Main link. No arguments. Implicit left argument: 0

  1   Set the right argument to 1.
ç¡    Repeatedly execute the helper link n times – where n is an integer read from
      STDIN – updating the left argument with the return value and the right
      argument with the previous value of the left argument. Yield the last result.


;DFS  Helper link. Arguments: a, b

;     Concatenate; yield [a, b].
 D    Decimal; convert both a and b to their base-10 digit arrays.
  F   Flatten the result.
   S  Compute the sum of the digits.

โซลูชันสำรอง 19 ไบต์เวลาคงที่

;DFS
9⁵ç23С⁸ịµṠ>?2

ลองออนไลน์!

มันทำงานอย่างไร

9⁵ç23С⁸ịµṠ>?2  Main link. Argument: n

9               Set the return value to 9
 ⁵              Yield 10.
  ç23С         Execute the helper link 23 times, with initial left argument 10
                and initial right argument 9, updating the arguments as before.
                Yield all intermediate results, returning
                [10,10,2,3,5,8,13,12,7,10,8,9,17,17,16,15,13,10,5,6,11,8,10,9].
   ⁸ị           Extract the element at index n. Indexing is 1-based and modular.
     µ          Combine all links to the left into a chain.
       >?2      If n > 2, execute the chain.
      Ṡ         Else, yield the sign if n.

1
+1 สำหรับ chuzpe ของ "ลองคำนวณส่วนซ้ำทั้งหมดในเวลาคงที่": D
Felix Dombek

4

JavaScript (ES6), 52 46 45 ไบต์

_=$=>$<2?$:eval([..._(--$)+[_(--$)]].join`+`)

การใช้

_=$=>$<2?$:eval([..._(--$)+[_(--$)]].join`+`)
_(7)

เอาท์พุต

13

คำอธิบาย

ฟังก์ชั่นนี้จะตรวจสอบว่าอินพุตมีขนาดเล็กกว่า 2 หรือไม่และหากเป็นเช่นนั้นจะส่งคืนอินพุต มิฉะนั้นจะสร้างอาร์เรย์ของค่าสองค่าที่ผนวกเข้าด้วยกันเป็นสตริง ทั้งสองค่าเป็นผลมาจากการเรียกฟังก์ชั่นที่มีและinput - 1input - 2

...ผู้ประกอบการแยกสายนี้เป็น array ของตัวละครซึ่งจากนั้นจะถูกแปลงเป็นสตริงอีกครั้ง แต่ตอนนี้กับ+ES ระหว่างค่า สตริงนี้จะถูกตีความว่าเป็นรหัสดังนั้นผลรวมจะถูกคำนวณซึ่งจะถูกส่งกลับ

นี่เป็นอัลกอริทึมแบบเรียกซ้ำสองครั้งซึ่งทำให้ไม่มีประสิทธิภาพ มันต้อง 2 สายฟังก์ชั่นสำหรับการป้อนข้อมูลn-2 nดังนั้นนี่คือวิธีแก้ปัญหาที่ยาวกว่า แต่เร็วกว่า ขอบคุณ ETHproductions ที่มาพร้อมกับมัน

f=($,p=1,c=0)=>$?f($-1,c,eval([...p+[c]].join`+`)):c

นี้ไม่ทำงานสำหรับค่าขนาดใหญ่เช่น 27 มันค้างเบราว์เซอร์ (อย่างน้อยก็ไม่สำหรับฉัน)
Kritixi Lithos

มันใช้เวลาพอสมควร แต่มันจะไปถึงที่นั่น ... ในที่สุด ฉันจะดูมัน แต่การแสดงนั้นไม่สำคัญสำหรับความท้าทายนี้ ...
ลูกา

โปรแกรมของคุณควรมีค่ามากกว่า 27 ... แต่ถ้ามันใช้งานได้ 1-28 มันจะพิสูจน์ได้ว่าในทางเทคนิคมันทำงานได้ดีกว่า
Magic Octopus Urn

1
@KritixiLithos มันเป็นการเรียกซ้ำที่มีปัญหา การคำนวณตัวเลขที่nในลำดับนั้นต้องการการเรียกใช้ฟังก์ชัน2 ^ (n-2)ซึ่งสร้างขึ้นอย่างรวดเร็ว
ETHproductions

คุณสามารถบันทึกไบต์ด้วย[..._(--$)+[_(--$)]]:-)
ETHproductions


3

CJam, 22 20 ไบต์

บันทึก 2 ไบต์ขอบคุณ Martin Ender

ri2,{(_(jAb\jAb+:+}j

อัลกอริทึมแบบเรียกซ้ำได้ตรงไปตรงมาไม่มีอะไรแฟนซี 0 การจัดทำดัชนี

ลองออนไลน์! หรือทดสอบ 0-50 (ทำงานได้ค่อนข้างเร็ว)

คำอธิบาย

ri                    Read an integer from input
  2,                  Push the array [0 1]
    {             }j  Recursive block, let's call it j(n), using the input as n and [0 1] as base cases
     (                 Decrement (n-1)
      _(               Duplicate and decrement again (n-2)
        jAb            Get the list digits of j(n-2)
           \           Swap the top two elements
            jAb        Get the list of digits of j(n-1)
               +       Concatenate the lists of digits
                :+     Sum the digits

CJam, 42 ไบต์

การแก้ปัญหาโดยใช้การทำซ้ำ อัลกอริทึมที่คล้ายกับโซลูชันของ Jonathan Allan

ri_2,1+"[2358DC7A89HHGFDA56B8A9AA]"S*~@*+=

ลองออนไลน์!


3

Perl 6 ,  41  37 ไบต์

{(0,1,{[+] |$^a.comb,|$^b.comb}...*)[$_]}

ลองมัน

{(0,1,*.comb.sum+*.comb.sum...*)[$_]}

ลองมัน

{ # bare block lambda with implicit parameter 「$_」
  (

    0, 1,           # first two values

    # WhateverCode lambda with two parameters ( the two 「*」 )
    *.comb.sum      # digital sum of first parameter
    +
    *.comb.sum      # digital sum of second parameter

    ...            # keep using that code object to generate new values until:

    *              # never stop

  )[ $_ ]          # index into the sequence
}

1
*.comb.sum+*.comb.sumคุณสามารถเขียนแลมบ์ดาชั้นในเป็น
smls

2

MATL , 15 ไบต์

lOi:"yyhFYAss]&

ลองออนไลน์!

lO       % Push 1, then 0. So the next generated terms will be 1, 1, 2,... 
i        % Input n
:"       % Repeat that many times
  yy     %   Duplicate top two elements in the stack
  h      %   Concatenate into length-2 horizontal vector
  FYA    %   Convert to decimal digits. Gives a 2-row matrix
  ss     %   Sum of all matrix entries
]        % End
&        % Specify that next function (display) will take only 1 input
         % Implicit display


2

C, 96 ไบต์

หรือ 61 ไบต์นับรหัสยกเว้นเป็น 1 ไบต์

0 จัดทำดัชนีแล้ว คล้ายกับคำตอบอื่น ๆ ที่ฉันจัดทำดัชนีตารางการค้นหาค่า แต่ฉันได้บีบอัดมันเป็น 4 ไบต์ชิ้น ฉันไม่ได้สนใจการตรวจสอบ mod 24 version เพราะฉันไม่คิดว่ามันน่าสนใจเพราะคนอื่น ๆ ทำไปแล้ว แต่ลองมาดูกัน C จะไม่ชนะต่อไป

#define a(n) n<3?!!n:2+(15&"\x1\x36\xba\x58\x67\xff\xed\xb8\x34\x96\x87\x88"[(n-3)/2%12]>>n%2*4)

คำอธิบาย:

#define a(n)                                                                                     // using a preprocessor macro is shorter than defining a function
             n<3?!!n:                                                                            // when n is less than 3 !!n will give the series 0,1,1,1..., otherwise..
                                                                             (n-3)/2%12          // condition the input to correctly index the string...
                           "\x1\x36\xba\x58\x67\xff\xed\xb8\x34\x96\x87\x88"                     // which has the repeating part of the series encoded into 4 bits each number
                                                                                                 // these are encoded 2 less than what we want as all numbers in the series after the third are 2 <= a(n>2) <= 17 which conforms to 0 <= a(n>2) - 2 <= 15
                                                                                        >>n%2*4  // ensure the data is in the lower 4 bits by shifting it down, n%2 will give either 0 or 1, which is then multiplied by 4
                        15&                                                                      // mask those bits off
                     2+                                                                          // finally, add 2 to correct the numbers pulled from the string

ลองออนไลน์!


ฉันนับรหัสการหลบหนีเป็น 1 ไบต์ในแต่ละครั้ง! ผลงานยอดเยี่ยม
Albert Renshaw



2

Mathematica, 49 ไบต์

If[#<2,#,Tr[Join@@IntegerDigits[#0/@{#-1,#-2}]]]&

นิยามการเรียกซ้ำแบบตรงไปตรงมา เริ่มช้าลงอีกสักครู่

Mathematica, 79 71 ไบต์

If[#<3,Sign@#,(9@@LetterNumber@"JJBCEHMLGJHIQQPOMJEFKHJ")[[#~Mod~24]]]&

Hardcoding ลวดลายเป็นระยะ สายฟ้าเร็วและน่าพอใจกับ Mathematica อย่างไม่น่าเชื่อ :) ขอบคุณ JungHwan Min สำหรับการบันทึก 8 ไบต์!


สำหรับรหัสที่สองของคุณLetterNumber@"JJBCEHMLGJHIQQPOMJEFKHJ"คือ 8 43626804920391712116157158790~IntegerDigits~18ไบต์สั้นกว่า
JungHwan Min

คุณถูก! หนึ่งในวันนี้ฉันจะจำLetterNumber....
เกร็กมาร์ติน

1

Python 2 , 56 ไบต์

วิธีแก้ซ้ำแบบง่าย

a,b=0,1
exec'a,b=b,(a%9or a)+(b%9or b);'*input()
print a

ลองออนไลน์!

การใช้งาน(a%9or a)+(b%9or b)จริงกลายเป็นสั้นกว่าsum(map(int(`a`+`b`)))!


ฉันคิดว่าคุณหมายถึงsum(map(int,a+b))(ไม่สามารถหาวิธีใช้ `ในความคิดเห็น)

1

PowerShell , 79 ไบต์

$b,$c=0,1;for($a=$args[0];$a;$a--){$z=[char[]]"$b$c"-join'+'|iex;$b=$c;$c=$z}$b

ลองออนไลน์!

โซลูชันวนซ้ำที่น่าเบื่อยาวที่นำการคำนวณผลรวมตัวเลขโดยตรงแต่ละforลูป ในตอนท้ายของลูปตัวเลขที่เราต้องการอยู่ใน$bนั้นดังนั้นสิ่งที่เหลืออยู่บนไพพ์ไลน์และเอาท์พุทนั้นเป็นนัย โปรดทราบว่าถ้าใส่เป็น0แล้วห่วงจะไม่ได้ใส่ตั้งแต่เงื่อนไขเป็นเท็จเพื่อให้ยังคงอยู่$b0


1

แบตช์ 85 ไบต์

@set/ax=0,y=1
@for /l %%i in (1,1,%1)do @set/az=x-x/10*9+y-y/10*9,x=y,y=z
@echo %x%

ฉันสงสัยว่าฉันจะตอบพอร์ต JavaScript ของฉันเป็นชุดข้อมูลได้อย่างไรเบาะแสอยู่ในโซลูชัน Python ของ @ Dennis


1

Pyth, 20 ไบต์

J,01VQ=+JssjRT>2J)@J

โปรแกรมที่รับอินพุตของจำนวนเต็มศูนย์ดัชนีและพิมพ์ผลลัพธ์

ชุดทดสอบ (ส่วนแรกสำหรับการจัดรูปแบบ)

มันทำงานอย่างไร

[คำอธิบายมาในภายหลัง]


1

ทับทิม 58 ไบต์

->n{n<3?n<=>0:"9aa2358dc7a89hhgfda56b8a"[n%24].to_i(18)}

โซลูชันฮาร์ดโค้ดที่เรียบง่าย



1

คู่, 148 ไบต์

function f = fib(n)
  if (n <= 1)
    f = n;
  else
    f = sum(int2str((fib(n - 1)))-48) + sum(int2str((fib(n - 2)))-48);
  endif
endfunction

ยินดีต้อนรับสู่ ppcg! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

1

Haskell, 151 ไบต์

import Numeric
import Data.Char
s i=foldr(\c i->i+digitToInt c)0$showInt i""
d a b=a:d b(s a+s b)
f 0=0
f 1=1
f 2=1
f i=d 2 3!!fromIntegral(mod(i-3)24)

เรียกใช้ฟังก์ชันด้วยf 123456789012345678901234567890123456789012345678เช่น

รหัสทำงานด้วยดัชนีที่ใหญ่มาก เนื่องจากฟังก์ชั่นการใช้งาน modulo 24 นั้นรวดเร็วมาก

รหัสที่ไม่บีบอัด:

-- FibonacciDigital
-- Gerhard
-- 13 February 2017

module FibonacciDigital () where

import Numeric
import Data.Char

-- sum of digits
digitSum :: Int -> Int 
digitSum i = foldr (\c i -> i + digitToInt c) 0 $ showInt i ""

-- fibonacci digital sequence function with arbitrary starting values
fibonacciDigitals :: Int -> Int -> [Int]
fibonacciDigitals a b = a : fibonacciDigitals b (digitSum a + digitSum b)

-- index -> fibonacci digital value
f :: Integer -> Int 
f 0 = 0 
f 1 = 1 
f 2 = 1 
f i = fibonacciDigitals 2 3 !! fromIntegral (mod (i-3) 24) 

-- End

0

R, 90 ไบต์

ทางออกที่ยาวอย่างน่ากลัว แต่มันก็ดีกว่า 108 ตอนแรกที่ฉันมี ฉันสงสัยว่ามีวิธีที่ดีกว่าในการทำเช่นนี้ แต่ฉันไม่สามารถเห็นได้ในขณะนี้

function(n,x=0:1){repeat`if`(n,{x=c(x,sum(scan(t=gsub('',' ',x))))[-1];n=n-1},break);x[1]}

นี่คือฟังก์ชันที่ไม่มีชื่อที่ใช้gsubและscan(t=เพื่อแบ่งตัวเลขในเวกเตอร์เป็นตัวเลข ผลรวมของสิ่งเหล่านี้จะถูกเพิ่มลงในเวกเตอร์ในขณะที่รายการแรกถูกทิ้ง repeatจะใช้ในการผ่านขั้นตอนตามลำดับnและผลลัพธ์คือรายการแรกของเวกเตอร์



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