Q, 47 byte
m:{*/1_-':|(0<){y-x x bin y}[*+60(|+\)\1 0]\x}
Kiểm tra
+(i;m'i:1 2 3 4 5 6 7 8 9 42 1000 12345)
đọc nó dưới dạng cặp (i, map (m, i)), trong đó m là hàm tính toán và i là các đối số khác nhau
viết
1 1
2 2
3 3
4 3
5 5
6 5
7 10
8 8
9 8
42 272
1000 12831
12345 138481852236
Giải trình
n funtion\arg
áp dụng hàm (hàm (hàm (... hàm (args))) n lần (bên trong sử dụng đệ quy Tal) và trả về chuỗi kết quả. Chúng tôi tính 60 mục đầu tiên của chuỗi fibonnaci là *+60(|+\)\1 0
. Trong trường hợp đó, hàm là ( | +): + \ được áp dụng trên một chuỗi tính toán một phần tổng (ex + \ 1 2 3 là 1 3 6) và | đảo ngược seq. Vì vậy, mỗi 'lần lặp' chúng tôi tính tổng một phần của hai số trước đó các khoản tiền được đảo ngược. 60(|+\)\1 0
tạo ra các chuỗi 1 0, 1 1, 2 1, 3 2, 5 3, 8 5, 13 8, 21 13, ...*+
áp dụng cho kết quả này lật (traspose) nó và lấy đầu tiên. Kết quả là chuỗi 1 1 2 3 5 8 13 21 34 55 ..
(cond)function\args
áp dụng hàm (hàm (.. hàm (args))) trong khi cond true và trả về chuỗi kết quả một phần
function[arg]
được áp dụng trên một hàm có nhiều hơn một đối số sẽ tạo ra một phép chiếu (ứng dụng một phần)
Chúng ta có thể đặt tên cho các đối số, nhưng các tên ẩn là x, y, z
{y-x x bin y}[*+60(|+\)\1 0]
khai báo một lambda với args x, y với phép chiếu một phần (arg x là chuỗi sê-ri, tính toán là * + 60 (| +) \ 1 0). x đại diện cho các giá trị của Wikipedia và y là số cần xử lý. Tìm kiếm nhị phân (bin) được sử dụng để xác định chỉ mục của số lượng lớn hơn <= y ( x bin y
) và trừ giá trị tương ứng của x.
Để tính toán sản phẩm từ việc bán lại một phần, chúng tôi đảo ngược chúng và tính toán sự khác biệt của từng cặp ( -':|
), bỏ số đầu tiên ( 1_
vì là 0) và nhân với ( */
).
Nếu chúng ta quan tâm đến tổng tích lũy, mã là như nhau, nhưng với +/
thay vì */
. Chúng tôi cũng có thể sử dụng bất kỳ toán tử diadic nào khác thay vì + hoặc *
Về hiệu quả thực hiện
Tôi biết rằng trong cuộc thi này hiệu quả không phải là một vấn đề. Nhưng trong vấn đề này, chúng ta có thể dao động từ chi phí lineal đến chi phí theo cấp số nhân, vì vậy tôi tò mò về nó.
Tôi đã phát triển một phiên bản thứ hai (chiều dài 48 Byte không bao gồm nhận xét) và lặp lại các trường hợp thử nghiệm pin 1000 lần trên cả hai phiên bản.
f:*+60(|+\)\1 0;m:{*/1_-':|(0<){x-f f bin x}\x} /new version
thời gian thực hiện là: phiên bản gốc 0'212 seg, phiên bản mới 0'037 seg
Phiên bản gốc tính toán fftimeaci serie một lần cho mỗi ứng dụng chức năng; phiên bản mới tính toán MySpace chỉ một.
Trong cả hai trường hợp, tính toán sê-ri sử dụng đệ quy đuôi
2
có thể được phân tách là-1 + 3
. Phát biểu chính xác của định lý của Zeckendorf là số Fibonacci dương có thể được phân tách duy nhất dưới dạng tổng của các số Fibonacci không liên tiếp có chỉ số dương.