Çeşmeler Sayma


17

Bir çeşme , madeni paraların sıra halinde düzenlenmesidir, böylece her bir madeni para, altındaki satırda iki jetonla temas eder veya alt satırdadır ve alt satır bağlanır. İşte 21 jeton çeşmesi:

Http://mathworld.wolfram.com/Fountain.html


Zorluk, belirli sayıda jetonla kaç farklı çeşmenin yapılabileceğini saymaktır.

Girdi olarak pozitif bir tam sayı verilecektir n . Var olan farklı nsikkeler çeşmelerinin sayısını çıkarmalısınız.

Standart I / O kuralları, standart boşluklar yasaklandı. Çözeltiler n = 10bir dakikadan kısa sürede hesaplayabilmelidir .


İstenilen çıktı n = 1 ... 10:

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

Bu dizi OEIS A005169'dur .


Bu kod golf. En az bayt kazanır.


nProgramın çalışacağının garanti edilmesi gereken bir program var mı ? (yani kırılabilir)
quintopia

@quintopia Veri tipi n, donanım vb. sınırlamalara kadar herkes için çalışmalıdır
isaacg

Yanıtlar:


3

Python, 57 bayt

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

OEIS'te gözlemlendiği gibi , her satırı altındaki satıra göre yarım adım kaydırırsanız, sütun boyutları maksimum 1 yukarı adımla bir pozitif tamsayı dizisi oluşturur.

İşlev f(n,i), dizileri toplam nve son sayı ile sayar i. Bu yinelemeli bir sonraki sütun boyutu her seçim için özetlenebilir 1için i+1olan, range(1,i+2). Kesilecektir range(1,i+2)[:n]bu negatif söylemek gerek kaçınarak kalması daha fazla para kullanarak önler sütun nsitesindeki vermek 0. Dahası, boş meblağ 0yinelendiği ve geri çekilmediği, ancak bunun yerine yeterli f(0)olması gerektiği gibi ayarlanması gerektiği için açık bir temel durumdan kaçınır .1or 1+0**n


Pyth içinde 17 bayt:M|sgL-Gd<ShHG1gQ0
isaacg

5

Mathematica, 59 bayt

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

Jean-François Alcover'in OEIS üzerindeki Mathematica programına dayanmaktadır.


Bunu bir formül olarak yeniden yazabilir misiniz (sadece bulduğum formülle karşılaştırmak istiyorum)? Mathematica =) okuyamıyorum
flawr

@flawr Dizinin oluşturma işlevi 1/(1-x/(1-x^2/(1-x^3/(1-x^4/(1-x^5/(...)))))).
alephalpha

Açıklama için teşekkürler, bu kadar güçlü bir CAS varsa gerçekten güzel bir yaklaşımdır =)
flawr

3

Haskell, 60 48 bayt

@Nimi'ye çok daha kısa bir çözüm sağladığı için teşekkürler!

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

Eski versiyon.

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

Değeri hesaplayan fonksiyon s, burada bulunan özyinelemeli formülün uygulanmasıdır: https://oeis.org/A005169


Bir hata: özyinelemeli çağrı t (n-p) q. İpuçları Golf: bir infix operatörünü kullanmak t, korumaları takas ve kullanımı mapliste anlama yerine: n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1. solur s=(#1), ancak ana işleve hiç bir ad vermek zorunda değilsiniz, bu yüzden (#1)yeterlidir. 48 bayt.
nimi

İpuçları için çok teşekkürler! Haskell'in temellerini öğrenmeye başladım. Ben kullanımı #ve $burada ilk =)
flawr

Açıklama Biraz: #tıpkı bir kullanıcı tanımlı infix fonksiyonudur +, *infix fonksiyonları önceden tanımlanmış vb. $önceliği ayarlamanın başka bir yoludur (parantez dışında) f (g (h x))-> f$g$h xveya bizim durumumuzda sum(map(...)[...])-> sum$map(...)[...].
nimi

Teşekkür ederim, bunu bilmek oldukça faydalı, açıklamanızı takdir ediyorum!
flawr

3

Haskell, 43 bayt

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

Açıklama için Python cevabına bakınız .

İle aynı uzunlukta minziyade take:

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


1

Matlab, 115105 bayt

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

Burada bulunan özyinelemeli formülün uygulanması: 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 bayt

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

Bu OEIS üzerinde özyinelemeli formül kullanır.

açıklama

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

Herkes 44 ile grev 44 olduğunu fark etti ??


0

Python 3, 88 bayt

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

Özyinelemeli formülü OEIS sayfasında uygulama

F=(n,p=1,t=0,q=0)=>p<n?eval("for(;q++<=p;)t+=F(n-p,q)"):p>n?0:1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.