On Apr 13, 2002 at 11:45:33 +0000, Ton Hospel wrote:
>
> The really interesting entry is in fact the one by Rick Myers
> because it can be trivially improved to 54:
>
> -l for$.(++$_..pop){s!.!$.*"$&.$'"%($`?10:$^T)!eg}print
Hmm.. Well, the ++$_ would've been good for 60, but the twist
of moving $& inside the double quotes breaks for me with
input values >= 45.
The problem is that as $& grows in length, it pushes the
trailing digits of $' past were perl will "see" them when it
converts the value to float (for the *). The conversion back
to int (by the %) then causes an off-by-one type rounding
error.
In other words, at 45, for the last non-zero digit...
$.*$&+$.*".$'" == 126
$.*"$&.$'" == 125.9999999999999857891452847979962825775146484375
The confounding part about it though was that using just 7
digits of lookahead...
-l for$.(++$_..pop){s!.(?=(.{0,7}))!($.*$&+$.*".$1")%($`?10:$^T)!eg}print
.... works fine, even though I've intentionally lopped off
most of the least significant digits. A similar trick with
"$&.$1" here breaks again at 45. Grrr!
--rick