噴水を数える


17

噴水は、各コインがその下の行の2枚のコインに接触、または下の行であり、下段が接続されるように行のコインの配置です。これが21コイン噴水です。

http://mathworld.wolfram.com/Fountain.htmlから


あなたの課題は、指定された数のコインでいくつの噴水が作れるかを数えることです。

入力として正の整数が与えられます nn存在するさまざまなコインファウンテンの数を出力する必要があります。

標準I / Oルール、標準の抜け穴は禁止されています。ソリューションはn = 101分以内に計算できる必要があります。


望ましい出力n = 1 ... 10

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

このシーケンスはOEIS A005169です。


これはコードゴルフです。最少バイトが勝ちます。


そこにあるnプログラムは動作が保証されなければならないためには?(すなわち、それが壊れる可能性がある後)
quintopia

@quintopiaこれはn、データ型、ハードウェアなどの制限まで、すべてに対して機能するはずです。
isaacg

回答:


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)しますが、1代わりに設定する必要がありますor 1(これで十分+0**nです)。


Pythの17バイト:M|sgL-Gd<ShHG1gQ0
isaacg

5

Mathematica、59バイト

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

Jean-FrançoisAlcoverによるOEISのMathematicaプログラムに基づいています。


これを式として書き直せますか(私が見つけた式と比較したいだけです)?私はちょうどMathematicaを読み取ることはできません=)
flawr

@flawrシーケンスの生成関数は1/(1-x/(1-x^2/(1-x^3/(1-x^4/(1-x^5/(...))))))です。
alephalpha

あなたは、このような強力なCAS =)がある場合は確かに素敵なアプローチでの説明、してくれてありがとう
flawr

3

Haskell、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の基礎を学び始めたばかりです。#そして、$ここでの使用方法について最初に学ぶ必要があります=)
flawr

説明の少し: #ちょうどようなユーザ定義中置関数である+*インフィックス機能を事前に定義されている、など。$優先順位を調整する別の方法(括弧以外)f (g (h x))-> f$g$h xまたはこの場合sum(map(...)[...])-> sum$map(...)[...]
nimi

ありがとう、それは知っておくととても便利です、あなたの説明に感謝します!
flawr

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.