737 lines
32 KiB
Plaintext
737 lines
32 KiB
Plaintext
21st International Obfuscated C Code Contest Official Guidelines, Hints and Comments
|
|
|
|
Copyright (C) 2006-2012 Leonid A. Broukhis, Simon Cooper, Landon Curt Noll.
|
|
|
|
All Rights Reserved. Permission for personal, education or non-profit use is
|
|
granted provided this this copyright and notice are included in its entirety
|
|
and remains unaltered. All other uses must receive prior permission in
|
|
writing from the contest judges.
|
|
|
|
|
|
This guideline file is version 2012-08-15.
|
|
|
|
|
|
ABOUT THIS FILE:
|
|
|
|
This file contains guidelines intended to help people who wish to
|
|
submit entries to the International Obfuscated C Code Contest (IOCCC
|
|
for short).
|
|
|
|
This is not the IOCCC rules, though it does contain comments about
|
|
them. The guidelines should be viewed as hints and suggestions.
|
|
Entries that violate the guidelines but remain within the rules are
|
|
allowed. Even so, you are safer if you remain within the guidelines.
|
|
|
|
You should read the current IOCCC rules, prior to submitting entries.
|
|
The rules are typically sent out with these guidelines.
|
|
|
|
| We recommend that you follow the twitter handle:
|
|
|
|
|
| @IOCCC
|
|
|
|
|
| to learn about IOCCC news, important IOCCC related alerts, IOCCC
|
|
| reminders, and changes to the rules and these guidelines. While we
|
|
| try to post use news at:
|
|
|
|
|
| https://www.ioccc.org/index.html#news
|
|
|
|
|
| such postings may be delayed or obscured by slow to respond mirrors.
|
|
|
|
|
| Hint to non-twitter users. You do not have to be a twitter user
|
|
| to follow the postings of the @IOCCC handle. Simple visit the URL:
|
|
|
|
|
| https://twitter.com/ioccc
|
|
|
|
|
| and reload that page every once in a while.
|
|
|
|
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
An important 2023 update to this historic note:
|
|
|
|
The IOCCC no longer uses twitter. Today the IOCCC uses Mastodon.
|
|
For more information and to see our IOCCC Mastodon posts, see:
|
|
|
|
https://fosstodon.org/@ioccc
|
|
|
|
End of important 2023 update to this historic note.
|
|
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
|
|
| WHAT'S NEW IN 2012:
|
|
|
|
| The contest runs from 2012-Aug-15 3:14:15 UTC to 2012-Sep-14 9:26:53 UTC.
|
|
|
|
Only online submissions will be accepted this year.
|
|
See the following for details,
|
|
|
|
https://submit.ioccc.org/
|
|
|
|
| (The above URL will be active by 2012-Aug-15)
|
|
|
|
| Most of the changes in the rules and guidelines for this year have been
|
|
| marked with a "|" character on the left hand side.
|
|
|
|
|
|
HINTS AND SUGGESTIONS:
|
|
|
|
You are encouraged to examine the winners of previous contests. See
|
|
FOR MORE INFORMATION for details on how to get previous winners.
|
|
|
|
Keep in mind that rules change from year to year, so some winning entries
|
|
may not be valid entries this year. What was unique and novel one year
|
|
might be 'old' the next year.
|
|
|
|
An entry is usually examined in a number of ways. We typically apply
|
|
a number of tests to an entry:
|
|
|
|
* look at the original source
|
|
* convert ANSI trigraphs to ASCII
|
|
* C pre-process the source ignoring '#include' lines
|
|
* C pre-process the source ignoring '#define' and '#include' lines
|
|
* run it through a C beautifier
|
|
* examine the algorithm
|
|
* compile it (with flags to enable all warnings)
|
|
* execute it
|
|
|
|
You should consider how your entry looks in each of the above tests.
|
|
You should ask yourself if your entry remains obscure after it has been
|
|
'cleaned up' by the C pre-processor and a C beautifier.
|
|
|
|
Your entry need not pass all of the above tests. In certain
|
|
cases, a test is not important. Entries that compete for the
|
|
'strangest/most creative source layout' need not do as well as
|
|
others in terms of their algorithm. On the other hand, given
|
|
two such entries, we are more inclined to pick the entry that
|
|
does something interesting when you run it.
|
|
|
|
We try to avoid limiting creativity in our rules. As such, we leave
|
|
the contest open for creative rule interpretation. As in real life
|
|
programming, interpreting a requirements document or a customer request
|
|
is important. For this reason, we often award 'worst abuse of the
|
|
rules' to an entry that illustrates this point in an ironic way.
|
|
|
|
We do realize that there are holes in the rules, and invite entries
|
|
to attempt to exploit them. We will award 'worst abuse of the rules'
|
|
and then plug the hole next year. Even so, we will attempt to use
|
|
the smallest plug needed, if not smaller. :-)
|
|
|
|
| There are 17 reasons why these guidelines are obfuscated.
|
|
|
|
Check out your program and be sure that it works. We sometimes make
|
|
the effort to debug an entry that has a slight problem, particularly
|
|
in or near the final round. On the other hand, we have seen some
|
|
of the best entries fall down because they didn't work.
|
|
|
|
We tend to look down on a prime number printer that claims that
|
|
16 is a prime number. If you do have a bug, you are better off
|
|
documenting it. Noting "this entry sometimes prints the 4th power
|
|
of a prime by mistake" would save the above entry. And sometimes,
|
|
a strange bug/feature can even help the entry! Of course, a correctly
|
|
working entry is best. Clever people will note that 16 might be prime
|
|
| under certain conditions. Wise people, when submitting something clever
|
|
| will fully explain such cleverness in their entry's remarks file.
|
|
|
|
People who are considering to just use some complex mathematical
|
|
function or state machine to spell out something such as "hello,
|
|
| world!" really really, and we do mean really, do need to be more creative.
|
|
|
|
| Ultra-obfuscated programs are, in some cases, easier to
|
|
deobfuscate than subtly-obfuscated programs. Consider using
|
|
misleading or subtle tricks layered on top of or under an
|
|
| appropriate level of obfuscation. A clean looking program with
|
|
| misleading comments and variable names might be a good start.
|
|
|
|
Programs that use VTxxx/ANSI sequences that are NOT limited to a
|
|
specific terminal brand and that can also work in a standard xterm
|
|
are considered more portable.
|
|
|
|
|
|
OUR LIKES AND DISLIKES:
|
|
|
|
Doing masses of #defines to obscure the source has become 'old'. We
|
|
tend to 'see thru' masses of #defines due to our pre-processor tests
|
|
that we apply. Simply abusing #defines or -Dfoo=bar won't go as far
|
|
as a program that is more well rounded in confusion.
|
|
|
|
Many C compilers dislike the following code, and so do we:
|
|
|
|
#define d define
|
|
#d foo <-- don't expect this to turn into #define foo
|
|
|
|
When declaring local or global variables, you should declare the type:
|
|
|
|
int this_is_ok;
|
|
this_is_not; <-- don't use such implicit type declarations
|
|
|
|
| We suggest that you compile your entry with an ISO/IEC 9899-1999
|
|
| ("ISO C99") C compiler or at least an ANSI C compiler.
|
|
|
|
| DO NOT assume that we will use gcc to compile your program.
|
|
| We will first try to compile your program using Clang.
|
|
|
|
| It is much better to not use any given obscure compiler flags if
|
|
| you can help it. We want to discourage the use of obscure compiler
|
|
| flags that would make the program less portable.
|
|
|
|
| One side effect of the above is that you cannot assume the use
|
|
| of nested functions such as:
|
|
|
|
main() {
|
|
| void do_not_do_this() { printf("blah\n"); }
|
|
| do_not_do_this();
|
|
}
|
|
|
|
| This is because such nested functions often requires one to compile with
|
|
| a flag such as -fnested-functions that is not found on some compilers.
|
|
|
|
| On 2012 July 20, the judges rescinded the encouragement of
|
|
| nested functions. Such constructions, while interesting and sometimes
|
|
| amusing, will have to wait until they required by a C standard that are
|
|
| actually implemented in commonly used C compilers. Sorry!
|
|
|
|
If your entry uses functions that have a variable number of
|
|
arguments, be careful. Systems implement va_list as a wide variety
|
|
of ways. Because of this, a number of operations using va_list are
|
|
not portable and must not be used:
|
|
|
|
* assigning a non-va_list variable to/from a va_list variable
|
|
* casting a non-va_list variable into/from a va_list variable
|
|
* passing a va_list variable to a function expecting a non-va_list arg
|
|
* passing a non-va_list variable to a function expecting a va_list arg
|
|
* performing arithmetic on va_list variables
|
|
* using va_list as a structure or union
|
|
|
|
In particular, do not treat va_list variables as if they were a char **'s.
|
|
|
|
Avoid using <varargs.h>. Use <stdarg.h> instead.
|
|
|
|
On 28 January 2007, the Judges rescinded the requirement that the
|
|
'#" in a C preprocessor directive must be the first non-whitespace character.
|
|
|
|
The exit() function returns void. On some broken systems have exit()
|
|
return int. Your entry should assume that exit() returns a void.
|
|
|
|
Small programs are best when they are short, obscure and concise.
|
|
While such programs are not as complex as other winners, they do
|
|
serve a useful purpose. They are often the only program that people
|
|
attempt to completely understand. For this reason, we look for
|
|
programs that are compact, and are instructional.
|
|
|
|
One line programs should be short one line programs, say around 80
|
|
bytes long. Getting close to 160 bytes is a bit too long in our opinion.
|
|
|
|
We tend to dislike programs that:
|
|
|
|
* are very hardware specific
|
|
* are very OS version specific
|
|
(index/strchr differences are ok, but socket/streams specific
|
|
code is likely not to be)
|
|
* dump core or have compiler warnings
|
|
(it is ok only if you warn us in the 'remark' header item)
|
|
* won't compile or run under a POSIX P1003.1/P1003.2 like systems
|
|
* depend on a utility or application not normally found on most
|
|
most POSIX P1003.1/P1003.2 like systems
|
|
* abuse the build file to get around the size limit
|
|
* obfuscate by excessive use of ANSI trigraphs
|
|
* are longer than they need to be
|
|
* are similar to previous winners
|
|
* are identical to previous losers :-)
|
|
|
|
Unless you are cramped for space, or unless you are entering the
|
|
'best one liner' category, we suggest that you format your program
|
|
in a more creative way than simply forming excessively long lines.
|
|
|
|
| At least one judge prefers to maintain the use of the leap-second
|
|
| as part of the world's time standard.
|
|
|
|
| The "how to build" make process should not be used to try and get
|
|
| around the size limit. It is one thing to make use of a several -D's
|
|
| on the compile like to help out, but it is quite another to use many
|
|
| bytes of -D's in order to try and squeeze the source under the size limit.
|
|
|
|
You should try to restrict commands used on the build file to
|
|
POSIX-like or common Unix-like commands. You can also compile
|
|
and use your own programs. If you do, try to build and execute
|
|
from the current directory. This restriction is not a hard and
|
|
absolute one. The intent is to ensure that the building if your
|
|
program is reasonably portable.
|
|
|
|
Don't forget that the building of your program should be done
|
|
***without human intervention***. So don't do:
|
|
|
|
| prog: prog.c
|
|
| #echo this line assumes input from standard input
|
|
cat > prog.c
|
|
| ${CC} prog.c -o prog
|
|
|
|
However, you can do something cute such as making your program
|
|
do something dumb (or cute) when build 'automatically'. However
|
|
when it is run with a human involved, do something more clever.
|
|
For example, one could use the build instructions:
|
|
|
|
| prog: prog.c
|
|
| ${CC} prog.c -DNON_HUMAN_COMPILE -o prog
|
|
@echo "See remarks section about alternate ways to compile"
|
|
|
|
and then include special notes in the program "remarks" for
|
|
alternate / human intervention based building.
|
|
|
|
We want to get away from source that is simply a compact blob of
|
|
characters. To help, we give a break to source that contains
|
|
whitespace, and in certain cases ; { or } characters. While the
|
|
number of characters excluding whitespace (tab, space, newline),
|
|
and excluding any ; { or } followed immediately by either whitespace
|
|
or end of file, must be <= 2048, the total size may be less than 4096
|
|
bytes. This means that one may use "free of charge" up to 2048
|
|
bytes of whitespace, or ; { or } followed by either whitespace
|
|
or end of file.
|
|
|
|
Please do not use things like gzip to get around the size limit.
|
|
| Be more creative.
|
|
|
|
| We really dislike entries that make blatant use of including
|
|
| large data files to get around the source code size limit.
|
|
|
|
| Did we remember to indicate that programs that blatantly use
|
|
| some complex state machine to do something simple are boring?
|
|
| We think we did. :-)
|
|
|
|
Given two versions of the same program, one that is a compact blob
|
|
of code, and the other that is formatted more like a typical C
|
|
program, we tend to favor the second version. Of course, a third
|
|
version of the same program that is formatted in an interesting
|
|
and/or obfuscated way, would definitely win over the first two!
|
|
|
|
We suggest that you avoid trying for the 'smallest self-replicating'
|
|
source. The smallest, a zero byte entry, won in 1994.
|
|
|
|
We do not like writable strings. That is, we don't want stuff like:
|
|
|
|
char *T = "So many primes, so little time!";
|
|
...
|
|
T[14] = ';';
|
|
|
|
Please don't make use of this feature, even if your system allows it.
|
|
However, initialized char arrays are OK to write over. This is OK:
|
|
|
|
char b[] = "Is this Ok";
|
|
b[9] = 'K';
|
|
|
|
X client entries should be as portable as possible. Entries that
|
|
adapt to a wide collection of environments will be favored. For
|
|
| example, don't depend on a particular type or size of display.
|
|
| Don't assume the use of a particular browser. Instead assume a
|
|
| generic browser that forms to a widely used W3C standard.
|
|
| Don't assume a particular sound sub-system or video driver is installed
|
|
| in the OS. Instead, make use of a well known and widely available open
|
|
| source program (one that actually works) to display audio/visual data.
|
|
|
|
X client entries should avoid using X related libraries and
|
|
software that is not in wide spread use.
|
|
|
|
| We don't like entries that use proprietary toolkits such as the M*tif,
|
|
| Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use of an
|
|
| open source toolkit that is widely and freely available instead.
|
|
|
|
You should avoid depending on a particular window manager.
|
|
|
|
X client entries should not to depend on particular items on
|
|
.Xdefaults. If you must do so, be sure to note the required lines
|
|
in the program "remarks".
|
|
|
|
| Try to avoid entries that play silent sound segments or play the
|
|
| Happy Birthday song some people believe is copyrighted even if such
|
|
| copyrights appear to be bogus and blatant abuses of the copyright system.
|
|
|
|
While we recognize that UNIX is not a universal operating system, the
|
|
contest does have a bias towards such systems. In an effort to expand
|
|
the scope of the contest, we phrase our bias in terms of POSIX P1003.1
|
|
and P1003.2 standards. This will allow certain non-UNIX OS users to
|
|
submit entries. On the other hand, this is a guideline and not a rule.
|
|
We will not reject an entry based on some POSIX technicality.
|
|
|
|
When dealing with OS and application environments, we suggest that you
|
|
be reasonable with a nod towards vanilla UNIX-like systems. POSIX will
|
|
| evolve but not as much as the contest.
|
|
|
|
You might not be prohibited from failing to not partly misunderstand
|
|
| this particular guideline. You are not required to determine that this
|
|
| or the previous sentence is false and misleading: but it might not hurt
|
|
| to not consider to fail to try to do so.
|
|
|
|
We like programs that:
|
|
|
|
* are as concise and small as they need to be
|
|
* do something at least quasi-interesting
|
|
* are portable
|
|
* are unique or novel in their obfuscation style
|
|
* MAKE USE OF A NUMBER OF DIFFERENT TYPES OF OBFUSCATION <== HINT!!
|
|
| * make us laugh and/or throw up :-) (humor really helps!)
|
|
|
|
| Some types of programs can't excel (anti-tm) in some areas. Your
|
|
program doesn't have to excel in all areas, but doing well in several
|
|
areas really does help.
|
|
|
|
You are better off explaining what your entry does in the program
|
|
"remarks" section rather than leaving it obscure for the judges
|
|
as we might miss something and/or be too tired to notice.
|
|
|
|
| Avoid this specific individual, individual guideline, if you can.
|
|
|
|
We freely admit that interesting, creative or humorous comments in
|
|
the program "remarks" help your chances of winning. If you had to
|
|
read so many twisted entries, you too would enjoy a good laugh or two.
|
|
We think the readers of the contest winners do as well. We do read
|
|
the program "remarks" during the judging process, so it is worth your
|
|
while to write remarkable program "remarks".
|
|
|
|
We dislike C code with trailing control-M's (\r or \015) that results
|
|
in compilation failures. Some non-Unix/non-Linux tools such as
|
|
MS Visual C and MS Visual C++ leave trailing control-M's on lines.
|
|
Users of such tools should strip off such control-M's before submitting
|
|
their entries. In some cases tools have a "Save As" option that will
|
|
prevent such trailing control-M's being added.
|
|
|
|
We dislike entries that depend on non-portable libcurses features such
|
|
as halfdelay(). One should restrict libcurses to portable features
|
|
found on BSD or Linux curses.
|
|
|
|
The rules disallow source that contains unescaped octets with values
|
|
between 128 and 255. You must use \octal or \hex escapes instead:
|
|
|
|
/* 123456789 123456789 123456789 123456 */
|
|
char *foo = "This string is 36 octets in length \263";
|
|
/* This octet requires 4 octets of source ^^^^ */
|
|
if (strlen(foo) == 36) printf("foo is 36 octets plus a final NUL\n");
|
|
| else printf("This code should not print this message\n");
|
|
|
|
It is a very good idea to, in your remarks file, tell us why you
|
|
think your entry is obfuscated. This is particularly true if
|
|
your entry is has some very subtle obfuscations that we might
|
|
| otherwise overlook. <<-- Hint!
|
|
|
|
Anyone can format their code into a dense blob. A really clever
|
|
author will try format their entry using a "normal" formatting style
|
|
such that at first glance (if you squint and don't look at the details)
|
|
the code might pass for non-obfuscated C. Deceptive comments,
|
|
and mis-leading formatting, in some cases, may be a plus. On the
|
|
other hand, a misleading code style requires more source bytes.
|
|
|
|
If you do elect to use misleading formatting and comments, we
|
|
suggest you remark on this point in your remarks where you talk
|
|
about why you think your entry is obfuscated. On the other hand,
|
|
if you are pushing up against the size limits, you may be forced
|
|
into creating a dense blob. Such are the trade offs that obfuscators face!
|
|
|
|
| We prefer code that can run on either a 64-bit or 32-bit
|
|
| processor. However, it is unwise to assume it will be an i386 or x86
|
|
| architecture.
|
|
|
|
| While programs that only run in a specific bit width are okay, if you have
|
|
| to pick a width, pick 64-bit.
|
|
|
|
| If we are feeling ornery we might choose to compile your program
|
|
| for running on an Arduino or a PDP-11. Heck, should we ever find
|
|
| an emulator of 60-bit CDC Cyber CPU running a POSIX-like OS, we
|
|
| might just try your entry on that emulator as well| :-)
|
|
|
|
| If your entry MUST run only in 32-bit mode on an Intel processor, add the
|
|
| following compiler flag:
|
|
|
|
|
| -arch i386
|
|
|
|
|
| to your "how to build" make compile line. For example:
|
|
|
|
|
| prog: prog.c
|
|
| ${CC} prog.c -arch i386 -o prog
|
|
|
|
| Be even more creative!
|
|
|
|
|
|
ABUSING THE RULES:
|
|
|
|
Legal abuse of the rules is somewhat encouraged. Legal rule abuse may
|
|
involve, but is not limited to, doing things that are technically
|
|
allowed by the rules and yet do not fit the spirit of what we intended
|
|
to be submitted.
|
|
|
|
Legal rule abuse is encouraged to help promote creativity. Rule abuse
|
|
entries, regardless of if they receive an award, result in changes to
|
|
the next year's rules and guidelines.
|
|
|
|
Legal abuse of the rules is NOT an invitation to violate the rules.
|
|
An entry that violates the rules in the opinion of the judges, WILL be
|
|
disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you
|
|
have an entry that might otherwise be interesting, you might want to
|
|
submit two versions; one that does not abuse the rules and one that
|
|
does.
|
|
|
|
If you intend to abuse the rules, indicate so in the program
|
|
"remarks". You must try to justify why you consider your rule abuse
|
|
to be allowed under the rules. That is, you must plead your case as
|
|
to why your entry is valid. Humor and/or creativity help plead a
|
|
case.
|
|
|
|
Abusing the web submission procedure tends to annoy us more
|
|
than amuse us. Spend your creative energy on content of your
|
|
entry rather than on the submission process itself.
|
|
|
|
We are often asked why the contest rules and guidelines seem too
|
|
strange or contain mistakes, flaws or grammatical errors. One reason
|
|
is that we sometimes make genuine mistakes. But in many cases such
|
|
problems, flaws or areas of confusion are deliberate. Changes to
|
|
rules and guidelines in response to rule abuses, are done in a minimal
|
|
fashion. Often we will deliberately leave behind holes (or introduce
|
|
| new ones) so that future rule abuse may continue. A cleaver author
|
|
| should be able to read them and "drive a truck through the holes" in
|
|
| the rules and guidelines.
|
|
|
|
At the risk of stating the obvious, this contest is a parody of the
|
|
software development process. The rules and guidelines are only a
|
|
small part of the overall contest. Even so, one may think the contest
|
|
rules and guideline process as a parody of the sometimes tragic
|
|
mismatch between what a customer (or marketing) wants and what
|
|
| engineering delivers. Real programmers must face obfuscated
|
|
| and sometimes conflicting specifications and requirements from marketing,
|
|
| sales, product management an even from customers themselves on a
|
|
| all to regular basis. This is one of the reasons why the rules and
|
|
| guidelines are written in obfuscated form.
|
|
|
|
|
|
JUDGING PROCESS:
|
|
|
|
Entries are judged by Leonid A. Broukhis, Simon Cooper, Landon Curt Noll.
|
|
|
|
Each entry submitted is given an id number and subdirectory. The
|
|
| entry files including, but not limited to prog.c, Makefile (that we
|
|
| form from around your "how to build" information), as well as any
|
|
| data files that you submit are all places under their own directory.
|
|
| stored and judged from this directory.
|
|
|
|
| Any information about the authors is not read bu the judges until
|
|
the judging process is complete, and then only from entries that have
|
|
won an award.
|
|
|
|
| Because we do not read this information for entries that do not win,
|
|
| do not know who did not win.
|
|
|
|
The above process helps keep us biased for/against any one particular
|
|
individual. Therefore you MUST refrain from putting any information
|
|
| that reveals your identity in your entry.
|
|
|
|
| Now some people point out that coding style might reveal the information
|
|
| about the others. However we consider this to be simply circumstantial
|
|
| and outside the scope of the above paragraph.
|
|
|
|
| Some people, in the past, have attempted to obfuscate their identity by
|
|
| including comments of famous Internet personalities such as Peter Honeyman
|
|
| (http://www.citi.umich.edu/u/honey/). The judges are on to this
|
|
| trick and therefore consider any obfuscated source or data file
|
|
| claiming to be from Honeyman to not be form Honeyman. This of course
|
|
| creates an interesting paradox known as the "obfuscated Peter Honeyman
|
|
| paradox". Should Peter Honeyman actually submit an obfuscated entry,
|
|
| he alone is excluded from above mentioned refrain as we believe
|
|
| it just another attempt at confusion. This guideline is known
|
|
| as the "Peter Honeyman is exempt" guideline.
|
|
|
|
| BTW: None of the entries claiming to be from Peter Honeyman have ever
|
|
| won an award. So it is theoretically possible that Peter Honeyman
|
|
| did submit an entry in the past. In the past, Peter had denied
|
|
| submitting anything to the IOCCC. Perhaps those entries were
|
|
| submitted by one of his students?
|
|
|
|
| We seemed to have digressed here ... :-) Returning to the judging process:
|
|
|
|
| We prefer to be kept in the dark as much as you are until the final
|
|
| awards are given. We enjoy the surprise of finding out in the end,
|
|
| who won and where they were from.
|
|
|
|
We attempt to keep all entries anonymous, unless they win an award.
|
|
Because the main 'prize' of winning is being announced, we make all
|
|
attempts to send non-winners into oblivion. We remove all non-winning
|
|
files, and shred all related paper. By tradition, we do not even
|
|
| reveal the number of entries that we received.
|
|
|
|
After the initial announcement, we attempt to send an email to the
|
|
authors of the winning entries. One reason we do this is to give
|
|
the authors a chance to comment on the way we have presented their
|
|
entry. They are given the chance to correct mistakes and typos. We
|
|
often accept their suggestions/comments about our remarks as well.
|
|
This is done prior to posting the winners to the wide world.
|
|
|
|
Judging consists of a number of elimination rounds. During a round,
|
|
the collection of entries are divided into two roughly equal piles;
|
|
the pile that advances on to the next round, and the pile that does
|
|
not. We also re-examine the entries that were eliminated in the
|
|
previous round. Thus, an entry gets at least two readings.
|
|
|
|
A reading consists of a number of actions:
|
|
|
|
| * reading the "how to build" information and forming a Makefile
|
|
| * reading prog.c, the C source
|
|
| * reviewing the "remarks" information
|
|
| * briefly looking any any supplied data files
|
|
* passing the source thru the C pre-processor
|
|
skipping over any #include files
|
|
* performing a number of C beautify/cleanup edits on the source
|
|
* passing the beautified source thru the C pre-processor
|
|
skipping over any #include files
|
|
| * compiling/building the source
|
|
| * running the program
|
|
| * Doing other things that only IOCCC judges know about :-)
|
|
|
|
In later rounds, other actions are performed including performing
|
|
miscellaneous tests on the source and binary.
|
|
|
|
Until we reduce the stack of entries down to about 25 entries, entries
|
|
are judged on an individual basis. An entry is set aside because it
|
|
does not, in our opinion, meet the standard established by the round.
|
|
When the number of entries thins to about 25 entries, we begin to form
|
|
award categories. Entries begin to compete with each other for awards.
|
|
An entry will often compete in several categories.
|
|
|
|
The actual award category list will vary depending on the types of entries
|
|
we receive. A typical category list might be:
|
|
|
|
* best small one line program
|
|
* best small program
|
|
* strangest/most creative source layout
|
|
* most useful obfuscated program
|
|
* best game that is obfuscated
|
|
* most creatively obfuscated program
|
|
| * most deceptive C code (code with deceptive comments and source code)
|
|
* best X client (see OUR LIKES AND DISLIKES)
|
|
* best abuse of ISO/IEC 9899-1999 ("ISO C99") C or ANSI C
|
|
| * best abuse of the C preprocessor
|
|
* worst abuse of the rules
|
|
* (anything else so strange that it deserves an award)
|
|
|
|
We do not limit ourselves to this list. For example, a few entries are so
|
|
good/bad that they are declared winners at the start of the final round.
|
|
We will invent awards categories for them, if necessary.
|
|
|
|
In the final round process, we perform the difficult tasks of
|
|
reducing the remaining entries (typically about 25) down to 8 or 10
|
|
winners. Often we are confident that the entries that make it into
|
|
the final round are definitely better than the ones that do not
|
|
make it. The selection of the winners out of the final round, is
|
|
less clear cut.
|
|
|
|
Sometimes a final round entry is good enough to win, but is beat out
|
|
by a similar, but slightly better entry. For this reason, it is
|
|
sometimes worthwhile to re-enter an improved version of an entry
|
|
that failed to win in a previous year. This assumes, of course,
|
|
that the entry is worth improving in the first place!
|
|
|
|
| More than one IOCCC judge has been known to bribe another IOCCC judge
|
|
| into voting for a winning entry by offering a bit high quality chocolate.
|
|
| This technique is highly discouraged for use by non-IOCCC judges.
|
|
|
|
More often than not, we select a small entry (usually one line), a
|
|
strange/creative layout entry. We sometimes also select an
|
|
| entry that abuses the contest guidelines in an interesting way,
|
|
| or that stretches the content rules that while legal, is
|
|
| nevertheless goes against the intent of the rules.
|
|
|
|
In the end, we traditionally pick one entry as 'best'. Sometimes such
|
|
an entry simply far exceeds any of the other entries. More often, the
|
|
'best' is picked because it does well in a number of categories.
|
|
|
|
|
|
ANNOUNCEMENT OF WINNERS:
|
|
|
|
| The judges will tweet initial announcement of who won, the name
|
|
| of their award, and a very brief description of the winning entry
|
|
| from the @IOCCC twitter handle.
|
|
|
|
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
An important 2023 update to this historic note:
|
|
|
|
The IOCCC no longer uses twitter. Today the IOCCC uses Mastodon.
|
|
For more information and to see our IOCCC Mastodon posts, see:
|
|
|
|
https://fosstodon.org/@ioccc
|
|
|
|
End of important 2023 update to this historic note.
|
|
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
|
|
The judges will then post an initial announcement of who won, the name
|
|
of their award, and a very brief description of the winning entry
|
|
on the IOCCC website:
|
|
|
|
https://www.ioccc.org/whowon.html
|
|
|
|
We will also attempt to submit a brief announcement story to /.:
|
|
|
|
https://slashdot.org
|
|
|
|
that, depending on the willingness of the /. editors, may be posted
|
|
to their site at the same time.
|
|
|
|
Note that initial announcement will NOT contain source. This is because
|
|
the winning authors are given a chance to review the judges comments,
|
|
and test our Makefile. This review process typically takes a few weeks.
|
|
|
|
Sometime after the initial announcement, and once the review
|
|
by the winners has been completed, the winning source will be
|
|
posted to the IOCCC website:
|
|
|
|
https://www.ioccc.org/years.html
|
|
|
|
NOTE: previous winners are available at that URL
|
|
|
|
We will submit a story announcing the availability of the winners
|
|
to /. at the same time.
|
|
|
|
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
An important 2023 update to how winners are announced
|
|
|
|
The IOCCC no longer uses twitter. IOCCC entries will be announced
|
|
by a git commit to the IOCCC entries repo:
|
|
|
|
https://github.com/ioccc-src/winner
|
|
|
|
that, in turn, updates the offivial IOCCC website:
|
|
|
|
https://www.ioccc.org/index.html
|
|
|
|
In addition a note is posted to the IOCCC Mastodon account:
|
|
|
|
https://fosstodon.org/@ioccc
|
|
|
|
End of important 2023 update to how winners are announced.
|
|
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
|
|
| Don't ask us how many non-winning entries we receive.
|
|
|
|
Often, winning entries are published in selected magazines from around
|
|
the world. Winners have appeared in books ("The New Hackers Dictionary")
|
|
| and on T-Shirts. More than one winner has been turned in a tattoo!
|
|
|
|
Last, but not least, winners receive international fame and flames! :-)
|
|
|
|
|
|
FOR MORE INFORMATION:
|
|
|
|
You may contact the judges by sending an email to the following address:
|
|
|
|
| q.2012@ioccc.org (do not submit entries to this address)
|
|
|
|
| You must include the words 'ioccc 2012 question' in the subject of your
|
|
email when sending email to the judges.
|
|
|
|
Questions and comments about the contest are welcome. Comments about
|
|
confusing rules and guidelines are also welcome.
|
|
|
|
The rules and the guidelines may (and often do) change from year to
|
|
year. You should be sure you have the current rules and guidelines
|
|
prior to submitting entries.
|
|
|
|
Check out the IOCCC Web page:
|
|
|
|
https://www.ioccc.org
|
|
|
|
It has rules, guidelines and winners of previous contests (1984 to date).
|
|
|
|
Leonid A. Broukhis
|
|
Simon Cooper
|
|
chongo (Landon Curt Noll) /\cc/\
|