Đơn hàng mới số 5: nơi Fibonacci và Beatty gặp nhau tại Wythoff


16

Giới thiệu (có thể bỏ qua)

Đặt tất cả các số dương theo thứ tự thông thường của nó (1, 2, 3, ...) là một chút nhàm chán, phải không? Vì vậy, đây là một loạt các thách thức xung quanh hoán vị (chia sẻ lại) của tất cả các số dương. Đây là thử thách thứ năm trong loạt bài này (liên kết đến thử thách thứ nhất , thứ hai , thứ bathứ tư ).

Trong thử thách này, chúng ta sẽ gặp mảng Wythoff, đó là một trận tuyết lở đan xen giữa các chuỗi Fibonacci và chuỗi Beatty!

Các số Fibonacci có lẽ là dành cho hầu hết các bạn một chuỗi được biết đến. Với hai con số bắt đầu và , sau được xác định bởi: cho .F0F1FnFn= =F(n-1)+F(n-2)n>2

Chuỗi Beatty , được đưa ra một tham số là: cho . Một trong những thuộc tính của chuỗi Beatty là với mỗi tham số , có chính xác một tham số , sao cho các chuỗi Beatty cho các tham số đó không khớp nhau và được nối với nhau, chúng bao gồm tất cả các số tự nhiên loại trừ 0 (ví dụ: ).rBnr= =rnn1rS= =r/(r-1)B rB r / ( r - 1 ) = N{ 0 }BrBr/(r-1)= =N{0}

Bây giờ đến phần tâm trí: bạn có thể tạo một mảng, trong đó mỗi hàng là một chuỗi Fibonacci mỗi cột là một chuỗi Beatty. Mảng này là mảng Wythoff . Phần tốt nhất là: mỗi số dương xuất hiện chính xác một lần trong mảng này! Mảng trông như thế này:

   1    2    3    5    8   13   21   34   55   89  144 ...
   4    7   11   18   29   47   76  123  199  322  521 ...
   6   10   16   26   42   68  110  178  288  466  754 ...
   9   15   24   39   63  102  165  267  432  699 1131 ...
  12   20   32   52   84  136  220  356  576  932 1508 ...
  14   23   37   60   97  157  254  411  665 1076 1741 ...
  17   28   45   73  118  191  309  500  809 1309 2118 ...
  19   31   50   81  131  212  343  555  898 1453 2351 ...
  22   36   58   94  152  246  398  644 1042 1686 2728 ...
  25   41   66  107  173  280  453  733 1186 1919 3105 ...
  27   44   71  115  186  301  487  788 1275 2063 3338 ...
  ...

Một phần tử ở hàng và cột được định nghĩa là:mn

Mộtm,n= ={mφφ nếu n= =1mφφ2 nếu n= =2Mộtm,n-2+Mộtm,n-1 nếu n>2

trong đó là tỷ lệ vàng: .φφ= =1+52

Nếu chúng ta tuân theo các đường chéo của mảng này, chúng ta sẽ nhận được A035513 , đây là chuỗi mục tiêu cho thử thách này (lưu ý rằng chuỗi này được chính Neil Sloane thêm vào OEIS !). Vì đây là một thử thách "chuỗi thuần", nên nhiệm vụ là xuất cho cho trước làm đầu vào, trong đó là A035513 .một(n)nmột(n)

Có nhiều chiến lược khác nhau mà bạn có thể làm theo để đi đến , điều này làm cho thử thách này (theo tôi) thực sự thú vị.một(n)

Bài tập

Cho một đầu vào số nguyên , đầu ra ở định dạng số nguyên, trong đó là A035513 .nmột(n)một(n)

Lưu ý: lập chỉ mục dựa trên 1 được giả định ở đây; bạn có thể sử dụng lập chỉ mục dựa trên 0, vì vậy , v.v. Hãy đề cập đến điều này trong câu trả lời của bạn nếu bạn chọn sử dụng nó.một(0)= =1;một(1)= =2

Các trường hợp thử nghiệm

Input | Output
---------------
1     |  1
5     |  7
20    |  20
50    |  136
78    |  30
123   |  3194
1234  |  8212236486
3000  |  814
9999  |  108240
29890 |  637

Có thể rất vui khi biết rằng lớn nhất cho làmột(n)1n32767một(32642)= =512653048485188394162163283930413917147479973138989971= =F(256)2φ+F(255).

Quy tắc

  • Đầu vào và đầu ra là số nguyên
  • Chương trình của bạn ít nhất phải hỗ trợ đầu vào trong phạm vi từ 1 đến 32767). Lưu ý rằng có tới 30 chữ số trong phạm vi này ...một(n)
  • Đầu vào không hợp lệ (0, số float, chuỗi, giá trị âm, v.v.) có thể dẫn đến đầu ra không dự đoán được, lỗi hoặc (không) hành vi được xác định.
  • Mặc định I / O quy tắc áp dụng.
  • Lỗ hổng mặc định bị cấm.
  • Đây là , vì vậy câu trả lời ngắn nhất tính bằng byte sẽ thắng

2
Vậy tham khảo Đơn hàng mới ở đây là gì?
Luis Mendo

2
@LuisMendo: các trận tuyết lở của chuỗi Fibonacci và Beatty, hình thành nên các mảng Wythoff ...
agtoever

Ah, tôi hoàn toàn bỏ lỡ điều đó! Bây giờ tôi cảm thấy hối tiếc ...
Luis Mendo

1
Là một đại diện điểm nổi của phi (hoặc rt (5)) và áp dụng tái phát sẽ đáp ứng yêu cầu phạm vi?
Jonathan Allan

