Kiên nhẫn, trẻ tuổi Padovan


44

Mọi người đều biết chuỗi Fibonacci:
Bạn lấy một hình vuông, gắn một hình vuông bằng nhau vào nó, sau đó liên tục gắn một hình vuông có chiều dài cạnh bằng với chiều dài cạnh lớn nhất của hình chữ nhật kết quả.
Kết quả là một hình vuông xoắn ốc tuyệt đẹp có dãy số là dãy số Fibonacci :

Nhưng, nếu chúng ta không muốn sử dụng hình vuông thì sao?

Nếu chúng ta sử dụng các hình tam giác đều, thay vì hình vuông theo kiểu tương tự, chúng ta sẽ có được một hình tam giác đẹp như nhau và một chuỗi mới: chuỗi Padovan , còn gọi là A000931 :

Bài tập, nhiệm vụ:

Cho một số nguyên dương, VIẾT SAI RỒI , xuất ra mộtVIẾT SAI RỒI , số hạng thứ trong chuỗi Padovan HOẶC các số hạng đầu tiên .VIẾT SAI RỒIVIẾT SAI RỒI

Giả sử rằng ba số hạng đầu tiên của chuỗi là tất cả . Do đó, chuỗi sẽ bắt đầu như sau: 1

1,1,1,2,2,3,...

Đầu vào:

  • Bất kỳ số nguyên dươngVIẾT SAI RỒI0

  • Đầu vào không hợp lệ không phải đưa vào tài khoản

Đầu ra:

  • Các thứ hạn trong chuỗi Padovan HOẶC người đầu tiên NVIẾT SAI RỒIVIẾT SAI RỒI về trình tự Padovan.

  • Nếu N đầu tiênVIẾT SAI RỒI thuật ngữ được in ra, đầu ra có thể là bất cứ điều gì thuận tiện (danh sách / mảng, chuỗi nhiều dòng, v.v.)

  • Có thể là 0 -exexed hoặc 1 -exexed

Các trường hợp kiểm tra:
(0 chỉ mục, VIẾT SAI RỒI hạn th)

Input | Output
--------------
0     | 1
1     | 1
2     | 1
4     | 2
6     | 4
14    | 37
20    | 200
33    | 7739

(1 chỉ mục, VIẾT SAI RỒI điều khoản đầu tiên )

Input | Output
--------------
1     | 1
3     | 1,1,1
4     | 1,1,1,2
7     | 1,1,1,2,2,3,4
10    | 1,1,1,2,2,3,4,5,7,9
12    | 1,1,1,2,2,3,4,5,7,9,12,16

Quy tắc:


2
14(0-index) được hiển thị như xuất ra 28trong khi tôi tin rằng nó sẽ mang lại37
Jonathan Allan

@Jonathan ALLan đúng, bạn đúng. Tôi đã sửa hai trường hợp kiểm tra cuối cùng cho học kỳ thứ nhưng không phải là trường hợp đó. Bài viết đã được chỉnh sửa. VIẾT SAI RỒI
Tàu

@LuisMendo Tôi tin là như vậy. Tôi sẽ chỉnh sửa bài viết.
Tàu

1
@sharur định nghĩa này cho chuỗi Fibonacci là định nghĩa trực quan . Mỗi ô vuông liên tiếp được thêm vào có độ dài của thuật ngữ đó trong chuỗi. Trình tự bạn mô tả là lý do số đằng sau nó. Cả hai chuỗi hoạt động tốt như nhau.
Tàu

1
Lưu ý rằng trình tự OEIS mà bạn liên kết hơi khác nhau, vì nó sử dụng a_0=1, a_1=0, a_2=0. Cuối cùng, nó đã bị thay đổi một chút bởi vì sau đóa_5=a_6=a_7=1
Carmeister

Câu trả lời:


59

Thạch , 10 byte

9s3’Ẓæ*³FṀ

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

1 chỉ mục. Tính phần tử lớn nhất của:

[001101010]n
trong đó ma trận nhị phân được tính toán thuận tiện là:
[isprime(0)isprime(1)isprime(2)isprime(3)isprime(4)isprime(5)isprime(6)isprime(7)isprime(8)]

