32 lines
1.3 KiB
Text
32 lines
1.3 KiB
Text
fcn check(number){ // a list of digits: 13 is L(0,0,0,0,0,0,1,3)
|
|
candidate:=number.reduce(fcn(sum,n){ sum*10 + n },0); // digits to int
|
|
|
|
while(candidate != 89 and candidate != 1) // repeatedly sum squares of digits
|
|
{ candidate = candidate.split().reduce(fcn(sum,c){ sum + c*c },0); }
|
|
|
|
if(candidate == 89){ // count permutations of these digits, they all sum to 89
|
|
digitsCount:=List(0,0,0,0,0,0,0,0,0,0);
|
|
foreach d in (number){ digitsCount[d] += 1; }
|
|
return(digitsCount.reduce(fcn(r,c){ r/factorial(c) },cacheBang)); // cacheBang==number.len()!
|
|
}
|
|
0 // this number doesn't sum to 89 (ie sums to 1)
|
|
}
|
|
fcn factorial(n) { (1).reduce(n,fcn(N,n){ N*n },1) }
|
|
|
|
limit:=0d100_000_000; cacheSize:=limit.toFloat().log10().ceil().toInt();
|
|
number:=(0).pump(cacheSize,List().write,0); // list of zeros
|
|
result:=0; i:=cacheSize - 1;
|
|
var cacheBang=factorial(cacheSize); //== number.len()!
|
|
|
|
while(True){ // create numbers s.t. no set of digits is repeated
|
|
if(i == 0 and number[i] == 9) break;
|
|
if(i == cacheSize - 1 and number[i] < 9){ number[i] += 1; result += check(number); }
|
|
else if(number[i] == 9) i -= 1;
|
|
else{
|
|
number[i] += 1;
|
|
foreach j in ([i + 1 .. cacheSize - 1]){ number[j] = number[i]; }
|
|
i = cacheSize - 1;
|
|
result += check(number);
|
|
}
|
|
}
|
|
println(result);
|