# Matthew van Eerde's web log

• #### Bad Perl: Russian Peasant multiplication algorithm

I found this programming contest interesting: here's what I've got.

perl -e "(\$a,\$b)=@ARGV;map{\$c+=\$_*\$b}grep{\$a&\$_}map{1<<\$_}(0..log(\$a)/log 2);print\$c" 7 19

I'm calling this a one-liner because the part between the quotes is less than 80 characters (75, to be exact.)  The full command line goes over :-(

Requires the inputs to be positive whole numbers.

Perfect example of Bad Perl.  Exercise: rewrite in Good Perl.

EDIT: got the whole thing down to 80 characters (with single-digit multiplicands.)

perl -e "(\$a,\$b)=@ARGV;map{\$c+=\$b<<\$_ if\$a>>\$_&1}(0..log(\$a)/log 2);print\$c" 8 7

• #### Bad Perl: Josephus problem

Another programming contest asks to solve the Josephus problem.

Bad Perl solution (83 characters... so close...)

>perl -e"@_=(1..\$ARGV[0]);++\$c%\$ARGV[1]?\$i++:splice@_,\$i%=@_,1while\$#_;print@_" 40 3
28

EDIT: got it down to 80.

>perl -e"@_=(1..shift);++\$c%\$ARGV[0]?\$i++:splice@_,\$i%=@_,1while\$#_;print@_" 40 3
28

EDIT2: 78 dropping the parentheses.

>perl -e"@_=1..shift;++\$c%\$ARGV[0]?\$i++:splice@_,\$i%=@_,1while\$#_;print@_" 40 3
28

EDIT3: 66, shamelessly cannibalizing others' ideas from the contest (though I refuse to use "say")

>perl -e"\$k=pop;@_=1..pop;@_=grep{++\$i%\$k}@_ while\$#_;print@_" 40 3
28

Page 1 of 1 (2 items)