1
Vui lòng sửa trường hợp thử nghiệm thứ 9: 999không phải9999
J42161217

Câu trả lời:


4

Thạch , 27 24 byte

p`SÞ⁸ịð’;רpḞ¥×⁹r‘ÆḞ¤Sð/

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

Liên kết đơn âm sử dụng lập chỉ mục 1 dựa trên. Cảm ơn @JonathanAllan về cách tốt hơn để lấy hàng và cột từ nvà lưu 3 byte. Ở dạng ngắn nhất, nó quá chậm đối với n lớn hơn trên TIO, vì vậy, hãy thử trực tuyến sau đây ! giảm kích thước của danh sách hàng và cột ban đầu với chi phí là ba byte.

Giải trình

p`                       | Cartesian product of the range from 1..input with itself   
  SÞ                     | Sort by sum
    ⁸ị                   | Find the tuple at the position indicated by the input - this is the row and column
      ð               ð/ | Start a new dyadic chain using the row as the left and column as the right argument
       ’                 | Increase the row by 1
        ;    ¥           | Concatenate to:
         רp             |   row × φ
            Ḟ            |   rounded down
              ×     ¤    | Multiply this pair by
                  ÆḞ     |   the Fibonacci numbers at positions
               ⁹         |   column index and
                r‘       |   column index plus one
                     S   | sum

Lưu ý điều này dựa trên mô tả mã Python trên trang OEIS.


1
...×⁹r‘ÆḞ¤Sð/lưu một trong phiên bản hợp nhất của bạn ( TIO )
Jonathan Allan

6

R , 143 130 124 123 byte

function(n){k=0:n+1
`~`=rbind
m=k-1~(k*(1+5^.5)/2)%/%1
for(i in k)m=m~m[i,]+m[i+1,]
m=m[-1:-2,]
m[order(row(m)+col(m))][n]}

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

T(n,-1)= =n-1;T(n,0)= =nφ;T(n,k)= =T(n,k-1)+T(n,k-2)splitskchỉ tồn tại để ngăn chặn việc drop=Ftranh luận trong m[-1:-2,]vụ án n=1.

Cảm ơn Neil vì đã chỉ ra một gôn 1 byte.

R , 150 138 132 byte

function(n){T[2]=1
for(j in 2:n-1)T=c(T,T[j]+T[j+1])
m=T[-1]%o%((1:n*(.5+5^.5/2))%/%1)+T[-1-n]%o%(1:n-1)
m[order(row(m)+col(m))][n]}

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

T(n,k)= =FTôib(k+1)nφ+FTôib(k)(n-1)splitsnth

Cảm ơn Robin Ryder về T[2]=1thủ thuật tạo chuỗi Fibonacci.


Cả hai giải pháp đều không hiệu quả cao, tạo ra một nxnma trận (rất có thể) double, vì R thúc đẩy integer(ký 32 bit) doubletự động khi tràn, nhưng giải pháp thứ hai sẽ nhanh hơn khá nhiều. Lấy nlàm bignum sẽ hoạt động tự động, sử dụng cuộc gọi gmp::as.bigz(n), nên mất độ chính xác theo doubles là đáng lo ngại, và sau đó ngôn ngữ sẽ được R + gmp.


Bạn có thể sử dụng (1+5^.5)/2thay vì (.5+5^.5/2)?
Neil

@ Không ... vâng, tôi có thể. Cảm ơn bạn! Chỉ chỉnh sửa nó thành cái đầu trừ khi tôi có thể tìm cách đánh golf xuống cái thứ hai khá nhiều.
Giuseppe


2

Thạch , 30 byte

p`SÞ⁸ịð;Øp,²;\¤×Ḟ¥/;+ƝQƊ⁹¡ị@ð/

Hãy thử trực tuyến!
Điều này hơi chậm, nhưng một cải tiến lớn được thực hiện với tiền tốḤ½Ċ(gấp đôi, căn bậc hai, trần) như trong bộ thử nghiệm này .


2
bạn đúng rồi! 740496902là kết quả cho999
J42161217

Kết hợp phần đầu tiên của bạn và phần thứ hai của tôi cho 25 byte . Không chắc chắn ai trong chúng ta nên có phiên bản kết hợp!
Nick Kennedy

@NickKennedy - tốt đẹp, đi cho nó!
Jonathan Allan

2

Than , 54 byte

Nθ≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι⊞υθF⁺²⁻θη⊞υΣ…⮌υ²I⊟υ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉ số 0. Chỉ sử dụng số học số nguyên nên hoạt động cho các giá trị lớn tùy ý. Giải trình:

Nθ

Đầu vào q.

≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»

Tính toán đường chéo bằng cách trừ đi số lượng ngày càng tăng từ qđó, kết thúc bằng số hàng đích m.

⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι

Tính toán các m+1điều khoản đầu tiên của A019446 , mặc dù chúng tôi chỉ quan tâm đến điều mthứ.

⊞υθF⁺²⁻θη⊞υΣ…⮌υ²

Tính toán các n+4điều khoản đầu tiên của chuỗi Fibonacci tổng quát bắt đầu bằng [a(m), m]. Các điều khoản của chuỗi này là các mđiều khoản của A019446 , A001477 , A000201 , A003622 , A035336 ; hai cột cuối cùng này là hai cột đầu tiên của mảng Wythoff, và vì vậy chuỗi này tiếp tục với phần còn lại của mhàng thứ ba của mảng.

I⊟υ

Xuất ra thuật ngữ mong muốn.

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.