IOCCC image by Matt Zucker

The International Obfuscated C Code Contest

2012/endoh2 - PiE in the sky award

Pi/e quine

Author:

To build:

    make

To use:

    ./endoh2 > pi.c
    gcc -o pi pi.c
    ./pi > 314.c

and:

    ./endoh2 e > e.c
    gcc -o e e.c
    ./e > 271.c

Try:

    ./try.sh

Judges’ remarks:

A pi/e printing quasi-quine in ASCII art with a compressed font in it; what else to wish for in this program? Virtual machine emulation?

Author’s remarks:

Yeah, “Again”. Sorry. But I don’t feel guilty or uncomfortable.

This entry is based on ‘over-used themes’ such as self reproducing program and pi or e computation. I know you’re tired of them.

But have you ever seen them all-in-one?

What it is

This program generates a new program in the shape of the Greek letter pi. Then, the generated program:

One more thing… When you give a command line argument e to the first program, the generated one will compute Napier’s constant rather than pi.

Obfuscation

This program itself is in the shape of a spigot. This is derived as an analogy with spigot algorithm which infinitely computes the value of a mathematical constant such as pi or e.

The two sets of programs, 314*.c and 271*.c, are almost the same except their shape and constant computational part. I tailored the common part to parse in both shapes (3.14... and 2.71...), by tweaking the computational order and adding meaningless code fragments.

On the other hand, to make it fit inside one screen (80 x 25), my program is shortened properly, more than it looks. (As you may know, quines need to make its program size doubled.) For example, this program involves 3x5 bitmap font data of ten characters (09), as just 20 bytes: G1%xJ{;Q7wunmuGuu%uu. We can decode character n as 275*s[n+10] - 8*s[n] - 8. I solved the system of Bézout’s identity to find the magic string, with the aid of a brute force. See find-font-table.rb in detail.

I used many other tricks for short coding.

I’m sorry that many ASCII-art-style winning entries of IOCCC ignore C preprocessor directives. In my program, #include is a part of ASCII-art with comments padded.

These design requirements made my program well-obfuscated willy-nilly.

Portability

I expect it to work in any major environment and C compiler. To build with no warning, it requires two C99 features: allow string literal to be more than 509 characters and not requiring a return in main(). In fact, recent compilers with -std=c99 -Wall -W -Wextra -pedantic would say nothing.

    gcc -std=c99 -Wall -W -Wextra -pedantic spigot.c
    clang -std=c99 -Wall -W -Wextra -pedantic spigot.c

I’ve tested with gcc-4.6.3 and clang-3.0 on Linux (Ubuntu 12.04) and gcc-4.5.3 and clang-3.1 on Cygwin.

Synopsis

    cc endoh2.c -o endoh2

    ./endoh2 > pi.c
    cat pi.c

    cc pi.c     -o pi     ; ./pi     > 314.c     ; cat 314.c
    cc 314.c    -o 314    ; ./314    > 3141.c    ; cat 3141.c
    cc 3141.c   -o 3141   ; ./3141   > 31415.c   ; cat 31415.c
    cc 31415.c  -o 31415  ; ./31415  > 314159.c  ; cat 314159.c
    cc 314159.c -o 314159 ; ./314159 > 3141592.c ; cat 3141592.c
    etc...

    ./endoh2 e > e.c
    cat e.c

    cc e.c      -o e      ; ./e      > 271.c     ; cat 271.c
    cc 271.c    -o 271    ; ./271    > 2718.c    ; cat 2718.c
    cc 2718.c   -o 2718   ; ./2718   > 27182.c   ; cat 27182.c
    cc 27182.c  -o 27182  ; ./27182  > 271828.c  ; cat 271828.c
    cc 271828.c -o 271828 ; ./271828 > 2718281.c ; cat 2718281.c
    etc...

You can do make everything for the process (with no cat).

Note: The executable may return a failure (non-zero) exit status unless -std=c99 option is given.

Inventory for 2012/endoh2

Primary files

Secondary files


Jump to: top