Đài phun nước đếm


17

Một đài phun nước là sự sắp xếp các đồng xu theo hàng sao cho mỗi đồng xu chạm vào hai đồng tiền ở hàng bên dưới nó hoặc ở hàng dưới cùng và hàng dưới cùng được kết nối. Đây là một đài phun nước 21 xu:

Từ http://mathworld.wolfram.com/Fenez.html


Thử thách của bạn là đếm xem có bao nhiêu đài phun nước khác nhau có thể được tạo ra với một số lượng tiền nhất định.

Bạn sẽ được cung cấp như là một số nguyên dương n. Bạn phải xuất số lượng nvòi -coin khác nhau tồn tại.

Quy tắc I / O tiêu chuẩn, sơ hở tiêu chuẩn bị cấm. Các giải pháp sẽ có thể tính toán n = 10trong vòng một phút.


Đầu ra mong muốn cho n = 1 ... 10:

1, 1, 2, 3, 5, 9, 15, 26, 45, 78

Trình tự này là OEIS A005169 .


Đây là mã golf. Ít byte nhất sẽ thắng.


Có một nchương trình mà phải được đảm bảo để làm việc? (tức là sau đó nó có thể bị vỡ)
quintopia

@quintopia Nó nên hoạt động cho tất cả n, cho đến giới hạn của kiểu dữ liệu, phần cứng, v.v.
isaacg

Câu trả lời:


3

Python, 57 byte

f=lambda n,i=0:sum(f(n-j,j)for j in range(1,i+2)[:n])or 1

Theo quan sát trên OEIS , nếu bạn dịch chuyển mỗi hàng nửa bước so với hàng bên dưới nó, kích thước cột tạo thành một chuỗi các số nguyên dương với bước tăng tối đa là 1.

Hàm f(n,i)đếm các chuỗi với tổng nvà số cuối i. Đây có thể được đệ quy tóm tắt cho mỗi lựa chọn kích thước cột tiếp theo từ 1đến i+1, đó là range(1,i+2). Cắt xén để range(1,i+2)[:n]cột ngăn chặn từ việc sử dụng đồng tiền hơn vẫn còn, tránh cần phải nói rằng tiêu cực n'hãy cho 0. Hơn nữa, nó tránh một trường hợp cơ sở rõ ràng, vì tổng trống là 0và không tái diễn, nhưng f(0)cần phải được đặt thành 1thay vào đó, theo đó là or 1đủ (như vậy +0**n).


17 byte trong Pyth:M|sgL-Gd<ShHG1gQ0
isaacg

5

Toán học, 59 byte

SeriesCoefficient[1-Fold[1-x^#2/#&,Range[#,0,-1]],{x,0,#}]&

Dựa trên chương trình Mathicala trên OEIS của Jean-François Alcover.


Bạn có thể viết lại đây là một công thức (tôi chỉ muốn so sánh với công thức tôi tìm thấy)? Tôi chỉ không thể đọc
Mathicala

@flawr Hàm tạo của chuỗi là 1/(1-x/(1-x^2/(1-x^3/(1-x^4/(1-x^5/(...)))))).
alephalpha

Cảm ơn lời giải thích, đó thực sự là một cách tiếp cận tốt nếu bạn có một CAS mạnh mẽ như vậy =)
flawr

3

Haskell, 60 48 byte

Cảm ơn @nimi đã cung cấp giải pháp ngắn hơn!

n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1
(#1)

Phiên bản cũ.

t n p|p>n=0|p==n=1|p<n=sum[t (n-q) q|q<-[1..p+1]]
s n=t n 1

Hàm tính giá trị là s, thực hiện công thức đệ quy được tìm thấy ở đây: https://oeis.org/A005169


Một lỗi: cuộc gọi đệ quy là t (n-p) q. Mẹo chơi gôn: sử dụng toán tử infix cho t, hoán đổi các vệ sĩ và sử dụng mapthay cho việc hiểu danh sách : n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1. strở thành s=(#1), nhưng bạn không cần phải đặt tên chính cho tất cả, vậy (#1)là đủ. 48 byte.
nimi

Cảm ơn bạn rất nhiều cho các gợi ý! Tôi mới bắt đầu học những điều cơ bản của Haskell. Tôi sẽ phải tìm hiểu về cách sử dụng #$ở đây trước =)
flawr

Một chút giải thích: #là một người dùng được xác định chức năng ghi vào giống như +, *vv được định nghĩa trước chức năng ghi vào. $là một cách khác để điều chỉnh mức độ ưu tiên (bên cạnh dấu ngoặc đơn) f (g (h x))-> f$g$h xhoặc trong trường hợp của chúng tôi sum(map(...)[...])-> sum$map(...)[...].
nimi

Cảm ơn bạn, đó là khá hữu ích để biết, tôi đánh giá cao lời giải thích của bạn!
flawr

3

Haskell, 43 byte

n%i=sum[(n-j)%j|j<-take n[1..i+1]]+0^n
(%0)

Xem câu trả lời của Python để được giải thích.

Cùng chiều dài với minchứ không phải take:

n%i=sum[(n-j)%j|j<-[1..min(i+1)n]]+0^n
(%0)


1

Matlab, 115 105 byte

function F=t(n,varargin);p=1;if nargin>1;p=varargin{1};end;F=p==n;if p<n;for q=1:p+1;F=F+t(n-p,q);end;end

Thực hiện công thức đệ quy được tìm thấy ở đây: https://oeis.org/A005169

function F=t(n,varargin);
p=1;
if nargin>1
    p=varargin{1};
end;
F=p==n;
if p<n;
    for q=1:p+1;
        F=F+t(n-p,q);
    end;
end;

1

Julia, 44 43 byte

f(a,b=1)=a>b?sum(i->f(a-b,i),1:b+1):1(a==b)

Điều này sử dụng công thức đệ quy trên OEIS.

Giải trình

function f(a, b=1)
    if a > b
        # Sum of recursing
        sum(i -> f(a-b, i), 1:b+1)
    else
        # Convert bool to integer
        1 * (a == b)
    end
end

Có ai khác nhận thấy rằng đình công qua 44 là 44 thường xuyên không ??


0

Python 3, 88 byte

f=lambda n,p:sum([f(n-p,q)for q in range(1,p+2)])if p<n else int(p==n)
t=lambda n:f(n,1)

0

JavaScript (ES6), 63

Thực hiện công thức đệ quy tại trang OEIS

F=(n,p=1,t=0,q=0)=>p<n?eval("for(;q++<=p;)t+=F(n-p,q)"):p>n?0:1
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.