การนับน้ำพุ


17

น้ำพุคือการจัดเรียงของเหรียญในแถวเพื่อให้แต่ละเหรียญสัมผัสสองเหรียญในแถวด้านล่างหรืออยู่ในแถวด้านล่างและแถวล่างมีการเชื่อมต่อ นี่คือน้ำพุ 21 เหรียญ:

จาก http://mathworld.wolfram.com/Fountain.html


ความท้าทายของคุณคือการนับจำนวนน้ำพุที่แตกต่างกันด้วยจำนวนเหรียญที่กำหนด

คุณจะได้รับเป็น input nเป็นจำนวนเต็มบวก คุณต้องส่งออกจำนวนnน้ำพุที่แตกต่างกันที่มีอยู่

กฎ I / O มาตรฐานห้ามช่องโหว่มาตรฐาน คำตอบควรจะสามารถคำนวณได้n = 10ภายในไม่กี่นาที


ผลลัพธ์ที่ต้องการสำหรับ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)นับลำดับที่มีผลรวมและจำนวนที่ผ่านมาn iเหล่านี้สามารถสรุปซ้ำสำหรับแต่ละทางเลือกของขนาดคอลัมน์ถัดไปจาก1ไปซึ่งเป็นi+1 range(1,i+2)ตัดทอนเพื่อrange(1,i+2)[:n]คอลัมน์ป้องกันจากการใช้เหรียญมากขึ้นกว่ายังคงหลีกเลี่ยงการต้องไปพูดเชิงลบที่n's 0ให้ ยิ่งไปกว่านั้นมันหลีกเลี่ยงกรณีพื้นฐานที่ชัดเจนเนื่องจากผลรวมที่ว่างเปล่าคือ0และไม่ได้รับการชดเชย แต่f(0)จำเป็นต้องตั้งค่าเป็น1แทนซึ่งor 1พอเพียง (เช่นนั้น+0**n)


17 bytes ในM|sgL-Gd<ShHG1gQ0
Pyth

5

Mathematica, 59 ไบต์

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

อ้างอิงจากโปรแกรม Mathematica บน OEIS โดย Jean-François Alcover


คุณสามารถเขียนสิ่งนี้เป็นสูตร (ฉันแค่ต้องการเปรียบเทียบกับสูตรที่ฉันพบ) ฉันไม่สามารถอ่าน Mathematica =)
ข้อบกพร่อง

@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


ข้อผิดพลาด: โทร recursive t (n-p) qคือ มีสนามเล่นกอล์ฟเคล็ดลับ: ใช้ประกอบการมัดสำหรับtสลับยามและใช้แทนความเข้าใจรายการ:map กลายเป็นแต่คุณไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นหลักเลยก็เพียงพอแล้ว 48 ไบต์ n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1ss=(#1)(#1)
nimi

ขอบคุณมากสำหรับคำแนะนำ! ฉันเพิ่งเริ่มเรียนรู้พื้นฐานของ Haskell ฉันจะต้องเรียนรู้เกี่ยวกับวิธีการใช้งาน#และ$ที่นี่ก่อน =)
ข้อบกพร่อง

นิด ๆ หน่อย ๆ ของคำอธิบาย: #เป็นฟังก์ชั่นที่ผู้ใช้กำหนดมัดเหมือน+, *ฯลฯ จะถูกกำหนดไว้ล่วงหน้าฟังก์ชั่นมัด $เป็นอีกวิธีหนึ่งในการปรับความสำคัญ (นอกเหนือจากวงเล็บ) f (g (h x))-> f$g$h xหรือในกรณีของเรา->sum(map(...)[...]) sum$map(...)[...]
nimi

ขอบคุณที่ค่อนข้างมีประโยชน์ที่จะรู้ฉันขอขอบคุณคำอธิบายของคุณ!
ข้อบกพร่อง



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

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.