(đây là một sự trùng hợp hoàn toàn.)

9s3         [[1,2,3],[4,5,6],[7,8,9]]    9 split 3
   ’        [[0,1,2],[3,4,5],[6,7,8]]    decrease
    Ẓ       [[0,0,1],[1,0,1],[0,1,0]]    isprime
     æ*³    [[0,0,1],[1,0,1],[0,1,0]]^n  matrix power by input
        FṀ                               flatten, maximum

33
đây rõ ràng là một loại voodoo
Pureferret

7
Điều này nên được công bố.
YSC

6
@YSC Nó đã được xuất bản trong A000931 . Tôi sẽ không bao giờ đoán được thủ thuật số nguyên tố :)
flawr

1
... thực hiện điều đó "trừ khi ai đó có thể đánh hai byte khỏi cái này" :) (bây giờ tôi có 9 byter )
Jonathan Allan

1
Tôi đã quá quen với việc nhìn thấy những câu trả lời nhỏ nhặt một cách vô lý ở đây, tôi nghĩ rằng dấu phẩy sau 'Jelly' thực tế là mã cho vấn đề này
TASos Papastylianou


26

Thạch ,  10 9  8 byte

ŻṚm2Jc$S

Liên kết đơn được chấp nhận n(0 chỉ mục) mang lại kết quả P(n).

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

Làm sao?

Dụng cụ P(n)=i=0n2(i+1n2i)

ŻṚm2Jc$S - Link: integer, n       e.g. 20
Ż        - zero range                  [0, 1, 2, 3, 4, ..., 19, 20]
 Ṛ       - reverse                     [20, 19, ..., 4, 3, 2, 1, 0]
  m2     - modulo-slice with 2         [20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0]  <- n-2i
      $  - last two links as a monad:
    J    -   range of length           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]  <- i+1
     c   -   left-choose-right         [ 0,  0,  0,  0,  0,  0,  0, 28,126, 45,  1]
       S - sum                         200

đây là một "twofer"
... một phương thức hoàn toàn khác với 8 byte ( phương thức này được lập chỉ mục 1, nhưng chậm hơn nhiều):

3ḊṗRẎ§ċ‘ - Link: n
3Ḋ       - 3 dequeued = [2,3]
   R     - range = [1,2,3,...,n]
  ṗ      -   Cartesian power         [[[2],[3]],[[2,2],[2,3],[3,2],[3,3]],[[2,2,2],...],...]
    Ẏ    - tighten                   [[2],[3],[2,2],[2,3],[3,2],[3,3],[2,2,2],...]
     §   - sums                      [ 2,  3,   4,    5,    5,    6,     6,...]
       ‘ - increment                 n+1
      ċ  - count occurrences         P(n)

18

Haskell , 26 byte

(l!!)
l=1:1:1:2:scanl(+)2l

Hãy thử trực tuyến!Xuất ra số hạng thứ 0 không được lập chỉ mục.

Tôi nghĩ rằng giải pháp đệ quy "rõ ràng" dưới đây sẽ là vô địch, nhưng sau đó tôi đã tìm thấy điều này. Nó tương tự như biểu thức golf cổ điển l=1:scanl(+)1lcho danh sách Fibonacci vô hạn, nhưng ở đây, sự khác biệt giữa các yếu tố liền kề là thuật ngữ 4 vị trí trở lại. Chúng ta có thể viết trực tiếp nhiều hơn l=1:1:zipWith(+)l(0:l), nhưng lâu hơn.

Nếu thử thách này cho phép đầu ra danh sách vô hạn, chúng ta có thể cắt dòng đầu tiên và có 20 byte.

27 byte

f n|n<3=1|1>0=f(n-2)+f(n-3)

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




6

Octave / MATLAB, 35 33 byte

@(n)[1 filter(1,'cbaa'-98,2:n<5)]

Xuất ra các điều khoản n đầu tiên .

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

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

Hàm ẩn danh thực hiện bộ lọc đệ quy .

'cbaa'-98là một hình thức ngắn hơn để sản xuất [1 0 -1 -1].

