This is a HUGE commit:
417 files changed, 874 insertions(+), 874 deletions(-)
As the IOCCC website now is https enabled I have updated the
'http://www.ioccc' to 'https://www.ioccc'.
There was also a typo in Makefiles where it said 'for VERY WELCOME' when
it should be 'are VERY WELCOME'.
Finally slashdot.org is also https enabled so references to
'http://slashdot' were changed to 'https://slashdot'.
This was done by my sgit tool (see https://github.com/xexyl/sgit)
like:
sgit -e 's,http://www.ioccc,https://www.ioccc,g' -e 's/for VERY WELCOME/are VERY WELCOME/g' -e .
but because I didn't have a list of files that should be modified I had
to be careful which files to commit as I had files that were changed but
not ready to be committed. Since I did it in steps, finding typos as I
went along, I actually ran sgit three times but to simplify the above
(and to show that it's possible to do more than one sed command) I made
it all as one. Since I did not have a list of files ahead of time I had
to determine what files to commit, first going through them like:
for j in $(for i in $(git status|grep modified|cut -d: -f2); do \
git grep 'https://www.ioccc' "$i"; done|cut -d: -f1|sort|uniq); \
do git diff "$j"; done|less -r
(I had to pipe through less because of a strange problem with the git
diff which appears to be because of a terminal problem maybe due to the
command above but it was all I could come up with in a very tired head.)
The above and
git status | grep modified:
showed that some C files had been modified which obviously should not be
done so I had to do:
git co '*c'
to undo those changes.
Finally to commit the correct files I did:
for i in $(git status|grep modified|cut -d: -f2); do \
git grep -E 'https://www.ioccc|https://slashdot|are VERY WELCOME' "$i"; \
done |cut -d: -f1|sort|uniq|xargs git commit -v
or so (with any formatting issues or typos here due to typos in the log
due to the terminal (in)sanity issue described).
Most useful obfuscation
Qiming Hou
hqm03ster@gmail.com
http://www.houqiming.net
To build:
make
To run:
./hou syntax-file file-to-process
Try:
less hou.c
./hou ansi.txt hou.c | less -r
./hou chk.txt hou.c | wc
./hou markdown.txt README.md > remarks.htm
View the remarks.htm file in your web browser.
The result is best viewed in a 80x25 console with ANSI colors.
Try (Windows):
copy header.htm hou.htm /y
hou html.txt hou.c >> hou.htm
start hou.htm
Judges' remarks:
What a versatile entry! It can be used to check the size of IOCCC entries and to publish them as HTML.
For extra credit: what is the meaning of the number 2321237?
Author's remarks:
Disclaimer
The reviewer may have already noticed that the 2nd page of this program is a dense blob, which is discouraged by the contest rules. We wish to point out that a majority of state-of-art programming editors support syntax highlighting, which should be enabled when reading this entry. Anticipating that the reviewer's preferred color setting may produce a suboptimal visual effect, a few syntax files is provided to highlight the source code under an author-provided setting, using the submitted program itself. Syntax highlighting would also visually improve the 3rd page.
The code may throw a few warnings due to formatting constraints. The author did try to remove warnings under gcc and Visual Studio, though.
The author does not own the original anime series where the embedded ASCII arts come from. For comparison, original non-ASCII art depictions of the relevant characters and objects can be found by googling the embedded text messages.
Syntax files
The syntax file consists of a number of rewriting rules. Each rule consists of a
regular expression, a space, a format string, and a newline. All text matching
the regular expression would be replaced by the format string. In case of a
conflict, rules appearing earlier would take precedence. One can refer to the
original text in the format string using %s. Other % characters in the
format string must be escaped with another %. The space character can be used
in the regular expression by escaping it with [] or "".
The following regular expression operators are supported:
() [] * + ? | ""
For example, one can use the following expression to match a certain declaration statement in hou.c:
"char"[ *]*[a-zA-Z_][0-9a-zA-Z_]*[ ]*((=[0-9a-zA-Z_ ]+)|(\[[0-9a-zA-Z_ ]*\]))?[ ]*(,[ *]*[a-zA-Z_][0-9a-zA-Z_]*[ ]*((=[0-9a-zA-Z_ ]+)|(\[[0-9a-zA-Z_ ]*\]))?[ ]*)*;
The regex engine is also algorithmically efficient. To illustrate the point, ansi.txt contains a pathological expression [2] that guarantees a hang for the competing Perl engine while matching itself. Try to compare these two engines:
./hou ansi.txt ansi.txt
perl patho.pl < ansi.txt
Limitations
Finally, there are a few limitations...
- The only escape sequence supported is
\nand it doesn't work in[]. - The maximum file/rule size is a linear function of the hard-coded constant
M. - Single-character matches at the end of file may be missed.
- The operator
|doesn't obey precedence rules and some extra()s may be required. - Incorrect syntax files are not tolerated.
- The program relies on ASCII.
Why obfuscated
The first layer of obfuscation comes from the challenge of embedding a large ASCII art in a dense blob. The entire art is composed using only keywords, strings and character constants. That results in a number of otherwise useless defines and quite a number of unconventionally written constants. While the preprocessor may remove the former, the later would remain regardless of beautification and preprocessing.
The second layer of obfuscation comes from the need to squeeze a reasonably powerful regex engine into the remaining area that isn't occupied by excessive keywords and useless constants. To achieve this, the regex compiler is written using the same threaded virtual machine [1] that parses the regex. Due to compiler limitations, the generated VM code also ends up obscured by a large amount of spaghetti branches and virtual thread creations. Finally, the VM in [1] is extended to track multiple expression matches for the actual formatting.
As an extra tweak, the text message actually does something useful. Remove the "Make a contract with me" catch line and the program would cease to function.
References
[1]Russ Cox, Regular Expression Matching: the Virtual Machine Approach
Copyright and CC BY-SA 4.0 License:
This file is Copyright (c) 2023 by Landon Curt Noll. All Rights Reserved. You are free to share and adapt this file under the terms of this license:
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
For more information, see: https://creativecommons.org/licenses/by-sa/4.0/