TotL Wins Something!

Chris, one of the totl crew, won his catagory in the 5th Obfuscated Perl Contest.

The code will only run in a linux terminal! It uses evil, evil escape codes.

Don't try and cut and paste the code - extra whitespace will kill it! Download it from here. Save it as timepiece then run it from a linux console by typing perl timepiece.

$;=$_;$/='0#](.+,a()$=(\}$+_c2$sdl[h*du,(1ri)b$2](n} /1)1tfz),}0(o{=4s)
1rs(2u;2(u",bw-2b $ hc7s"tlio,tx[{ls9r11$e(1(9]q($,$2)=)_5{4*s{[9$,lh$2
,_.(ia]7[11f=*2308t$$)]4,;d/{}83f,)s,65o@*ui),rt$bn;5(=_stf*0l[t(o$.o$r
srt.c!(i([$a]$n$2ql/d(l])t2,$.+{i)$_.$zm+n[6t(e1+26[$;)+]61_l*,*)],(41$
{/@20)/z1_0+=)(2,,4c*2)\5,h$4;$91r_,pa,)$[4r)$=_$6i}tc}!,n}[h$]$t 0rd)_
$';open(eval$/);$_=<0>;for($x=2;$x<666;$a.=++$x){s}{{.|.}};push@@,$&;$x
==5?$z=$a:++$}}for(++$/..substr($a,1885)){$p+=7;$;.=$@[$p%substr($a,$!,
3)+11]}eval$;

Frightening, ain't it? Can you see what it is yet?


Here's a clue; this code results in a string which is 'eval'd at the end. The contents of that eval is:

($d,$/)=(" "x1924,.10486);for($l..666){z(24,46,$_,\$d)}for(27,91,59,72)
{substr($d,$n++,1)=chr$_}$d.=chr(10);while(){$a=$d,@t=localtime;l(20,59
,$t[0])+l(21,42,$t[1])*l(18,35,5*$t[2]+$t[1]/12);print$a}sub z{substr($
{$_[3]},int(sin($_[2]*$/)*$_[$!])+(2*int(12-cos($_[2]*$/)*$_[$!]/2)+1)*
40+4,1)=chr($_[1])}sub l{$q=shift;for(0..$q){z($_,@_,\$a)}}


That code with indents, and some obfuscation removed, and sensible variable names becomes:

$default = " "x1924;

$PIBY30=.10486;

for(0..666){
   plotchar(24,46,$_,\$default)
}

for(27,91,59,72){
   substr($default,$n++,1)=chr$_
}
$default.=chr(10);

while(){
   $buffer=$default;
   @t=localtime;
   my ($sec,$min,$hour, @crap) = @t;
   drawhand(20,59,$sec);
   drawhand(21,42,$min);
   drawhand(18,35,5*$hour+$min/12);
   print $buffer;
}

sub plotchar{
   ($dist,$char,$angle,$stringptr) = @_;
   $x=int(sin($angle*$PIBY30)*$dist);
   $y=(2*int(12-cos($angle*$PIBY30)*$dist/2)+1);
   $pos = $x+$y*40+4;
   substr(${$stringptr}, $pos, 1)=chr($char);
}

sub drawhand{
   ($length,$char,$angle)=@_;
   for(0..$length){
      plotchar($_,$char,$angle,\$buffer);
   }
}


The actual result should look like this, an analog clock showing the current time.

                               ...................                         
                               ....                  .....                     
                             ...                         ...                   
                           ...                              ..                 
                         ..                                  ...               
                        ..                                     ..              
                       ..  ;                                    ..             
                      ..    ;;;;                                 ..            
                     ..         ;;;                               ..           
                     .             ;;;;                            .           
                     .                ;;;;                         .           
                     .                    ;;;                      .           
                     .                      ######                 .           
                     .                     *      #######          .           
                     .                    *              #####     .           
                     ..                  **                       ..           
                      ..                **                       ..            
                       ..              **                       ..             
                        ..            **                       ..              
                         ...          *                       ..               
                           ..        *                      ..                 
                             ...    *                    ...                   
                               .....                 .....                     
                                   ...................                         
    

The sick part is that this page is a CGI script- that clock above should be showing correct GMT!

Links