Merge pull request #1586 from xexyl/hou2012
This commit is contained in:
4 files changed
+195
-13
No files matched your search
+13
-13
@@ -15,22 +15,17 @@ make
|
|||||||
### Try:
|
### Try:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
less hou.c
|
./try.sh
|
||||||
|
|
||||||
./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.
|
View the `remarks.htm` file in your web browser.
|
||||||
|
|
||||||
The result is best viewed in a 80x25 console with ANSI colors.
|
The result is best viewed in a 80x25 console with ANSI colors.
|
||||||
|
|
||||||
|
|
||||||
## Try (Windows):
|
## Try (Windows):
|
||||||
|
|
||||||
```sh
|
```
|
||||||
copy header.htm hou.htm /y
|
copy header.htm hou.htm /y
|
||||||
hou html.txt hou.c >> hou.htm
|
hou html.txt hou.c >> hou.htm
|
||||||
start hou.htm
|
start hou.htm
|
||||||
@@ -65,6 +60,7 @@ 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
|
come from. For comparison, original non-ASCII art depictions of the relevant
|
||||||
characters and objects can be found by googling the embedded text messages.
|
characters and objects can be found by googling the embedded text messages.
|
||||||
|
|
||||||
|
|
||||||
### Syntax files
|
### Syntax files
|
||||||
|
|
||||||
The syntax file consists of a number of rewriting rules. Each rule consists of a
|
The syntax file consists of a number of rewriting rules. Each rule consists of a
|
||||||
@@ -81,9 +77,10 @@ The following regular expression operators are supported:
|
|||||||
() [] * + ? | ""
|
() [] * + ? | ""
|
||||||
```
|
```
|
||||||
|
|
||||||
For example, one can use the following expression to match a certain declaration statement in hou.c:
|
For example, one can use the following expression to match a certain declaration
|
||||||
|
statement in [hou.c](hou.c):
|
||||||
|
|
||||||
```
|
```re
|
||||||
"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_ ]*\]))?[ ]*)*;
|
"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_ ]*\]))?[ ]*)*;
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -93,10 +90,11 @@ hang for the competing Perl engine while matching itself. Try to compare these
|
|||||||
two engines:
|
two engines:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./hou ansi.txt ansi.txt
|
./hou ansi.txt ansi.txt
|
||||||
perl patho.pl < ansi.txt
|
perl patho.pl < ansi.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Limitations
|
### Limitations
|
||||||
|
|
||||||
Finally, there are a few limitations...
|
Finally, there are a few limitations...
|
||||||
@@ -108,12 +106,13 @@ Finally, there are a few limitations...
|
|||||||
- Incorrect syntax files are not tolerated.
|
- Incorrect syntax files are not tolerated.
|
||||||
- The program relies on ASCII.
|
- The program relies on ASCII.
|
||||||
|
|
||||||
|
|
||||||
### Why obfuscated
|
### Why obfuscated
|
||||||
|
|
||||||
The first layer of obfuscation comes from the challenge of embedding a large
|
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,
|
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
|
strings and character constants. That results in a number of otherwise useless
|
||||||
defines and quite a number of unconventionally written constants. While the
|
`#define`s and quite a number of unconventionally written constants. While the
|
||||||
preprocessor may remove the former, the later would remain regardless of
|
preprocessor may remove the former, the later would remain regardless of
|
||||||
beautification and preprocessing.
|
beautification and preprocessing.
|
||||||
|
|
||||||
@@ -128,6 +127,7 @@ amount of spaghetti branches and virtual thread creations. Finally, the VM in
|
|||||||
As an extra tweak, the text message actually does something useful. Remove the
|
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.
|
"Make a contract with me" catch line and the program would cease to function.
|
||||||
|
|
||||||
|
|
||||||
### References
|
### References
|
||||||
|
|
||||||
[1][Russ Cox, Regular Expression Matching: the Virtual Machine Approach](http://swtch.com/~rsc/regexp/regexp2.html)
|
[1][Russ Cox, Regular Expression Matching: the Virtual Machine Approach](http://swtch.com/~rsc/regexp/regexp2.html)
|
||||||
|
|||||||
@@ -0,0 +1,134 @@
|
|||||||
|
# Most useful obfuscation
|
||||||
|
|
||||||
|
Qiming Hou
|
||||||
|
<hqm03ster@gmail.com>
|
||||||
|
<http://www.houqiming.net>
|
||||||
|
|
||||||
|
|
||||||
|
## Judges' comments:
|
||||||
|
|
||||||
|
### To build:
|
||||||
|
|
||||||
|
make hou
|
||||||
|
|
||||||
|
### To run:
|
||||||
|
|
||||||
|
./hou syntax-file file-to-process
|
||||||
|
|
||||||
|
### Try (Unix):
|
||||||
|
|
||||||
|
The results are best viewed in a 80x25 console with ANSI colors.
|
||||||
|
|
||||||
|
less hou.c
|
||||||
|
|
||||||
|
./hou ansi.txt hou.c | less -r
|
||||||
|
|
||||||
|
./hou chk.txt hou.c | wc
|
||||||
|
|
||||||
|
./hou markdown.txt remarks.markdown > remarks.htm
|
||||||
|
your-browser remarks.htm
|
||||||
|
|
||||||
|
### Try (Windows):
|
||||||
|
|
||||||
|
copy header.htm hou.htm /y
|
||||||
|
hou html.txt hou.c >> hou.htm
|
||||||
|
start hou.htm
|
||||||
|
|
||||||
|
### Selected 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 comments:
|
||||||
|
|
||||||
|
### 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 are 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
|
||||||
|
|
||||||
|
Finally, there are a few limitations...
|
||||||
|
|
||||||
|
|
||||||
|
- The only escape sequence supported is \n and 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](http://swtch.com/~rsc/regexp/regexp2.html)
|
||||||
|
|
||||||
|
[2] [Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...)](http://swtch.com/~rsc/regexp/regexp1.html)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
<!--
|
||||||
|
(c) Copyright 1984-2015, [Leo Broukhis, Simon Cooper, Landon Curt Noll][judges] - All rights reserved
|
||||||
|
This work is licensed under a [Creative Commons Attribution-ShareAlike 3.0 Unported License][cc].
|
||||||
|
|
||||||
|
[judges]: http://www.ioccc.org/judges.html
|
||||||
|
[cc]: http://creativecommons.org/licenses/by-sa/3.0/
|
||||||
|
-->
|
||||||
Executable
+39
@@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# try.sh - demonstrate IOCCC winner 2012/hou
|
||||||
|
#
|
||||||
|
|
||||||
|
# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
|
||||||
|
# this way allows us to have the user specify a different compiler in an easy
|
||||||
|
# way.
|
||||||
|
if [[ -z "$CC" ]]; then
|
||||||
|
CC="cc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
make CC="$CC" all >/dev/null || exit 1
|
||||||
|
|
||||||
|
# clear screen after compilation so that only the entry is shown
|
||||||
|
clear
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: less hou.c (space = next page, q = quit): "
|
||||||
|
echo 1>&2
|
||||||
|
less -X hou.c
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: ./hou ansi.txt hou.c | less -r (space = next page, q = quit): "
|
||||||
|
echo 1>&2
|
||||||
|
echo "$ ./hou ansi.txt hou.c | less -r"
|
||||||
|
./hou ansi.txt hou.c | less -r
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to check size of hou.c: "
|
||||||
|
echo 1>&2
|
||||||
|
echo "$ ./hou chk.txt hou.c | wc" 1>&2
|
||||||
|
./hou chk.txt hou.c | wc
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: ./hou markdown.txt hint.md > remarks.htm: "
|
||||||
|
echo 1>&2
|
||||||
|
./hou markdown.txt hint.md > remarks.htm
|
||||||
|
echo 1>&2
|
||||||
|
echo "Now open remarks.htm in your web browser of choice."
|
||||||
@@ -3344,6 +3344,15 @@ Cody fixed a typo in the ruby script
|
|||||||
Cody restored the original code from the archive.
|
Cody restored the original code from the archive.
|
||||||
|
|
||||||
|
|
||||||
|
## [2012/hou](2012/hou/hou.c) ([README.md](2012/hou/README.md]))
|
||||||
|
|
||||||
|
Cody added the [try.sh](2012/hou/try.sh) script and restored the original [hint
|
||||||
|
markdown file](2012/hou/hint.md) as the changes made when converting to a GitHub
|
||||||
|
README.md made the generated html not look correct; it did not have a title, a
|
||||||
|
stylesheet etc. due to the fact that there is no `#` header (which specified
|
||||||
|
title and stylesheet) and other formatting changes.
|
||||||
|
|
||||||
|
|
||||||
## [2012/kang](2012/kang/kang.c) ([README.md](2012/kang/README.md]))
|
## [2012/kang](2012/kang/kang.c) ([README.md](2012/kang/README.md]))
|
||||||
|
|
||||||
Cody added alt code that fixes a problem where in German 'v' sounds like 'f'
|
Cody added alt code that fixes a problem where in German 'v' sounds like 'f'
|
||||||
|
|||||||
Reference in new issue
Block a user