IOCCC image by Matt Zucker

The International Obfuscated C Code Contest

1992/imc - Best output

Mandelbrot/Julia drawer

Author:

To build:

    make all

To use:

    # text mode
    ./imc -text

    ./imc

Try:

To see a number of options and configurations:

    ./try.sh

Judges’ remarks:

The program is more interesting to run on workstations that can make use of a Sun raster file. Others can make use of the -text flag for character oriented output.

Of course, the source (layout) is self-documenting! :-)

NOTE: The original winning source assumed that exit(3) returned a value which cause problems for some systems where exit(3) returns a void. The file imc.c has been modified to avoid this problem. The original file also declared argc to be a long which was fixed.

Author’s remarks:

Portability

This program depends upon the ASCII character set, and makes certain assumptions about the architecture. It naughtily declares the first argument to main() as a long, and passes a pointer to long instead of char to fwrite(3), giving a length value of 32 bytes for an array of 8 longs. I guess that makes this program OK on most flavours of unix, but not on PCs.

About the program

This program has several parameters; each of them has a default, so the program runs happily without any parameters. If you supply an incorrect parameter, an obfuscated error message results! :-) Should you want to run the program without knowing what it does, then supplying the single letter t as a parameter is a good move. Otherwise, direct the output into a file. The resulting file is most useful on SunOS, where the file(1) command will tell you what to do with it. For best results with the t option, you may want to change the definition of the I macro :-) Details appear later, though the formatting of the code is a large clue.

All the code in this program appears between the ; and ) in for(;;). That isn’t because I want to win the best one-liner, but merely because it makes the code so much more impenetrable :-) In fact running a pretty printer on the code hardly improves it at all. This program has the obligatory macros with unmatched parentheses, and the cleverly arranged macro names and parameters to spell out "Ian Colliers Obfuscated C Code". If you expand macros, bear in mind that the more complex ones are best left as macros, because they have well-defined and nontrivial (IMHO) functions. These macros help to give the program’s parameter format its flexibility. The parameters are sorted out in a unique way (based on an idea by Pete Bevin) which hides very effectively their identities (and I think that using a variable called _ adds a nice touch to the illegibility of the code). In this section of the code, the data types of the numbers checked against is varied, and just because you see a , doesn’t mean it has anything to do with commas! So I hope you will agree that this program is more than a little obfuscated…

This is a Mandelbrot/Julia drawer. Normally it produces a monochrome Sun-format raster file. The version of xloadimage we have is able to view such files, and so is Sun’s screenload command. [Note: the header contains eight 4-byte integers, the byte order in which depends upon the machine. On Sun workstations they are stored MSB first].

The program may be asked to produce text output instead of a raster file. Then the characters defined in the I macro will be used to create up to 16 different shades of grey. Quite a respectable picture can be gained by printing a 130x110 output on a dot matrix 132 column printer with the linefeed set to 7 points. Text output also gives a good picture when used in an X window with small characters having a square aspect ratio.

The options accepted by the program follow. Each option is a single letter; it may be preceded with a minus sign (or any character in [!-/]) and may be followed by other letters, so for example:

all mean the same thing. Most options may be followed by one or two numbers. These numbers may be separated from each other and from the option by a space, or may be joined to each other with a comma, or may be appended to the single-letter option, so

all mean the same (note that in -size123 all characters following the initial s are ignored). Numbers need not be specified, as each has a default value. In all cases except for j, t, and s whenever it appears before t, specifying an option without numbers has no effect. (specifying -s -t has the effect of producing text with the default raster size; not a good idea!).

Options

The options of this program are:

    -centre x y  (float x,y) Centre the picture at x+iy in the complex
                             plane (default x=0 y=0)


    -factor f    (float f)   Use f pixels per unit of the plane (default
                             f=x/4 where x is the width)


    -julia  x y  (float x,y) Draw a julia set. Use x+iy as the constant
                             to add after squaring (default x=0 y=0)

    -limit  l    (int l)     Use l iterations maximum (default l=128)

    -mask   m    (int m)     Use m as a mask in deciding the colour of each
                             pixel (see below) (default m=1)

    -size   x y  (int x,y)   Produce an x-by-y output (default for raster
                             x=768 y=768; default for text x=63 y=23)

    -text                    Produce text instead of raster.

The colour of each point is determined by taking the bitwise AND of the number of iterations and the mask. For a raster, the point is black (1-bit) if the result is zero, white otherwise. For text, the result of the operation determines the greyness of the character produced, with a blank for zero going up to a star for the maximum value. For a four-colour picture, for example, use a mask with two bits set (e.g. 3), and for a 16-colour picture use a mask with four bits set (e.g. 15). For a picture with coarse detail, use a mask which ends with several zero bits (e.g. 8).

While the program is creating your picture, it displays dots on the standard error to indicate its progress (one dot per pixel line).

Example pictures to try

Here are a couple of good pictures to draw:

    ./imc -s 512,512 -f 600000 -l 512 -m 16 -c.00805,.74274 > screen1.ras
    ./imc -s512,512 -j-.523,-.535 > screen2.ras

Inventory for 1992/imc

Primary files

Secondary files


Jump to: top