->The Tragedy of Macbeth<- The Setup



Here you can find the full text of The Tragedy of Macbeth.  If you view the source, and save it as text, you will notice it comes out to 206,244 total characters (including the whitespace at the end of the html).

The Challenge



Write a program which compresses the text linked above into the smallest possible text file which can then reproduce the original text exactly (including the whitespace).

The Rules



Your program cannot have any prior knowledge of the text it is compressing.  The goal however is still to compress this specific text, so don't worry if it sucks at other text as long as it does the best job possible on Macbeth.

The program must take either "compress" or "decompress" as the first parameter and the text file as the second command line parameter.  The compressed output has to be a text file, and it has to be UTF16.  The compressed output when decompressed must match exactly the original file in a character for character comparison.

The program needs to finish in a reasonable amount of time.  If it takes longer than a few seconds, please list the average running time with your submission.

The Scoring



The only score is the number of characters in the compressed output.  The score only counts if the decompress matches the original in a character for character comparison.
Pseudo-code, compresses Macbeth to 0 bytes

Counter-example (yeah, almost joke) submission intended to point out the flaws with the question.  (the C# was a bit long both in source size and resulting output)

if argument is "compress"
  compare entire input file to the Tragedy of Macbeth
  if equal, then output empty file
  else if input is non-empty,
    then RLE-encode input stream on chr(127) only and output that
  else [if input is empty]
    then RLE-encode a string of zero times chr(127)
else if argument is "decompress"
  if input is empty
  then output the Tragedy of Macbeth
  else RLE-decode input file on chr(127) only and output back


With this approach, Macbeth is brought down to as short a file as possible. Other text input is usually passed untouched, at worst gains a byte per chr(127) which tend not to occur in actual text.