2:n<5là một hình thức ngắn hơn để sản xuất [1 1 1 0 0 ··· 0]( n terms1 điều khoản).

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])chuyển đầu vào [1 1 1 0 0 ··· 0]qua bộ lọc thời gian rời rạc được xác định bởi hàm truyền với hệ số tử số 1và hệ số mẫu số [1 0 -1 -1].


6

J , 22 byte

-2 byte nhờ ngn và Galen

dạng đóng, 26 byte

0.5<.@+1.04535%~1.32472^<:

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

lặp, 22 byte

(],1#._2 _3{ ::1])^:[#

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


1
Một giải pháp 24 byte khác (nhàm chán): (1 # .2 3 $: @ - ~]) `1: @. (3 &>) Hãy thử trực tuyến!
Galen Ivanov

23 byte nhờ ngn 1:-> #: Hãy thử trực tuyến!
Galen Ivanov

@GalenIvanov tyvm, đó là một mẹo hay.
Giô-na

2
1:-> 1. "
Bất

@ngn TIL ... ty lại!
Giô-na

5

Võng mạc , 47 42 byte

K`0¶1¶0
"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*
6,G`

Hãy thử trực tuyến! Xuất ra các nđiều khoản đầu tiên trên các dòng riêng biệt. Giải trình:

K`0¶1¶0

Thay thế đầu vào bằng các điều khoản cho -2, -10.

"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*

Tạo các nđiều khoản tiếp theo bằng cách sử dụng mối quan hệ lặp lại. *_ở đây là viết tắt của $&*_số chuyển đổi số (đầu tiên) trong trận đấu thành đơn vị, trong khi đó $1*là ngắn để $1*_chuyển đổi số giữa thành số đơn. Trả $.(về tổng thập phân của các đối số đơn nguyên của nó, tức là tổng của các số đầu tiên và số giữa.

6,G`

Hủy sáu ký tự đầu tiên, tức là ba dòng đầu tiên.


5

Khối , 20 byte

Đây là 0 được lập chỉ mục và xuất ra thuật ngữ thứ N

;@UOI010+p?/sqq;W.\(

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

Kết thúc tốt đẹp trên một khối lập phương với chiều dài 2

    ; @
    U O
I 0 1 0 + p ? /
s q q ; W . \ (
    . .
    . .

Xem nó chạy

  • I010 - Bắt đầu ngăn xếp
  • +p? - Thêm đỉnh ngăn xếp, kéo bộ đếm từ dưới cùng của ngăn xếp và kiểm tra
  • /;UO@ - Nếu bộ đếm là 0, phản chiếu lên mặt trên, loại bỏ Tosh, quay đầu, đầu ra và tạm dừng
  • \(sqq;W - Nếu bộ đếm là dương, phản xạ, bộ đếm giảm, hoán đổi ĐKDV, đẩy từ trên xuống dưới hai lần, loại bỏ ĐKDV và chuyển làn đường trở lại vào vòng lặp chính.


4

Perl 6 , 24 byte

{(1,1,1,*+*+!*...*)[$_]}

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

Một chuỗi được tạo khá chuẩn, với mỗi phần tử mới được tạo bởi biểu thức * + * + !*. Điều đó thêm phần tử trước thứ ba, phần tử thứ hai trước và phủ định logic của phần tử trước, luôn luôn Falselà số không.


Tại sao wiki cộng đồng này?
Jo King

@JoKing Đánh bại tôi. Nếu tôi làm điều đó bằng cách nào đó, nó không nhằm mục đích.
Sean

4

05AB1E , 8 byte

1Ð)λ£₂₃+

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

1Ð)1D)3Å1viết sai rồi£ , nó sẽ tạo ra một luồng vô hạn các điều khoản của chuỗi.

Làm sao?

1Ð)λ£₂₃+ | Full program.
1Ð)      | Initialize the stack with [1, 1, 1].
   λ     | Begin the recursive generation of a list: Starting from some base case,
         | this command generates an infinite list with the pattern function given.
    £    | Flag for λ. Instead of outputting an infinite stream, only print the first n.
     ₂₃+ | Add a(n-2) and a(n-3).

