Tổng số kỹ thuật số


30

Tất cả chúng ta đều quen thuộc với chuỗi Fibonacci :

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

Tuy nhiên, thay vì, f(n) = f(n-1) + f(n-2)chúng tôi sẽ lấy tổng số của 2 mục trước.


Trình tự vẫn nên bắt đầu với 0, 1, sau đó sự khác biệt là rõ ràng nhanh chóng. Danh sách này được lập chỉ mục 0, bạn cũng có thể sử dụng chỉ mục 1, trạng thái mà bạn đã sử dụng.

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)

Lưu ý: Tôi đã không nhận thấy sự lặp lại cho đến khi tôi tự đăng tải thử thách và ở đây tôi đã nghĩ rằng không thể viết một thử thách Fibonacci mới lạ khác.


Nhiệm vụ của bạn là, được đưa ra một số n, xuất ra chữ số thứ n của chuỗi này.

Đầu 3 chữ số: [0,1,1],

Mẫu lặp lại gồm 24 chữ số: [2,3,5,8,13,12,7,10,8,9,17,17,16,15,13,10,5,6,11,8,10,9,10,10]

Gợi ý: Bạn có thể khai thác sự lặp lại này để lợi thế của bạn.


Đây là , số byte thấp nhất là người chiến thắng.


THƯỞNG: Nếu bạn sử dụng sự lặp lại trong câu trả lời của mình, tôi sẽ trao giải cho câu trả lời có số byte thấp nhất tận dụng sự lặp lại trong chuỗi tiền thưởng 100 điểm. Điều này nên được gửi như một phần của câu trả lời ban đầu của bạn, sau câu trả lời ban đầu của bạn. Xem bài đăng này như một ví dụ về những gì tôi đang nói về: https://codegolf.stackexchange.com/a/108972/59376

Để đủ điều kiện nhận phần thưởng này, mã của bạn phải chạy trong thời gian không đổi ( O(1)) với lời giải thích.

Người chiến thắng tiền thưởng: Dennis https://codegolf.stackexchange.com/a/108967/59376 <Dennis đã thắng.

Thực hiện độc đáo nhất: https://codegolf.stackexchange.com/a/108970/59376
(Cũng sẽ nhận được 100 điểm, hoàn thành sau khi chọn câu trả lời đúng)


2
Chúng ta có thể sử dụng lập chỉ mục dựa trên 1 hay nó phải dựa trên 0?
Mèo kinh doanh

1
@BusinessCat yeah, chắc chắn, vít nó.
Bạch tuộc ma thuật Urn

1
Làm thế nào để bạn xác định lợi dụng sự lặp lại ? Nó có phải được mã hóa cứng hay tôi chỉ cần thêm một %24giải pháp "bình thường"?
Dennis

1
@Dennis Tôi xác định lợi dụng sự lặp lại có nghĩa là O(1). Mã của bạn nên được chạy trong thời gian liên tục, nếu nó thực sự khai thác sự lặp lại.
Bạch tuộc ma thuật Urn

1
@Dennis về mặt kỹ thuật% 24 trên đầu vào sẽ khiến nó bị giới hạn ở mức 27 lần lặp; Trong khi, không thú vị, nó chắc chắn được tính.
Bạch tuộc ma thuật Urn

Câu trả lời:



28

JavaScript (ES6), 45 byte

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>

xykhông thể cả hai 9, vì điều đó sẽ yêu cầu số trước đó 0, vì vậy tổng số kỹ thuật số của chúng không thể vượt quá 17. Điều này có nghĩa là gốc kỹ thuật số cho các số lớn hơn 9giống với modulo còn lại 9.


6
Điều này, điều này cũng sẽ nhận được một tiền thưởng tương đương với nhà lãnh đạo lặp đi lặp lại ... Đây là một cái nhìn sâu sắc toán học tuyệt vời.
Bạch tuộc ma thuật Urn

13

Python 2, 53 byte

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

Hàm đệ quy. Các trường hợp cơ bản của n=0n=1sản lượng n, các số lớn hơn tính toán giá trị bằng cách gọi f(n-1)f(n-2)chuyển đổi từng chuỗi thành một chuỗi, nối hai chuỗi, chuyển đổi mỗi ký tự thành một số nguyên bằng cách sử dụng mộtmap với inthàm và sau đó tính tổng danh sách kết quả.


