Prepare for the winners of **IOCCC28**. > However these are not the 2024 droids you are looking for. :-) The HTML menu (both JavaScript and non-JavaScript) has been updated. The `Status -> Rules and guidelines' have been replaced with two separate menus `Status -> IOCCC rules` and `Status -> IOCCC guidelines`. Added a new top level `social.html` page: built from a new `social.md`. Sorted rules for building specific web pages in the top level `Makefile`. Added `make social` to make the `social.html` page from `social.md`. The `bin/gen-top-html.sh` now is able to process a argument of **social** to process the new top level `social.html` page. Changed `bin/gen-top-html.sh` VERSION from "2.0.0 2025-03-13" to "2.0.1 2025-07-25". Below `About -> Home page` a new `About -> IOCCC social media` menu item as added. Because the menu change touched every HTML file, we changed the general copyright date range for HTML files from "1984-2024" to "1984-2025" due to the extensive changes made for **IOCCC28**. Those markdown files that were modified in 2025 had their copyright date range also changed from "1984-2024" to "1984-2025". Rebuilt tarballs and sitemap due to the extensive HTML rebuilding. Ran `make update` to perform the above.
To build:
make all
To use:
echo foo bar | ./dg
Try:
./try.sh
Judges' remarks:
Some C preprocessors got confused about single quotes in certain cases. In particular, the following source line:
b12(ase(bco(acp(bi(acp(bcp(acp(bpl(aqu(bqu(A))))))))))))))))))))))))))))))
sometimes has to be changed to:
b12(ase(bco(acp(bi(acp(bcp(acp(bpl('A'))))))))))))))))))))))))))))
particularly if the C preprocessor botches single quotes in cpp expansions, which we have done for the wider audience.
Author's remarks:
If my preprocessor could hack it, I could write this as one single line rather than 4, but when I do that I get a complaint "defines nested too deeply".
NOTICE to those who wish for a greater challenge:
If you want a greater challenge, don't read any further: just try to understand the program via the source.
If you get stuck, come back and read below for additional hints and information.
How this entry works:
This is another rot13 job (believe it or not) - the #defines are a
novel way of adding tokens: #define b12(x) 12 x means that at
some point in the source a 12 is followed by the compressed nested
#defines. The b12 gets the previous compression as an argument, and
prepends the 12, thus making another step in the recreation of the
source. The axx() #defines do the same, but add tokens after.
As for the rot13 algorithm, it relies on index(3) to find if the
character is in the set A-Za-z. l[] is an array that gets filled
with:
"nopqrstuvwxyzzzzabcdefghijklmmmmNOPQRSTUVWXYZZZZABCDEFGHIJKLMMMM"
If index(3) says the char is in the alphabet, then XOR the offset
with 16 to translate, and output, otherwise pass it unchanged.