http://www.perlmonks.org?node_id=307322

sub b{my $a='push@{$_[0]},('.$_[2].join($_[1],(('(pop@{$_[0]}||1)')x$_ +[0])).$_[3 ].');';sub{eval $a};}$a0=b(1,"","","x2");$a1=b(2,"+");$a2=b(2,"*");$a3 +=b(0,""," 1");$a4=b(1,"","print chr");$s=[];$z='"!3!+"%"#*9):B"--11$2A);"-!$):)1 ++!-%")*%")* -*%"!##))*%2!2%"##))B)1!#"*"A$)",+B"$")*%"#)C*-1!3"-"%"#*A)1!1+,%"1*B' +;map{&${"a $_"}($s)}map{$f=ord(substr($z,$_,1))-33;($f%8,int($f/8))}(0..111);

Yeah... first time trying, can't figure out how to compress it any further yet. Perhaps if I'd designed a more efficient stack machine?

Replies are listed 'Best First'.
Re: Need help shortening this
by tilly (Archbishop) on Nov 15, 2003 at 16:53 UTC
    What are you trying to do? For me &{""} does the same exact thing, which is probably not what you wanted. (Perl 5.8.0 here.)
Re: Need help shortening this
by jonadab (Parson) on Nov 15, 2003 at 23:27 UTC

    I get the following error on both ActivePerl 5.8.0 (WinMe) and Perl 5.6.0 (Linux Mandrake):

    Undefined subroutine &main:: called at tempfile.pl line 4.

    $;=sub{$/};@;=map{my($a,$b)=($_,$;);$;=sub{$a.$b->()}} split//,".rekcah lreP rehtona tsuJ";$\=$ ;->();print$/
      there can't be any whitespace in $z. If you copy/paste, delete any such white space before running the code and that should work. If it doesn't then . . . i don't know :-(

      jynx

      I've got that too first, but then I removed all newlines, and it worked that way.

Re: Need help shortening this
by jynx (Priest) on Nov 18, 2003 at 21:18 UTC
    after a few hours work, this is the best that i can come up with that doesn't deviate from your original algorithm. It's shorter by some 50+ characters (but still 6 characters over an 80-character, 4-line sig), and i'm sure more could be done; i just don't see what at the moment...
    # This has been tested with perl 5.6.1 on Solaris 9 only @a=map{sub{my$a="push\@s,($_[2]".join($_[1],('(pop@s||1)')x$_[0])."$_[ +3])";sub{ eval$a}}->(@$_)}[1,'','','x2'],[2,'+'],[2,'*'],[0,'',1],[1,'','print c +hr'];&{$a [$_]}for map{($f=ord(substr'"!3!+"%"#*9):B"--11$2A);"-!$):)1+!-%")*%") +*-*%"!#'. '#))*%2!2%"##))B)1!#"*"A$)",+B"$")*%"#)C*-1!3"-"%"#*A)1!1+,%"1*B',$_,1 +)-33)%8,$ f/8}0..111
    anyone else?
    jynx
      print'JUST ANOTHER PERL HACKER'

      Ok, just kidding :) With no changing of language, neither with any diligence:

      @_=@{([1,'','','x2'],[2,'+'],[2,'*'],[0,'',1],[1,'','print chr'])[$_]} +,eval" push\@s,$_[2]".join($_[1],('(pop@s||1)')x$_[0])."$_[3]"for map{($f=ord +()-33) %8,$f/8}'"!3!+"%"#*9):B"--11$2A);"-!$):)1+!-%")*%")*-*%"!##))*%2!2%"## +))B)1! #"*"A$)",+B"$")*%"#)C*-1!3"-"%"#*A)1!1+,%"1*B'=~/./g

      ... unpack is juts crying for this.