数喷泉


17

喷泉位于行硬币的布置,使得各硬币触摸两个硬币行中在它下面,或者是底行中,并且底部的行连接。这是一个21硬币喷泉:

来自http://mathworld.wolfram.com/Fountain.html


您的挑战是计算给定数量的硬币可以制造多少个不同的喷泉。

您将得到一个正整数作为输入 n。您必须输出n存在的不同-coin喷泉的数量。

标准I / O规则,禁止标准漏洞。解决方案应该能够n = 10在一分钟内计算出来。


所需的输出n = 1 ... 10

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

该序列为OEIS A005169


这是代码高尔夫。最少的字节数获胜。


是否n必须保证该程序能够正常运行?(即之后可能会崩溃)
quintopia 2015年

@quintopia它应该工作的所有n,最多的数据类型,硬件等的限制
isaacg

Answers:


3

Python,57个字节

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

如在OEIS上观察到的,如果将每行相对于其下一行移动半步,则列大小将形成一个正整数序列,最大上移步长为1。

该函数f(n,i)对具有sum n和last number 的序列进行计数i。这些可以递归概括用于从下一列大小的每个的选择1i+1,这是range(1,i+2)。截断为range(1,i+2)[:n]防止列使用比保持更多的硬币,避免了需要说的负面n的给予0。而且,它避免了显式的基本情况,因为空和是0递归的,也不是递归的,但是f(0)需要将其设置1or 1足够(如+0**n)。


Pyth中的17个字节:M|sgL-Gd<ShHG1gQ0
isaacg 2015年

5

Mathematica,59个字节

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

基于Jean-FrançoisAlcover的OEIS的Mathematica程序。


您可以将其重写为公式吗(我只想与找到的公式进行比较)?我只是看不懂Mathematica =)
瑕疵的,

@flawr序列的生成函数为1/(1-x/(1-x^2/(1-x^3/(1-x^4/(1-x^5/(...))))))
alephalpha

感谢您的解释,如果您拥有如此强大的CAS =),那的确是一个不错的方法
更加糟糕的

3

哈斯克尔, 60 48字节

感谢@nimi提供了更短的解决方案!

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

旧版本。

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

计算该值的函数是s,可在此处找到递归公式的实现:https : //oeis.org/A005169


一个错误:递归调用为t (n-p) q。高尔夫技巧:使用中缀运算符t,交换后卫并使用map而不是列表理解:n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1s成为s=(#1),但您根本不必给主函数起一个名字,这样(#1)就足够了。48个字节
nimi

非常感谢您的提示!我刚刚开始学习Haskell的基础知识。我将必须学习有关如何使用,#以及$first =)的用法
瑕疵的

的解释一点点: #是用户定义的缀功能,正如+*等是预定义的中缀的功能。$是调整优先级(除括号外)f (g (h x))-> f$g$h x或在我们的情况下sum(map(...)[...])->的另一种方法sum$map(...)[...]
nimi

谢谢,知道这很有用,感谢您的解释!
瑕疵的

3

Haskell,43个字节

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

请参阅Python答案以获取解释。

长度相同,min而不是take

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


1

Matlab,115 105字节

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

在此处找到递归公式的实现: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

朱莉娅,44 43字节

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

这在OEIS上使用递归公式。

说明

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

有没有其他人注意到击打44是常规的44?


0

Python 3,88个字节

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

在OEIS页面上实现递归公式

F=(n,p=1,t=0,q=0)=>p<n?eval("for(;q++<=p;)t+=F(n-p,q)"):p>n?0:1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.