Sử dụng thông tin modulo-24, hiện tại tôi có thể nhận được một hàm không tên đệ quy 56 byte:

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

1
Vâng! Rất nhiều +1! Một câu trả lời lặp lại :). Tôi đã thêm một phần thưởng để vinh danh ông, bạn hiện là người dẫn đầu trong một cuộc thi tiền thưởng 100 điểm!
Bạch tuộc ma thuật Urn

11

JavaScript (ES6), 34 byte

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

Có thể đóng băng trình duyệt của bạn cho các đầu vào trên 27 hoặc hơn, nhưng nó hoạt động cho tất cả các giá trị đầu vào. Điều này có thể được xác nhận với một bộ đệm đơn giản:

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>

Như đã chỉ ra trong câu trả lời xuất sắc của Neil , sản lượng không bao giờ vượt quá 17, do đó tổng kỹ thuật số của bất kỳ đầu ra nào trên 9 đều bằng n%9. Điều này cũng hoạt động với đầu ra dưới 9; chúng ta có thể làm cho nó hoạt động cho 9 bằng cách trừ 1 với ~-trước mô-đun, sau đó thêm lại vào 1 sau.


Điều tốt nhất tôi có thể làm với mã hóa cứng là 50 byte:

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

6

Thạch , 8 byte

;DFS
ç¡1

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

Làm thế nào nó hoạt động

ç¡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.

Giải pháp thay thế, 19 byte, thời gian không đổi

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

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

Làm thế nào nó hoạt động

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 cho chuzpe của “chúng ta hãy chỉ tính phần lặp đi lặp lại cả trong thời gian liên tục”: D
Felix Dombek

4

JavaScript (ES6), 52 46 45 byte

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

Sử dụng

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

Đầu ra

13

Giải trình

Hàm này kiểm tra xem đầu vào nhỏ hơn 2 và nếu vậy, nó sẽ trả về đầu vào. Mặt khác, nó tạo ra một mảng gồm hai giá trị được nối với nhau dưới dạng chuỗi. Hai giá trị này là kết quả của việc gọi hàm với input - 1input - 2 .

Các ... nhà điều hành chia tách chuỗi này vào một mảng ký tự, sau đó được chuyển thành một chuỗi một lần nữa, nhưng bây giờ với +es giữa các giá trị. Chuỗi này sau đó được hiểu là mã, do đó tổng được tính, sau đó được trả lại.

Đây là một thuật toán đệ quy kép, làm cho nó khá kém hiệu quả. Nó cần 2 n-2chức năng gọi cho đầu vào n. Như vậy, đây là một giải pháp dài hơn nhưng nhanh hơn. Cảm ơn ETHproductions đã đưa ra nó.

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

Điều này không hoạt động đối với các giá trị lớn như 27, nó đóng băng trình duyệt (ít nhất là đối với tôi)
Kritixi Lithos

Phải mất một thời gian, nhưng nó sẽ đến đó ... cuối cùng. Tôi sẽ xem xét nó, nhưng hiệu suất không quan trọng đối với thử thách này ...
Luke

Chà, jesus, nó không quá mãnh liệt về mặt tính toán, chương trình của bạn sẽ hoạt động với các giá trị vượt quá 27 ... Nhưng nếu nó hoạt động trong 1-28, về mặt kỹ thuật chứng tỏ nó hoạt động tốt hơn.
Bạch tuộc ma thuật Urn

1
@KritixiLithos Đó là sự đệ quy đó là vấn đề. Việc tính toán số thứ n trong chuỗi yêu cầu khoảng 2 ^ (n-2) các hàm gọi, được xây dựng khá nhanh.
Sản phẩm ETH

Bạn có thể lưu một byte với [..._(--$)+[_(--$)]]:-)
ETHproductions

4

05AB1E , 8 byte

XÎF‚¤sSO

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

Giải trình

XÎ        # push 1,0,input
  F       # input_no times do:
   ‚      # pair the top 2 elements of the stack
    ¤     # push a copy of the 2nd element to the stack
     s    # swap the pair to the top of the stack
      S   # convert to list of digits
       O  # sum

3

CJam, 22 20 byte

Đã lưu 2 byte nhờ Martin Ender

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

Thuật toán đệ quy đơn giản, không có gì lạ mắt. Chỉ số 0.

Hãy thử trực tuyến! hoặc kiểm tra 0-50 (thực sự chạy khá nhanh).

Giải trình

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 byte

