Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation


by goibhniu (Hermit)
on Aug 18, 2007 at 09:28 UTC ( [id://633452] : obfuscated . print w/replies, xml ) Need Help??

Ok, this is my first japh. I haven't got it down to four lines, but 5 is almost 4 for really small values of 5.

If you don't want clues, don't look up the ACA. I put it in the title because I wanted it to be more personal than "My first JAPH", but I didn't want to put too much in the title for those who have fun with de-obfuscating.

@ca=(sub{@kp=split(//,shift);$c=shift;$p2{' '}=' ';$C2{' '}=' ';foreac +h(@kp, 'a'..'z'){if(!exists $p2{$_}){$k=chr(ord('A')+(($a++)+$c)%26);$p2{$_}= +$k; $C2{$k}=$_;}}},sub{$t=shift;$h=shift;foreach(split(//,$t)){$r=$r.($$h{ +$_});} return $r;});$ca[0]->('thequickbrownfoxjumpsoverthelazydogs',10);print + $ca[1]->('ZOCK FWUKLMT BMTE LFQR',\%C2)."\n";

I humbly seek wisdom.

Replies are listed 'Best First'.
by eyepopslikeamosquito (Archbishop) on Aug 18, 2007 at 12:07 UTC

    Without understanding what your code does, I whittled 100 strokes off its length by performing some routine golfic shortenings:

    @z=(sub{$c=pop;$x{$"}=$C{$"}=$";$x{$_}or$x{$C{$k}=$_}=$k=chr ord(A)+($a+++$c)%26for pop=~/./g,a..z},sub{$h=pop;$r.=$$h{$_}for pop=~/./g;$r});$z[0]->(thequickbrownfoxjumpsoverthelazydogs,10); print$z[1]->('ZOCK FWUKLMT BMTE LFQR',\%C).$/
    Fits in a 4-line sig now. :-)

    Update: whittled a further 10 strokes.

      Wonderful. Is there a "routine golf shortenings" node?

      I humbly seek wisdom.

        <shameless plug>
        There's a number of tips and techniques listed in Perl Golf 101 as well as in the comments to that node.
        </shameless plug>

        s**lil*; $*=join'',sort split q**; s;.*;grr; &&s+(.(.)).+$2$1+; $; = qq-$_-;s,.*,ahc,;$,.=chop for split q,,,reverse;print for($,,$;,$*,$/)
Re: ACA JAPH (hints)
by goibhniu (Hermit) on Aug 22, 2007 at 14:08 UTC

    My first clue is to explain ACA in the post. It's probably not very helpful; just a nudge in a direction. Here's the link:


    My next clue is somethign most here could do themselves, but I just learned it this week (from reading PerlMonks!). Here's the perl -MO=Deparse output (this is without eyepopslikeamosquito's reduction):

    @ca = (sub { @kp = split(//, shift @_, 0); $c = shift @_; $p2{' '} = ' '; $C2{' '} = ' '; foreach $_ (@kp, ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' +, 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x +', 'y', 'z')) { if (not exists $p2{$_}) { $k = chr 65 + ($a++ + $c) % 26; $p2{$_} = $k; $C2{$k} = $_; } } } , sub { $t = shift @_; $h = shift @_; foreach $_ (split(//, $t, 0)) { $r = $r . $$h{$_}; } return $r; } ); $ca[0]->('thequickbrownfoxjumpsoverthelazydogs', 10); print $ca[1]->('ZOCK FWUKLMT BMTE LFQR', \%C2) . "\n";

    My next clue is to comment my variables. This is a big leap and probably a give away. I wish I had better intermediate clues for ya.

    # @ca - code array # @kp - key phrase # $c - caesar shift (big hint here) # %p2 - short for p2C - plaintext to CIPHERTEXT hash # %C2 - short for C2p - CIPHERTEXT to plaintext hash # $k - key (one letter of the key alphabet) # $t - text # $h - hash reference # $r - result

    ok, here's what I'm doing:

    I create an array of annonymous subroutine references.

    $ca[0] is the subroutine that takes a keyphrase and a caesar shift to create a key alphabet. This is what the ACA calls a K1. The keyword is reduced to it's unique letters in the order of occurrence in the key phrase followed by the rest of the letters in alphabetical order. This procuces a scrambled alphabet. In a K1, this scrambled alphabet is written as the plaintext alphabet and is associated with a CIPHERTEXT alphabet in natural order (in the ACA the convention is that plaintext be in lower case and CIPHERTEXT in uppercase). The two alphabets are shifted with respect to each other by a factor that ensures no letter is enciphered to itself.

    In $ca[0] I use the keyphrase letters plus the 'rest of the alphabet' in order as the keys (overloaded word there) to the %p2C hash. Then I turn p2C inside out to get C2p.

    $ca[1] does the decryption. Actually, it takes some text and a hashref to do either decryption or encryption. This simply replaces the letters in the text with the values dereferenced from the hash by that letter. If you pass it p2C, you'd be encrypting; C2p would be decrypting.

    The next line calls $ca[0] with the keyphrase 'thequickbrownfoxjumpsoverthelazydogs' and a caesar shift of 10 to set up the C2p hash.

    Finally, print the decrypted version of 'ZOCK FWUKLMT BMTE LFQR'. You know what that says!

    I humbly seek wisdom.