While not strictly necessary, replacing the two ASCII tab characters in the markdown copyright comment makes it easier to detect problematic TAB indentation within markdown files. After this commit, only 90 markdown files have leading ASCII TAB characters. And again, while not strictly necessary, we can consider running expand on those 90 markdown files to see what effect that might have on the HTML files they produce. Replace leading ASCII TAB characters with multiples of 8 ASCII SPACE characters (the default action of the `expand(1)` tool) might have an negative effect on some HTML formatting where **hack-a-round** formatting was attempted to fix broken indentation caused by problematic ASCII TAB characters. Think of this as a baseline for evaluating leading TAB characters within markdown files. TODO: Consider either using `expand(1)` to replace leading ASCII TAB characters with multiples of 8 ASCII SPACE characters AND/OR modifying the appropriate `bin` tool to convert leading ASCII TAB characters into multiples of 8 ASCII SPACE characters.
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:
- computes 3 digits of pi and prints it as an ASCII-art program that:
- computes 4 digits of pi and prints it as an ASCII-art program that:
- computes 5 digits of pi and prints it as an ASCII-art program that:
- computes 6 digits of pi and prints it as an ASCII-art program that:
- ...
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 (0 -- 9), 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.