स्काला: 110
type B=BigInt
def r(a:B,b:B,f:(B,B)=>B):B=if(b>1)f(a,r(a,b-1,f))else a
def h(a:B,b:B)=r(a,b,r(_,_,r(_,_,(_+_))))
ungolfed:
type B=BigInt
def recursive (a:B, b:B, f:(B,B)=>B): B =
if (b>1) f (a, recursive (a, b-1, f))
else a
recursive (2, 3, recursive (_, _, recursive (_, _, (_ + _))))
स्पष्टीकरण:
type B=BigInt
def p (a:B, b:B):B = a+b
def m (a:B, b:B):B = if (b>1) p (a, m (a, b-1)) else a
def h (a:B, b:B):B = if (b>1) m (a, h (a, b-1)) else a
def t (a:B, b:B):B = if (b>1) h (a, t (a, b-1)) else a
प्लस, mul, उच्च (: = pow), tetration सभी एक ही तरीके से काम करते हैं। सामान्य पैटर्न को पुनरावर्ती विधि के रूप में निकाला जा सकता है, जो दो BigInts और एक मूल फ़ंक्शन लेता है:
def r (a:B, b:B, f:(B,B)=>B):B =
if (b>1) f(a, r(a, b-1, f)) else a
r (4, 3, r (_,_, r(_,_, (_+_))))
अंडरलाइन्स किसी चीज़ के लिए प्लेसहोल्डर हैं जिसे इस क्रम में बुलाया जाता है, उदाहरण के लिए प्लस (ए, बी) = (ए + बी); इसलिए ( + ) एक फ़ंक्शन है जो दो तर्क लेता है और उन्हें जोड़ता है (a + b)।
दुर्भाग्य से, मुझे स्टैक आकार के साथ मुद्दे मिलते हैं। यह 4 के लिए छोटे मूल्यों के लिए काम करता है (उदाहरण के लिए: 2) या अगर मैं एक कदम के लिए गहराई कम कर देता हूं:
def h(a:B,b:B)=r(a,b,r(_,_,(_*_))) // size -7, penalty + 5
def h(a:B,b:B)=r(a,b,r(_,_,r(_,_,(_+_))))
मूल कोड 112 वर्ण है और स्कोर होगा, यदि वैध हो, 107। हो सकता है मुझे पता चले कि स्टैक कैसे बढ़ाया जाए।
विस्तारित एल्गोरिथ्म को टेलरेस्किव कॉल में बदला जा सकता है:
type B=BigInt
def p(a:B,b:B):B=a+b
import annotation._
@tailrec
def m(a:B,b:B,c:B=0):B=if(b>0)m(a,b-1,p(a,c))else c
@tailrec
def h(a:B,b:B,c:B=1):B=if(b>0)h(a,b-1,m(a,c))else c
@tailrec
def t(a:B,b:B,c:B=1):B=if(b>0)t(a,b-1,h(a,c))else c
टेलरेस्क्युर कॉल मूल विधि की तुलना में लंबा है, लेकिन लंबे संस्करण में स्टैकओवरफ्लो नहीं बढ़ा - हालांकि यह उचित समय में परिणाम नहीं देता है। t (2,4) ठीक है, लेकिन t (3,3) पहले ही मेरे द्वारा 5 मिनट के बाद रोक दिया गया था। हालाँकि, यह बहुत सुंदर है, है ना?
// 124 = 119-5 bonus
type B=BigInt
def r(a:B,b:B,c:B,f:(B,B)=>B):B=if(b>0)r(a,b-1,f(a,c),f)else c
def t(a:B,b:B)=r(a,b,1,r(_,_,1,r(_,_,0,(_+_))))
और अब ऊपर जैसा ही है: बदबूदार गुणन का उपयोग करें (हम 5 के बोनस को खारिज करते हुए भी लाभ कमाते हैं, क्योंकि हम 7 वर्णों को बचाते हैं: जीत = 4 वर्ण :)
// 115 without bonus
type B=BigInt
def r(a:B,b:B,c:B,f:(B,B)=>B):B=if(b>0)r(a,b-1,f(a,c),f)else c
def t(a:B,b:B)=r(a,b,1,r(_,_,1,(_*_)))
मंगलाचरण:
timed ("t(4,3)")(t(4,3))
t(4,3): 1
scala> t(4,3)
res89: B = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
रनटाइम: 1ms।
*कुछ संदर्भों में गोल्फस्क्रिप्ट गुणा है, लेकिन यह भी सरल लूपिंग ऑपरेटर है:{block}N*सी-स्टाइल के बराबर हैfor(i=0;i<N;i++){block}। मुश्किल बढ़त का मामला स्ट्रिंग / सरणी गुणन ('a'3*देता है'aaa') है, लेकिन यह एक मुद्दा होने की संभावना नहीं है कि4***3तत्वों की एक सरणी रैम को प्रवाहित करेगी।