Tôi không nghĩ 1Ð)có thể là 2 byte tbh. Tôi có thể nghĩ về sáu lựa chọn thay thế 3 byte khác nhau , nhưng không có 2 byte.
Kevin Cruijssen

4

APL (Unicode Dyalog) , 20 18 17 byte SBCS

Mã này là 1 chỉ mục. Đó là cùng một số byte để có được ncác mục của chuỗi Padovan, vì bạn phải bỏ thêm vài thành viên cuối cùng. Đó cũng là cùng số byte để có được chỉ mục 0.

Chỉnh sửa: -2 byte nhờ ngn. -1 byte nhờ ngn

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

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

Giải trình

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

  ⍺(. . . .)⍣⎕⍵   This format simply takes the input ⎕ and applies the function
                   inside the brackets (...) to its operands (here marked ⍵ and ⍺).
  2(. . .+/)⍣⎕×⍳3  In this case, our ⍵, the left argument, is the array 1 1 1,
                   where we save our results as the function is repeatedly applied
                   and our ⍺, 2, is our right argument and is immediately applied to +/,
                   so that we have 2+/ which will return the pairwise sums of our array.
       2⌷          We take the second pairwise sum, f(n-2) + f(n-3)
    ⊢,⍨            And add it to the head of our array.
4⌷                 When we've finished adding Padovan numbers to the end of our list,
                   the n-th Padovan number (1-indexed) is the 4th member of that list,
                   and so, we implicitly return that.

4

K (ngn / k) , 24 20 byte

-4 byte nhờ ngn!

