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


in reply to Re: Huffman once again
in thread Huffman once again

My reply back:

Ok, here we go...

This is my second try at the huffman decompresser. I have changed the implementation a bit, replacing the arrays with strings. I've also applied some of the suggestions jynx made, inlineing the literals, using 'compliant' variable names ($; was a fine twist..).

#!/usr/bin/perl do{$_=ord substr"1234567 89:her;k<t=alcjusnop",$:*2+ (((ord(substr"\x00\x50\xA5\xd2\xc5\xbb\x96\xef\x06". "\xbc\x8e\xe0",$;/8,1)&2**(7-$;++%8))==0)?0:1),1;$:= ($_&240)==48?$_&15:-1+print chr}until$;==91

Replies are listed 'Best First'.
Re: Re: Re: Huffman once again
by fsn (Friar) on Jul 17, 2002 at 20:16 UTC
    Here is jynx's response back, and I think this will be the final version. It sure looks compact and unreadable to me now. And, yup, it was an enjoyable excersize...

    update: after reading fsn's scratchpad (which betters my attempts a bit :), there are two last things i can think of that may help: (1) reducing one more variable (2) removing the do{} block...
    $_=ord substr"1234567 89:her;k<t=alcjusnop",(($_&240)==48?$_& 15:-1+print chr)*2+((ord(substr"\x00\x50\xA5\xd2\xc5\xbb\x96". "\xef\x06\xbc\x8e\xe0",$;/8,1)&2**(7-$;++%8))?1:0),1while$;<92
    Note how since the variable $: was removed, the $; limit had to be increased to 92 to accomodate and finish printing the string. Also the ==0 check was removed and the ==91 check changed to <92...

    Don't know if it's more or less obfuscated, and as i've said i'm not very good, but it seems to be more difficult to parse. i had fun with this exercise, and i hope fsn did as well :-)

    jynx