P is for Practical PerlMonks

### Re: e

by I0 (Priest)
 on Jul 17, 2004 at 06:04 UTC ( #375201=note: print w/replies, xml ) Need Help??

```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;
}
}

Replies are listed 'Best First'.
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
}
}

cheers

tachyon

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);

Update from tybalt89 - 80 chars:

```\$=[!print\$=]=!map{\$==\$=[\$#z]+=\$=[@z]/@z,(\$=[@z]%=1+\$#z--).=0}@z=@=for@
+==(1)x pop
Re^4: e
by shmem (Chancellor) on Sep 13, 2015 at 09:47 UTC
```\$=[!print\$=]=!map{\$==\$=[\$#z]+=\$=[@z]/@z,(\$=[@z]%=1+\$#z--).=0}@z=@=for@
+==(1)x pop

Segfaults with perl v5.18.2:

```qwurx [shmem] ~> perl -e '\$=[!print\$=]=!map{\$==\$=[\$#z]+=\$=[@z]/@z,(\$=[
+@z]%=1+\$#z--).=0}@z=@=for@==(1)x pop' 10
Attempt to free unreferenced scalar: SV 0xdd0968, Perl interpreter: 0x
+da4010 at -e line 1.
Segmentation fault

Works with v5.10.1 though. Looks like the segfault happens here:

```\$=[@z]%=1+\$#z--).=0

Can't (for now) figure out why.

perl -le'print map{pack c,(\$-++?1:13)+ord}split//,ESEL'

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.

cheers

tachyon

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://375201]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (6)
As of 2022-12-09 23:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?

No recent polls found

Notices?