Remove hint.html and index.html
As per discussions on GitHub the index.html and hint.html files should be deleted in favour of README.md files (from any .text/.txt/.markdown/.md files which will be turned into README.md in an upcoming commit).
This commit is contained in:
1 parent
ee8a36310f
commit
77fb0f11a2
143 files changed
-28606
No files matched your search
@@ -1,149 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta name="GENERATOR" content="mkd2html 2.1.5a DL=DISCOUNT">
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
|
||||
<link rel="stylesheet"
|
||||
type="text/css"
|
||||
href="../hint.css">
|
||||
<title>Most Compact</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Most Compact</h1>
|
||||
|
||||
<p>Chris Mills<br>
|
||||
Twitter: @MisterXopher</p>
|
||||
|
||||
<h2>Judges' comments:</h2>
|
||||
|
||||
<h3>To use:</h3>
|
||||
|
||||
<pre><code>make
|
||||
|
||||
./prog compressed_file.Z
|
||||
</code></pre>
|
||||
|
||||
<h3>Try:</h3>
|
||||
|
||||
<pre><code>printf '000I\236\f\31H\260\240\301\203' > ioccc.Z
|
||||
./prog ioccc.Z
|
||||
|
||||
dd bs=1k count=4096 < /dev/urandom > test1
|
||||
compress < test1 > test1.Z
|
||||
time ./prog test1.Z | cmp - test1
|
||||
|
||||
dd bs=1k count=4096 < /dev/zero > test2
|
||||
compress < test2 > test2.Z
|
||||
time ./prog test2.Z | cmp - test2
|
||||
</code></pre>
|
||||
|
||||
<h3>Selected Judges Remarks:</h3>
|
||||
|
||||
<p>Without ASCII art, the source code of this entry would have been exactly 256 bytes.
|
||||
Compared to <a href="http://ioccc.org/years.html#1990_jaw">1990/jaw</a>, it is very impressive,
|
||||
even taking into account the missing atob functionality. Now we wish for a compress(1)-like compressor
|
||||
using a similar idea.</p>
|
||||
|
||||
<p>Why is the sad smiley on line 12 in that particular place?</p>
|
||||
|
||||
<h2>Author’s comments:</h2>
|
||||
|
||||
<h1>The Program</h1>
|
||||
|
||||
<p>This program is in implementation of the unix <code>zcat(1)</code> command for printing
|
||||
compressed files that have been created by the <code>compress(1)</code> command.</p>
|
||||
|
||||
<p>The adaptive <a href="https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch">LZW</a> compression
|
||||
employed by <code>compress</code> usually requires a fairly large amount of memory to
|
||||
build the decompression tables (in fact, <code>compress</code> has a command-line option
|
||||
to control the size of the decompression tables, since some of the early
|
||||
systems to which it was ported (<em>cough</em>MS-DOS<em>cough</em>) did not have enough
|
||||
memory to use the full 16-bit codes). This version has no large static or
|
||||
dynamic tables. It is able to decompress 16-bit files using a single function
|
||||
and a few ints.</p>
|
||||
|
||||
<p>To run the program, take an existing compressed file and pass it to the program
|
||||
on the command line. On the odd chance you don’t have <code>compress</code> hanging about
|
||||
on your system, I’ve provided compressed copies of this year’s IOCCC rules
|
||||
and guidelines files. To print them, just do</p>
|
||||
|
||||
<pre><code>./prog ioccc_guidelines.txt.Z
|
||||
</code></pre>
|
||||
|
||||
<h2>The Details</h2>
|
||||
|
||||
<p>The basic cleverness here comes from realizing that the compressed data is
|
||||
itself an encoded version of the code dictionary. When the encoder sees
|
||||
an input string that is not in its dictionary, it emits the code corresponding
|
||||
to the longest prefix that is in the dictionary and adds a new entry consisting
|
||||
of that code followed by the next input character. This means that when the
|
||||
decoder wants to know how to decode a code, it just needs to find the spot in
|
||||
the code-stream where the encoder added that entry to the dictionary. The
|
||||
code at that spot is the prefix, and the first character of the following code
|
||||
is the suffix. Decoding then just becomes recursion, to follow the chain of
|
||||
prefixes and suffix characters.</p>
|
||||
|
||||
<p>Of course, it’s not nearly that simple. Finding the code in the stream is
|
||||
complicated by several issues:</p>
|
||||
|
||||
<ul>
|
||||
<li>Codes are at bit offsets within the stream, and must be extracted.</li>
|
||||
<li>As codes are added to the dictionary, the code word size grows, so finding
|
||||
the offset to a particular code word is involved.</li>
|
||||
<li>The <code>compress</code> encoder reserves a code word that clears the coding tables.
|
||||
When this is encountered, the computation of offsets and bit sizes reset.</li>
|
||||
<li>The <code>compress</code> decoder is designed to always read a block of eight code
|
||||
words at the same time, so that it need only read N bytes to get eight N-bit
|
||||
code words. When the “clear” code is encountered, the entire eight-word
|
||||
block is flushed (since the decoder didn’t know the word size would change).
|
||||
The program needs to account for this extra flushing.</li>
|
||||
<li>The end of the stream is not explicitly marked; the encoder just pads out
|
||||
the output to the next byte. The decoder must notice this to know when
|
||||
to stop.</li>
|
||||
<li>The output stream contains a header that must be skipped.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p>Managing all the details involved added a lovely additional layer of
|
||||
obfuscation to the otherwise elegant recursive decoder. Still, the code
|
||||
manages it in a remarkably small amount of code.</p>
|
||||
|
||||
<h2>Limitations</h2>
|
||||
|
||||
<p>The decoder doesn’t look at the header. If you supply something that is not
|
||||
compressed data, it’s likely to crash in an interesting manner.</p>
|
||||
|
||||
<p>In particular, it doesn’t look at the third byte of the header, which encodes
|
||||
the maximum code word size and whether “block mode” was used when the encoder
|
||||
was run. If you use <code>compress</code> in its default mode, the maximum word size
|
||||
will be 16 bits and “block mode” will be enabled. You are unlikely to find
|
||||
any files that don’t use “block mode”, since all versions of <code>compress</code> after
|
||||
2.0 (circa 1984) use it by default and have no documented way to disable it.
|
||||
Reducing the bit depth is still possibly by using the <code>-b</code> flag. Modern
|
||||
systems have no problem with the 200 KB or so needed for 16-bit decoder
|
||||
tables, so the need for reducing the table size has passed, hence this program
|
||||
always assumes 16-bits… However, should you find a file that needs a
|
||||
smaller table, feel free to change the hard-coded 16 in the source into the
|
||||
appropriate number and recompile.</p>
|
||||
|
||||
<p>In the event that you don’t supply an argument, or that argument doesn’t name
|
||||
a readable file, the program will just silently exit. This is a feature.</p>
|
||||
|
||||
<p>The program depends on having a little-endian system. On a big-endian system
|
||||
you will get a wierd big-endian version of <code>compress</code>, which might have come to
|
||||
pass in an alternate universe where the vax on which <code>compress</code> was authored
|
||||
had been big-endian. Luckily for us, it wasn’t, and neither are most of the
|
||||
systems you might want to compile this for.</p>
|
||||
|
||||
<hr />
|
||||
|
||||
<TABLE><TR>
|
||||
<TD><a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a></TD>
|
||||
<TD><P>© Copyright 1984-2016,
|
||||
<A HREF="/judges.html">Leo Broukhis, Simon Cooper, Landon Curt Noll</A>
|
||||
- All rights reserved<BR>
|
||||
This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.</P></TD>
|
||||
<TD> <!--<a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Transitional" height="31" width="88"></a>--></TD>
|
||||
</TR></TABLE>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user