I threw this together last night just for fun, and I reckon that it could probably be made pretty tiny; particularly if the numeric command-line arguments were ditched and turned into constants (24 lines of 72 chars, say), and maybe if the selection of sweetie types was scrapped, and just '@' used.
My intended use is as spoiler space in puzzle newsgroups, something like the following: $ ./candies.pl 72 20 .1 'Have a sweetie as you scroll past' Anyway, here it is, in fully-verbose form. #!/usr/bin/perl -Tw my $w=int(shift @ARGV); my $h=int(shift @ARGV); my $n=shift(@ARGV); my $message=' '.join(' ', @ARGV).' '; my $meslen=length($message); if($n<1) { $n=int(($w*$h-3*$meslen)*$n/3); } my @sweeties=('@','@','@','O','#'); my @canvas=('£'x$w)x$h; my $margin=($w-$meslen)>>1; substr($canvas[$h/2-1],$margin-1,$meslen)=' 'x$meslen; substr($canvas[$h/2],$margin-1,$meslen)=$message; substr($canvas[$h/2+1],$margin-1,$meslen)=' 'x$meslen; while($n--) { my $sweetie=$sweeties[int(rand(@sweeties))]; if(rand()<0.8) { # horizontal my($x,$y) = (int(rand($h)), int(rand($w-2))); if(substr($canvas[$x],$y,3) eq '£££') { substr($canvas[$x],$y,3)=">$sweetie<"; } } else { # vertical my($x,$y) = (int(rand($h-2)), int(rand($w))); if((substr($canvas[$x],$y,1) eq '£') && (substr($canvas[$x+1],$y,1) eq '£') && (substr($canvas[$x+2],$y,1) eq '£')) { substr($canvas[$x],$y,1)='v'; substr($canvas[$x+1],$y,1)=$sweetie; substr($canvas[$x+2],$y,1)='^'; } } } map{$_=~tr/£/ /}(@canvas); print join("\n", @canvas), "\n"; Phil ===== When inserting a CD, hold down shift to stop the AutoRun feature In the Device Manager, disable the SbcpHid device. http://www.cs.princeton.edu/~jhalderm/cd3/ __________________________________ Do you Yahoo!? The all-new My Yahoo! - Get yours free! http://my.yahoo.com