Author:
- Name: David Goodenough
Location: US - United States of America (United States)
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 #define
s 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
#define
s. 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()
#define
s 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.
Inventory for 1990/dg
Primary files
- dg.c - entry source code
- Makefile - entry Makefile
- dg.orig.c - original source code
- try.sh - script to try entry
Secondary files
- 1990_dg.tar.bz2 - download entry tarball
- README.md - markdown source for this web page
- .entry.json - entry summary and manifest in JSON
- .gitignore - list of files that should not be committed under git
- .path - directory path from top level directory
- index.html - this web page