Skip to main content
Commonmark migration
Source Link

###Scala:110

Scala:110

###Scala:110

Scala:110

found tailcall solution (out of competition, but as proof of concept)
Source Link
user unknown
  • 4.6k
  • 32
  • 32

This works flawlesslyThe tailrecursive call is longer than the original method, but I faileddidn't raise a stackoverflow in transformingthe long version - however it to suchdoesn't yield a r(_,_,r(_,_,r(_,_,(_+_))))result in reasonable time. t(2,4) is fine, but t(3,3) already was stopped by me after 5 min. However, it is very elegant, isn't it?

// 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,(_+_)))) 

And now the same as above: use stinky multiplication - call(we even profit while rejecting the bonus of 5, because we save 7 characters: win=4 chars:)

// 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,(_*_))) 

invocation:

timed ("t(4,3)")(t(4,3)) t(4,3): 1 scala> t(4,3) res89: B = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096 

runtime: 1ms.

This works flawlessly, but I failed in transforming it to such a r(_,_,r(_,_,r(_,_,(_+_)))) - call.

The tailrecursive call is longer than the original method, but didn't raise a stackoverflow in the long version - however it doesn't yield a result in reasonable time. t(2,4) is fine, but t(3,3) already was stopped by me after 5 min. However, it is very elegant, isn't it?

// 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,(_+_)))) 

And now the same as above: use stinky multiplication (we even profit while rejecting the bonus of 5, because we save 7 characters: win=4 chars:)

// 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,(_*_))) 

invocation:

timed ("t(4,3)")(t(4,3)) t(4,3): 1 scala> t(4,3) res89: B = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096 

runtime: 1ms.

Source Link
user unknown
  • 4.6k
  • 32
  • 32

###Scala: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 (_, _, (_ + _)))) 

explanation:

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 

plus, mul, high(:=pow), tetration all work in the same manner. The common pattern can be extracted as recursive method, which takes two BigInts and a basic function:

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(_,_, (_+_)))) 

The underlines are placeholder for something which gets called in this sequence, for example the addition plus(a,b)=(a+b); therefore (+) is a function which takes two arguments and adds them (a+b).

unfortunately, I get issues with the stack size. It works for small values for 4 (for example: 2) or if I reduce the depth for one step:

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(_,_,(_+_)))) 

The original code is 112 characters and would score, if valid, 107. Maybe I find out how to increase the stack.

The expanded algorithm can be transformed to tailrecursive calls:

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 

This works flawlessly, but I failed in transforming it to such a r(_,_,r(_,_,r(_,_,(_+_)))) - call.