스칼라 : 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(_,_,(_+_))))
언 골프 :
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, high (: = 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(_,_, (_+_))))
밑줄은이 순서에서 호출되는 항목의 자리 표시 자입니다 (예 : 더하기 plus (a, b) = (a + b); 따라서 ( + )는 두 개의 인수를 사용하여 추가하는 함수입니다 (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입니다. 스택을 늘리는 방법을 찾을 수 있습니다.
확장 된 알고리즘은 tailrecursive 호출로 변환 될 수 있습니다.
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
tailrecursive 호출은 원래 방법보다 길지만 긴 버전에서는 스택 오버플로를 발생시키지 않았지만 적절한 시간 내에 결과를 얻지 못합니다. t (2,4)는 괜찮지 만 5 분 후에 이미 t (3,3)이 중지되었습니다. 그러나 매우 우아하지 않습니까?
// 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,(_+_))))
그리고 이제는 위와 동일합니다 : 냄새 나는 곱셈을 사용하십시오 (우리는 7 개의 문자를 저장하기 때문에 5의 보너스를 거부하면서도 이익을 얻습니다 : win = 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*C 스타일과 같습니다for(i=0;i<N;i++){block}. 까다로운 가장자리의 경우 문자열 / 배열 곱셈 ('a'3*제공'aaa')이지만4***3요소 배열이 RAM을 오버플로 한다는 점에서 문제가되지는 않습니다 .