Giải pháp sử dụng sự lặp lại. Thuật toán tương tự như giải pháp của Jonathan Allan.

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

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


3

Perl 6 ,  41  37 byte

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

Thử nó

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

Thử nó

{ # 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
Bạn có thể viết lambda bên trong như *.comb.sum+*.comb.sum.
smls

2

MATL , 15 byte

lOi:"yyhFYAss]&

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

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 byte

hoặc 61 byte đếm mã thoát là 1 byte mỗi

0 được lập chỉ mục. Tương tự như một số câu trả lời khác, tôi đang lập chỉ mục một bảng tra cứu các giá trị nhưng tôi đã nén nó thành các đoạn 4 byte. Tôi không bận tâm điều tra phiên bản mod 24 vì tôi không nghĩ nó thú vị vì những người khác đã làm như vậy nhưng hãy đối mặt với nó, dù sao thì C cũng sẽ không chiến thắng.

#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)

giải trình:

#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

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


Tôi đếm mã thoát là 1 byte mỗi mã! Công việc tuyệt vời
Albert Renshaw



2

Toán học, 49 byte

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

Định nghĩa đệ quy đơn giản. Được khá chậm sau một thời gian.

Toán học, 79 71 byte

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

Mã hóa mô hình định kỳ. Nhanh như chớp và cực kỳ lạm dụng Mathicala :) Cảm ơn JungHwan Min vì đã tiết kiệm được 8 byte!


Đối với mã thứ hai của bạn LetterNumber@"JJBCEHMLGJHIQQPOMJEFKHJ"ngắn hơn 8 byte 43626804920391712116157158790~IntegerDigits~18.
JungHwan Min

bạn đúng! Một trong những ngày này tôi sẽ nhớ LetterNumber....
Greg Martin

1

Python 2 , 56 byte

Giải pháp lặp đơn giản.

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

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

Sử dụng (a%9or a)+(b%9or b)thực sự hóa ra là ngắn hơn sum(map(int(`a`+`b`)))!


Tôi nghĩ ý bạn là sum(map(int,a+b))(không thể tìm ra cách sử dụng `trong các bình luận)

1

PowerShell , 79 byte

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

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

Giải pháp lặp lại nhàm chán kéo dài mà tính toán tổng số trực tiếp mỗi forvòng lặp. Ở cuối vòng lặp, số chúng tôi muốn có $b, do đó, số còn lại trên đường ống và đầu ra là ẩn. Lưu ý rằng nếu đầu vào là 0, thì vòng lặp sẽ không được nhập vì điều kiện là sai, vì vậy $bvẫn còn 0.


1

Mẻ, 85 byte

@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%

Tôi đã tự hỏi làm thế nào tôi sẽ chuyển câu trả lời JavaScript của mình sang lô nhưng đầu mối nằm trong giải pháp Python của @ Dennis.


1

Bình thường, 20 byte

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

Một chương trình lấy đầu vào của một số nguyên không có chỉ số và in kết quả.

Bộ kiểm tra (Phần đầu tiên để định dạng)

Làm thế nào nó hoạt động

[Giải thích đến sau]


1

Ruby, 58 byte

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

Các giải pháp mã hóa đơn giản.



1

Octave, 148 byte

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

Chào mừng bạn đến với ppcg! Bài đăng đầu tiên rất hay!
Rɪᴋᴇʀ

1

Haskell, 151 byte

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)

Gọi hàm với f 123456789012345678901234567890123456789012345678 , ví dụ.

Mã này hoạt động với các chỉ số rất lớn. Do chức năng modulo 24 được triển khai nên nó rất nhanh.

Mã không nén:

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

Một giải pháp dài khủng khiếp, nhưng nó tốt hơn so với 108 tôi ban đầu có. Tôi nghi ngờ rằng có nhiều cách tốt hơn để làm điều này, nhưng tôi không thể nhìn thấy nó vào lúc này.

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

Đây là một hàm không tên, sử dụng gsubscan(t=chia các số trong vectơ thành các chữ số. Tổng của những thứ này được thêm vào vector trong khi mục đầu tiên bị loại bỏ. repeatđược sử dụng để bước qua trình tựn lần và kết quả là mục đầu tiên của vectơ.



0

Toán học, 67 byte

r=IntegerDigits;f@0=0;f@1=1;f[x_]:=f@x=Tr@r@f[x-1]+Tr@r@f[x-2];f@#&
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.