sub e{
use integer;
my @e=(1) x shift;
for(1..@e*log(@e)/3){
for(reverse(1..$#e)){
$e[$_-1]+=$e[$_]/$_; $e[$_]%=$_;
}
printf"%01d",$e[0]; $e[0]=0;
$_*=10 for @e;
}
}
Re^2: e by tachyon(Chancellor) on Jul 17, 2004 at 07:28 UTC
Cool. Lovely piece of code.
Map gets it down to 105 chars - yes void maps are good for golf only!
sub e{
#234567890123456789012345678901234567890123456789012
@e=(1)x pop;map{map{$e[$_-1]+=$e[$_]/$_;$e[$_]=10*($
e[$_]%$_)}reverse 1..$#e;print int$e[0];$e[0]=0}1..@e
}
# or if you prefer whitespace and no void maps
sub e{
@e=(1)x pop;
for(1..@e){
for(reverse(1..$#e)){
$e[$_-1]+=$e[$_]/$_;
$e[$_]=10*($e[$_]%$_)
}
print int $e[0];
$e[0]=0
}
}
Re^3: e by mtve(Deacon) on Jul 17, 2004 at 09:36 UTC
Simple optimizations down to 86:
sub e{
#234567890123456789012345678901234567890123456789012
map{$e[$q-1]+=$e[$q]/$q,($e[$q]%=$q--).=0for
1..($q=@e);$e[0]=!print"@e"|0}@e=(1)x pop
}
e(1000);
Re^4: e by tachyon(Chancellor) on Jul 17, 2004 at 10:02 UTC
There was a bug in the code I posted. AFAIK it does not effect the result per se just the efficiency. By trying to scrape a char by using @e instead of $#e (as used in IOs code) within the inner loop we are accessing a non existent element one past the end of the array. As a result @e is growing by one with each inner loop.