{$[x<3;1;+/o'x-2 3]}

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

0 chỉ mục, N điều khoản đầu tiên


1
f[x-2]+f[x-3]-> +/o'x-2 3( olà "tái diễn")
ngn

@ngn Cảm ơn! Tôi đã thử nó (không thành công) trong J; Ở đây thanh lịch.
Galen Ivanov

@ngn Trên thực tế đây là một khả năng của nó trong J: (1 # .2 3 $: @ - ~]) `1: @. (3 &>)
Galen Ivanov

ah, phải, giải mã cơ sở 1 là cách tổng hợp thân thiện với tàu hỏa :)
ngn

2
1:-> #trong giải pháp j
ngn

4

mã máy x86 32 bit, 17 byte

53 33 db f7 e3 43 83 c1 04 03 d8 93 92 e2 fa 5b c3

Tháo gỡ:

00CE1250 53                   push        ebx  
00CE1251 33 DB                xor         ebx,ebx  
00CE1253 F7 E3                mul         eax,ebx  
00CE1255 43                   inc         ebx  
00CE1256 83 C1 04             add         ecx,4  
00CE1259 03 D8                add         ebx,eax  
00CE125B 93                   xchg        eax,ebx  
00CE125C 92                   xchg        eax,edx  
00CE125D E2 FA                loop        myloop (0CE1259h)  
00CE125F 5B                   pop         ebx  
00CE1260 C3                   ret

Nó là 0 chỉ mục. Việc khởi tạo được thực hiện một cách thuận tiện bằng cách tính toán eax * 0. Kết quả 128 bit là 0 và nó đi theo edx: eax.

Ở đầu mỗi lần lặp, thứ tự của các thanh ghi là ebx, eax, edx. Tôi đã phải chọn đúng thứ tự để tận dụng mã hóa cho xchg eaxhướng dẫn - 1 byte.

Tôi đã phải thêm 4 vào bộ đếm vòng lặp để cho phép đầu ra đạt tới eax, giữ giá trị trả về của hàm trong fastcallquy ước.

Tôi có thể sử dụng một số quy ước gọi khác, không yêu cầu lưu và khôi phục ebx, nhưng fastcalldù sao cũng rất vui :)


2
Tôi thích xem câu trả lời mã máy trên PP & CG! +1
Tàu


3

Lua 5.3,49 48 byte

function f(n)return n<4 and 1or f(n-2)+f(n-3)end

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

Vanilla Lua không có sự ép buộc của booleans đối với chuỗi (thậm chí tonumber(true)trả về nil), vì vậy bạn phải sử dụng toán tử giả ba chiều. Phiên bản này được lập chỉ mục 1, giống như tất cả Lua. Phần 1ornày phải được đổi thành 1 orLua 5.1, có một cách khác để đánh số.



3

JavaScript (ES6), 23 byte

một(0)= =một(1)= =một(2)= =1 , như được chỉ định trong thử thách.

VIẾT SAI RỒI

f=n=>n<3||f(n-2)+f(n-3)

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


Tôi không nghĩ là hợp lý khi nói rằng trả lại truecũng giống như trả về 1nếu phần còn lại của đầu ra là số.
Nit


Tôi nghĩ rằng bạn đang thiếu một số yêu cầu: Hãy xem sửa đổi của tôi (phiên bản trong Java) ở đây .
Shaq

@Shaq Thử thách xác định rõ rằng ba thuật ngữ đầu tiên của chuỗi là tất cả 1 . Vì vậy, nó không phải là chuỗi được xác định trong A000931 (nhưng công thức là như nhau).
Arnauld

@Arnauld yep Tôi có thể nhìn thấy nó bây giờ. Lấy làm tiếc!
Shaq


2

TI-BASIC (TI-84), 34 byte

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1

VIẾT SAI RỒI

Đầu vào là trong Ans.
Đầu ra là trong Ansvà được tự động in ra.

Tôi đoán rằng đã có đủ thời gian trôi qua, cộng với nhiều câu trả lời đã được đăng, trong đó có nhiều câu trả lời ngoài câu trả lời này.

Thí dụ:

0
               0
prgmCDGFD
               1
9
               9
prgmCDGFD
               9
16
              16
prgmCDGFD
              65

Giải trình:

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1      ;full program (example input: 6)

[[0,1,0][0,0,1][1,1,0]]                     ;generate the following matrix:
                                            ; [0 1 0]
                                            ; [0 0 1]
                                            ; [1 1 0]
                       ^(Ans+5              ;then raise it to the power of: input + 5
                                            ; [4  7 5]
                                            ; [5  9 7]
                                            ; [7 12 9]
                               Ans(1,1      ;get the top-left index and leave it in "Ans"
                                            ;implicitly print Ans

2

Bình thường, 16 byte

L?<b3!b+y-b2y-b3

Điều này xác định chức năng y. Hãy thử nó ở đây!

Đây là một giải pháp thú vị hơn, mặc dù nó dài hơn 9 byte; byte có thể được cạo mặc dù.

+l{sa.pMf.Am&>d2%d2T./QY!

Điều này sử dụng định nghĩa được đưa ra bởi David Callan trên trang OEIS: "a (n) = số thành phần của n thành các phần lẻ và> = 3." Hãy thử nó ở đây! Nó nhận đầu vào trực tiếp thay vì xác định một chức năng.


y-b2y-b3có thể được tái cấu trúc bằng bifurcate hoặc L? Mặc dù khai báo một mảng gồm 2 phần tử là tốn kém. yL-Lb2,3dài hơn :(
Ven

@Ven Tôi đã có thể thay thế +y-b2y-b3bằng smy-bdhB2cùng một lượng byte; hB2kết quả trong mảng[2, 3]
RK.

Làm tốt lắm hB2. Quá tệ, đó là cùng một số byte.
Ven

Vâng, mặc dù tôi tự hỏi nếu có một số cách để thoát khỏi dbản đồ.
RK.

2

Java, 41 byte

Không thể sử dụng lambda (lỗi thời gian chạy). Cổng của câu trả lời Javascript này

int f(int n){return n<3?1:f(n-2)+f(n-3);}

TIO


Tôi nghĩ rằng bạn đang thiếu một số yêu cầu: Hãy xem sửa đổi của tôi ở đây .
Shaq

Vui lòng bỏ qua nhận xét của Shaq: câu trả lời của bạn là chính xác và là câu trả lời Java ngắn nhất có thể (kể từ Java 12).
Olivier Grégoire

Được rồi Tôi không chắc những gì tôi "bỏ lỡ" nhưng ok. Chỉnh sửa: nvm Tôi đọc câu trả lời JS.
Benjamin Urquhart






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.