Golfscript - 56 50 49 48 41 40 38 37 ตัวอักษร
n%{~),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;}/
หมายเหตุ: สิ่งนี้จะจัดการกับอินพุตหลายบรรทัดรวดเร็ว (1/8 วินาทีในการทำเคสทดสอบ) และไม่ผิดเพี้ยนสำหรับอินพุตทางกฎหมายใด ๆ
(เวอร์ชันแรกเป็นโปรแกรม Golfscript แรกของฉันด้วยขอขอบคุณ eBusiness สำหรับการชี้ให้เห็นถึงเทคนิคต่าง ๆ ที่ฉันพลาดไป)
ในการทำให้โพสต์เพื่อการศึกษามีประโยชน์ด้วยนี่คือคำอธิบายวิธีการใช้งาน f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
เราเริ่มต้นด้วยการเกิดซ้ำ สิ่งนี้สามารถเข้าใจได้ด้วยการใช้ combinatorically โดยกล่าวว่าการวางn
ลูกที่แตกต่างในk
ถังที่แยกได้ซึ่งแต่ละถังมีลูกอย่างน้อยหนึ่งลูกคุณจะเลือกหนึ่งในk
ถังสำหรับลูกแรก ( k *
) จากนั้นจะมีอย่างน้อยอีกหนึ่งลูก ( f(n-1, k)
) มิฉะนั้นจะไม่ ( f(n-1, k-1)
)
ค่าที่เป็นผลมาจากกริดนี้ ทำn
หน้าที่เป็นดัชนีแถวและk
เป็นดัชนีคอลัมน์และการทำดัชนีทั้งจาก 0 มันเริ่มต้น
1 0 0 0 0 0 0 ...
0 1 0 0 0 0 0 ...
0 1 2 0 0 0 0 ...
0 1 6 6 0 0 0 ...
0 1 14 36 24 0 0 ...
0 1 30 150 240 120 0 ...
0 1 62 540 1560 1800 720 ...
. . . . . . . .
. . . . . . . .
. . . . . . . .
ดังนั้นหันไปหาโปรแกรม
n%{~ <<STUFF>> }/
แยกอินพุตเป็นบรรทัดจากนั้นสำหรับแต่ละบรรทัดจะประเมินวางn
และk
บนสแต็กจากนั้นเรียก<<STUFF>>
ซึ่งเป็นดังนี้:
),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;
สิ่งนี้คำนวณk+1
รายการแรกของn+1
แถวลำดับที่ของตารางนั้น n k
ในขั้นต้นสแต็คเป็น
),
ให้กองของn [0 1 2 ... k]
{!}%
ให้กองn [1 0 0 ... 0]
ที่มีk
0
\{ <<MORE STUFF>> }*
นำไปด้านบนและทำให้จำนวนครั้งที่เราดำเนินการn
ขณะนี้สแต็กของเราคือแถวของตาราง: ใส่ 0 วินาทีก่อนอาร์เรย์นั้น คนแรกที่จะได้รับและคนที่สองจะเป็น วนรอบองค์ประกอบของอาร์เรย์ สำหรับแต่ละอันวางไว้บนสุดของสแต็กจากนั้นเรียกใช้งานลูปบอดี้ คือการจัดการกองซ้อนที่น่าเบื่อในการรับและปล่อยป๊อปออกจากซ้ายไป<<MORE STUFF>>
[f(i,0) f(i,1) ... f(i,k)]
0.@
j
f(i,j-1)
{ <<FINAL LOOP>> }/
.@+2$*@)@
... j f(i,j-1) f(i,j)
... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]
k+1 f(i,k)
และรวบรวมทุกอย่างไว้ในอาร์เรย์พร้อมสำหรับการวนรอบถัดไป
ในที่สุดเมื่อเราได้สร้างn
แถวที่สามของตาราง
)p;
เอาองค์ประกอบสุดท้ายออกมาพิมพ์แล้วละทิ้งส่วนที่เหลือของแถว
สำหรับลูกหลานโซลูชัน 38 ชาร์สามข้อในหลักการนี้
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/