गोल्फस्क्रिप्ट - 56 50 49 48 41 40 38 37 वर्ण
n%{~),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;}/
नोट: यह इनपुट की कई लाइनों को संभालता है, तेज है (परीक्षण मामलों को करने के लिए 1/8 सेकंड), और किसी भी कानूनी इनपुट के लिए नहीं टूटता है।
(पहला संस्करण भी मेरा पहला गोल्फस्क्रिप्ट कार्यक्रम था, मैंने कई ट्रिक्स को याद करने के लिए eBusiness को धन्यवाद दिया था)।
इसे एक उपयोगी शैक्षिक पद बनाने के लिए, यहाँ यह भी बताया गया है कि यह कैसे काम करता है। हम पुनरावृत्ति के साथ शुरू करते हैं f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
। इसे स्पष्ट रूप से यह कहते हुए समझा जा सकता है कि 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
0s हैं। शीर्ष पर
\{ <<MORE STUFF>> }*
लाता है n
और इसे हमारे द्वारा निष्पादित किए जाने की संख्या के बराबर बनाता है <<MORE STUFF>>
।
हमारा स्टैक वर्तमान में तालिका की एक पंक्ति है: [f(i,0) f(i,1) ... f(i,k)]
0.@
उस सरणी से पहले 0s का एक जोड़ा रखता है। पहला वाला होगा 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;
तो अंतिम तत्व लेता है, इसे प्रिंट करता है, और शेष पंक्ति को हटा देता है।
इस सिद्धांत पर तीन-चार समाधानों के लिए:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/