IOCCC image by Matt Zucker

The International Obfuscated C Code Contest

IOCCC Guidelines

WARNING: These guidelines are TENTATIVE

One might think of them as a beta release for the IOCCC that is about to open.

IMPORTANT: All tentative rules and guidelines are subject to change by the IOCCC judges at any time. See both the IOCCC news and the IOCCC Mastodon feed as sometimes the IOCCC judges mention changes there.

See our FAQ on “rules, guidelines, tools feedback” as well as our FAQ on “about asking questions” about these guidelines. You might also find the FAQ in general useful, especially the FAQ on “how to enter the IOCCC”.

The IOCCC is pending

While the IOCCC is not open yet, there is a tentative opening date for the next IOCCC.

Comments and suggestions on these preliminary guidelines are welcome. See the FAQ for how to suggest, correct or provide feedback about these guidelines.

28th International Obfuscated C Code Contest Official Guidelines

Copyright © 2024-2025 Leonid A. Broukhis and 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 by contacting the judges.

Jump to: top

IOCCC Guidelines version

These IOCCC guidelines are version 28.35 2025-01-30.

The markdown form of these guidelines is available for download.

IMPORTANT: Be SURE to read the IOCCC rules.

Jump to: top

Change marks

← Lines that start with this symbol indicate a change from the previous IOCCC.

Most lines (we sometimes make mistakes) that were modified since the previous IOCCC start with a solid 4 pixel black left border (or, in the case of a code block or blockquote, just a vertical bar).

Jump to: top

ABOUT THIS FILE:

This file contains guidelines intended to help people who wish to participate in the International Obfuscated C Code Contest (IOCCC).

These are NOT the IOCCC rules, though it does contain comments about them. The IOCCC 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 IOCCC guidelines.

You SHOULD read the CURRENT IOCCC rules, prior to submitting code to the contest. The rules are typically published along with the IOCCC guidelines.

Jump to: top

WHAT’S NEW THIS IOCCC

This IOCCC runs from 2024-12-29 23:58:13.213455 UTC to 2025-05-19 23:29:31.374143 UTC.

This contest will enter the pending state on or about 2024-12-29 23:58:13.213455 UTC.

This contest will enter the open state on 2025-02-19 23:19:17.130705 UTC.

This contest will enter the judging state on 2025-05-19 23:29:31.374143 UTC.

IMPORTANT NOTE: Until the contest enters the open state, any or all of the above dates and times may change AT ANY TIME!

The reason for the times of day are so that key IOCCC events are calculated to be a functional UTC time. :-)

Until the contest status becomes open, the IOCCC rules, IOCCC guidelines and the tools in the mkiocccentry repo, SHOULD be considered provisional BETA versions and may be adjusted AT ANY TIME before the contest status becomes open.

You MUST register in order to participate in the IOCCC. You may register while the contest is either pending or open.

See the FAQ on “how to register and submit to the IOCCC” for instructions on registering and participating in the IOCCC, as the process has changed from previous years!

When the contest is open, an IOCCC judge will email you your submit server Username and Initial password. This takes some time (maybe even a few days) for an IOCCC judge to process your registration and email you your initial login and password, so be sure to give yourself enough time.

Those who register while the contest status is pending will receive email with their submit server Username and Initial password from an IOCCC judge shortly after the contest status becomes open.

Once an IOCCC judge emails you your Username and Initial password, you will have 72 hours to change your submit server initial password. If you do not change your Initial password in time, you will have to re-register. You may NOT upload any submission until you have changed your Initial password and logged back in!

Because it takes time (maybe even a few days) for an IOCCC judge to process your registration and email you your initial login and password, you should MAKE SURE to give yourself enough time before the contest closes. In other words, DO NOT WAIT TO REGISTER UNTIL THE FINAL DAYS! The IOCCC judges are NOT responsible for delayed or lost email, or for those who wait until the last minute to try to register!

Once you have registered, and received by email, your submit server Username and Initial password from an IOCCC judge, you may, after changing your initial password upload your submission to the submit server, as long as the contest open.

The submit server will become active when the contest is pending. Until the contest status becomes pending, the submit server might be offline and/or unresponsive.

The submit server, in accordance with Rule 17, places a limit of 3999971 octets on the size of your upload.

Submissions are uploaded as a single xz compressed tarball.

To assist in the formation of the xz compressed tarball for submission, use the mkiocccentry(1) tool as found in the mkiocccentry repo.

If you wish to test that your submission passes the mkiocccentry(1) tests without having to put in answers each time, you can use the -d or -s seed option to mkiocccentry for the tool to pseudo-randomly create answers for you. The -d option is an alias for -s 21701. An example use:

    mkiocccentry -d workdir topdir

where workdir is the directory which the tarball will be formed and the topdir is the directory which has the required files (prog.c, Makefile and remarks.md) along with extra data files you wish to submit. Be aware that if the directory exists already, you will have to remove it or move it before this option will work a second time, just like in normal mode.

Rule 17 has been significantly modified to account for the new mkiocccentry repo tools. Thus, you are STRONGLY advised to use the mkiocccentry(1) tool as found in the mkiocccentry repo to form the file to upload to the submit server. Not doing so puts you at a very big risk of violating Rule 17.

See the FAQ on “obtaining and compiling the most recent mkiocccentry tools” and the FAQ on “how to enter the IOCCC” as that FAQ has important details on how to register as well as how to upload your submission to the IOCCC.

While the contest is open, you may modify your previously uploaded submission by rebuilding your submission with the mkiocccentry(1) tool and then re-uploading it to the same slot number on the submit server.

To help you with this, so that you do not have to repeatedly answer all the questions, the mkiocccentry(1) tool has the options -a answers, -A answers and -i answers, where -a will write to an answers file (if it does not already exist), -A will overwrite the file and -i will read the answers from the file. If you use -A, be sure you don’t overwrite another file by accident!

Once the contest enters the judging state, you will NOT be allowed to upload your submission files, so do give yourself enough time.

Rule 2 (the size rule) refers to the use of the IOCCC size tool called iocccsize(1).

See the mkiocccentry repo for the iocccsize(1) tool.

To further clarify Rule 2, we subdivided it into two parts, 2a and 2b.

The overall size limit (see Rule 2a) on prog.c has been increased from 4096 to 4993 bytes.

The Rule 2a size was changed from 4096 to 4993: a change that keeps the “2b to 2a” size ratio to a value similar to the 2001-2012 and 2013-2020 IOCCC eras.

The Rule 2b size has increased from 2053 to 2503 bytes.

Your submission must satisfy BOTH the maximum size Rule 2a AND the IOCCC size tool Rule 2b.

The IOCCC size tool imposes a 2nd limit on C code size (see Rule 2a). To check your code against Rule 2:

    iocccsize prog.c

The IOCCC size tool algorithm can be summarized as follows:

The size tool counts most C reserved words (keyword, secondary, and selected preprocessor keywords) as 1. The size tool counts all other octets as 1 excluding ASCII whitespace, and excluding any ‘;’, ‘{’ or ‘}’ followed by ASCII whitespace, and excluding any ‘;’, ‘{’ or ‘}’ octet immediately before the end of file.

ASCII whitespace includes ASCII tab, ASCII space, ASCII newline, ASCII formfeed, and ASCII carriage return.

When ‘;’, ‘{’ or ‘}’ are within a C string, they may still not be counted by the IOCCC size tool. This is a feature, not a bug!

In cases where the above summary and the algorithm implemented by the IOCCC size tool source code conflict, the algorithm implemented by the IOCCC size tool source code is preferred by the judges.

In other words, make sure iocccsize does not flag any issues with your prog.c.

There are at least 2 other reasons for selecting 2503 as the 2nd limit besides the fact that 2503 is a prime. These reasons may be searched for and discovered if you are “Curios!” about 2503. :-) Moreover, 2053 was the number of the kernel disk pack of one of the judge’s BESM-6, and 2503 is a decimal anagram of 2053.

Take note that this secondary limit imposed by the IOCCC size tool obviates some of the need to #define C reserved words in an effort to get around the size limits of Rule 2.

Yes Virginia, that is a hint!

Jump to: top

HINTS AND SUGGESTIONS:

You are encouraged to examine the winners of previous contests.

Keep in mind that rules change from year to year, so some winning entries might not be valid submissions this year; what was unique and novel one year might be ‘old’ the next year.

A submission is usually examined in a number of ways. We typically apply a number of tests to a submission:

You should consider how your submission looks in each of the above tests. You should ask yourself if your submission remains obscure after it has been ‘cleaned up’ by the C pre-processor and a C beautifier.

Your submission 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 submission that does something interesting when it’s executed.

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 ‘Best abuse of the rules’ or ‘Worst abuse of the rules’ or some variation to a submission that illustrates this point in an ironic way.

Although we are in an age where AI/LLM can create code, we don’t want to stop anyone from using any tools they like when they’re working on their submissions.

The IOCCC has a rich history of remarkable winning entries created by authors who skillfully employed various code-related techniques such as code generators, code analysis tools, machine learning tools, natural language models, code copilot tools, and integrated development environments. Although it is NOT required to use these kinds of tools in order to compile or run a submission, individuals are free to continue to create their submissions using them. Even so, we DISLIKE submissions that require an IDE (integrated development environment).

There have been instances where winning entry code was quite different from the original author’s input. At least one winning author cannot even use a keyboard!

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’ or ‘Best abuse of the rules’ or some variation and then plug the hole next year.

When we do need to plug a hole in the IOCCC rules or IOCCC guidelines, we will attempt to use a very small plug, if not smaller. Or, maybe not. :-)

There may be fewer than 2^7+1 reasons why these IOCCC guidelines seem obfuscated.

Check out your program and be sure that it works. We sometimes make an effort to debug a submission that has a slight problem, particularly in or near the final round. On the other hand, we have seen some of the best submissions 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 or mis-feature, you are better off documenting it. Noting “this submission sometimes prints the 4th power of a prime by mistake” would save the above submission. And sometimes, a strange bug/(mis-)feature can even help the submission! Of course, a correctly working submission 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 submission’s remarks.md 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.

When programs use VTxxx/ANSI sequences, they should NOT be limited to a specific terminal brand. Programs that work in a standard xterm are considered more portable.

Jump to: top

Including optional and extra files

The maximum total number of files that may be submitted has changed to 39 files. However, of those files, 5 are mandatory (prog.c, Makefile, remarks.md and the two JSON files generated by mkiocccentry(1), .info.json and .auth.json).

Additionally, three of the files, if included, MUST be specific file(name)s and in the top level directory, or they will be counted as an extra file, not an optional file.

In particular, any file that is not prog.c, Makefile, remarks.md, try.sh, prog.alt.c or try.alt.sh will be counted as an extra file, and if try.sh, prog.alt.c or try.alt.sh are not in the top level directory they will also be counted as an extra file. The .info.json and .auth.json files are not counted as extra files but are required.

In other words, the actual amount of EXTRA files is 31.

Of course, if you use the optional filenames without the files being our intended use, in order to get past the file limit, that would be an abuse of rules. For more details on the optional files, see the FAQ on the “try.sh script system” and the FAQ on “alt code”.

If you do need to include more files, you may do so by including as an extra file, a tarball. This does NOT have to pass txzchk(1) tests; only the submission tarball must pass the txzchk(1) tests. See the txzchk section for more details on this important tool.

If you DO include a tarball, and the build process or the program extracts said tarball(s), the make clobber rule MUST remove them.

IMPORTANT REMINDER: make SURE your tarball does NOT reveal who you are! The mkiocccentry(1) tool creates a v7 format tarball to prevent this. You can do the same like:

    tar --format=v7 -cJf foo.txz directory

See Rule 17 and in particular the part about the maximum number of files. If you do not follow these points, you are at a great risk of violating Rule 17!

NOTE: if you want to include a test-suite that requires a lot of files, please suggest this in your remarks.md and if your submission wins it can be done. In other words you should not use a tarball for a test-suite unless you have a very good reason for this (and if you do, make SURE you specify why in your remarks.md).

mkiocccentry

Rule 17 (the mkiocccentry(1) rule) states that you MUST use the mkiocccentry(1) tool to package your submission tarball.

See the mkiocccentry repo for the mkiocccentry(1) tool and below for more details.

IMPORTANT NOTE: make CERTAIN you have the most recent version of the mkiocccentry toolkit! See the FAQ on “obtaining the mkiocccentry toolkit”.

mkiocccentry runs a number of checks, by the tool itself and by executing other tools, before packaging your xz compressed tarball. Once the tarball is packaged it will run txzchk(1), which will also run fnamchk(1), as part of its algorithm.

If mkiocccentry encounters an error the program will exit and the xz compressed tarball will not be formed. For instance, if chkentry(1) (see below) fails to validate the .auth.json or .info.json JSON files (see below) that mkiocccentry(1) creates, it is an error and possibly a bug that you should report as a bug at the mkiocccentry bug report page. PLEASE run the bug_report.sh script to help us out here! See the FAQ on “reporting mkiocccentry bugs”.

However, even if mkiocccentry or one of the tools it invokes reports an error, it does not necessarily mean it is a bug in the code. It might be an issue with your submission. Thus if you report an error as a bug it might not be something that will be fixed as there might not be anything wrong with the tools.

On the other hand, some conditions flagged by mkiocccentry(1) are warnings and it allows you to override these, if you wish. If you’re brave enough you can use the -W option to ignore all warnings but this is a big risk; the -y option will assume ‘yes’ to most questions but this is also a big risk. Needless to say, we do NOT recommend these options.

In many places it will prompt you to verify what you input, allowing you to correct details as you go along.

Jump to: top

mkiocccentry(1) synopsis

The synopsis of the mkiocccentry(1) tool is:

    mkiocccentry [options] workdir topdir

To help you with editing a submission, the mkiocccentry(1) tool has some options to write OR read from an answers file so you do not have to input the information about the author(s) and the submission more than once (unless of course you need to make some changes, in which case you can use the option that overwrites the file).

See the FAQ on “mkiocccentry” for how to use this tool and the FAQ on “finer details of mkiocccentry” for even more information.

Other mkiocccentry tools

The mkiocccentry(1) tool will execute a number of tools, some of which will execute one or more additional tools.

iocccsize

mkiocccentry(1) will use code from iocccsize(1) which detects a number of issues that you may ignore, if you wish, as noted above.

In other words, you no longer need to run iocccsize manually. However, the checks described above are still made but through mkiocccentry itself.

Jump to: top

chkentry

mkiocccentry(1) will write two JSON files: .auth.json and .info.json. These files contain information about the author(s) and about the submission. These files MUST pass the checks of chkentry(1)!

If chkentry does not pass and you used mkiocccentry(1) it is very likely a bug and you should report it as a bug at the mkiocccentry issues page. See the FAQ on “reporting mkiocccentry bugs”.

Assuming that chkentry(1) successfully validates both .auth.json and .info.json, then the tarball will be formed and then txzchk(1) will be executed on it. In this case, there should be no problems, as mkiocccentry(1) should NOT form a tarball if there are any issues.

If mkiocccentry(1) is used and chkentry(1) fails to validate either of the files, then unless it is a system specific problem, it is likely a bug in mkiocccentry(1), chkentry(1) or possibly jparse, though this is quite unlikely.

If you want to know what .auth.json is, see the FAQ on “.auth.json”. If you want to know what the .info.json file is, see the FAQ on “.info.json”. On the other hand, if you want to know a bit more details about chkentry, see the FAQ about “chkentry”.

chkentry uses the jparse library. See the jparse README.md in the mkiocccentry GitHub repo subdirectory jparse as well as the jparse library README.md file in the mkiocccentry GitHub repo subdirectory jparse, for more details.

The jparse parser, library and tools were co-developed by Cody Boone Ferguson and Landon Curt Noll in 2022 and come from the jparse repo. However, the mkiocccentry tools use a clone of the jparse repo at a specific release. Thus the mkiocccentry will at times be behind the jparse repo!

You do NOT need to install jparse from the jparse repo! The mkiocccentry tools link in the static library from the mkiocccentry’s clone.

The mkiocccentry toolkit also has a clone of both the dbg library and the dyn_array library; the dyn_array library uses the dbg library and the jparse library uses both libraries but unlike in the jparse repo, the libraries do not need to be installed separately, in order to use the tools in mkiocccentry.

In other words, mkiocccentry contains everything you need, and even if you do install the libraries from their respective repos, it/they will not be used when compiling the mkiocccentry tools. This is important to make sure that you’re using the correct versions, which is verified by chkentry. See Rule 17!

Please see the FAQ on “validating .auth.json and/or .info.json files for more details on chkentry and how you can use it to validate your .auth.json and .info.json files manually, without having to repackage your submission.

You might also wish to see the FAQ on “.auth.json” and the FAQ on “.info.json” for much more information on these files.

Jump to: top

txzchk

txzchk(1) performs a wide number of sanity checks on the xz compressed tarball; if any issues are found (‘feathers are stuck in the tarball’ :-) ) AND if and ONLY IF you used mkiocccentry(1), then it is possibly a bug in one of the tools and you might want to report it as a bug at the mkiocccentry bug report page. PLEASE run the bug_report.sh script to help us out here! See the FAQ on “report mkiocccentry bugs”.

As part of its algorithm, txzchk(1) will run fnamchk(1) on the filename to verify that the name is valid. See the FAQ on “fnamchk” and fnamchk below for more details on this tool.

It is beyond the scope of this document to discuss the many tests that txzchk(1) performs; if you wish to know, we refer you to the source code or the man page. You might find a fun option if you do either of these!

Of course, as txzchk does not extract the tarball, it is possible that if you manually package your submission tarball, you could still be violating Rule 17.

See also the FAQ on “txzchk”.

Jump to: top

fnamchk

As an important part of its algorithm, txzchk directly executes fnamchk. If the filename is invalid (or the filename does not match the directory name of the tarball) then it is an error and you risk violating Rule 17. Nevertheless, you can run the tool manually, should you wish to.

For more information on fnamchk and how to manually validate your submission tarball filename, see the FAQ on “fnamchk”.

Because txzchk(1) tool uses the fnamchk(1) tool as part of its algorithm, mkiocccentry(1) does not directly invoke fnamchk(1), although we will in the judging process.

It is extremely unlikely that fnamchk(1) reporting an invalid filename is a bug in fnamchk(1) and as such, ignoring such an issue risks violating Rule 17 which is a big risk. Of course, using mkiocccentry(1) would prevent this from happening as it would not create such a file anyway. If mkiocccentry(1) was used it would rather suggest a bug in one of the tools and you should report it as a bug at the mkiocccentry issues page. See the FAQ on “report mkiocccentry bugs”.

As you can see, the use of mkiocccentry(1) is HIGHLY RECOMMENDED, and at the risk of stating the obvious, you run A VERY BIG RISK of having your submission rejected if you package your own tarball, and there are ANY problems. For instance, if chkentry(1) found a problem in your .info.json file, the mkiocccentry(1) tool would not package it. But if you were to package it manually, you would be violating Rule 17. But even if everything checks out OK you should NOT assume that everything IS OK.

Problems and/or bugs in tools

Although the tools have been tested quite a bit, and although it is quite unlikely that there are bugs in it, it is nonetheless possible for bugs to exist, as all programmers know. In this case, please ask for help or report what you think is a bug as a bug, via the bug report issues page in the mkiocccentry repo.

Of course, it is also possible for mkiocccentry(1), or one or more of the tools it executes (or another tool executes), to fail, but NOT because of a bug. An example problem is if there is not enough memory available or if some other library or syscall fails. Nonetheless it might be worth reporting as a bug; it is a judgement call: if it’s a bug it’ll be addressed and if it’s not that’s OK too!

Makefiles

We recommend AND encourage you to use the example Makefile, as the starting point for your submission’s required Makefile:

Feel free to modify the Makefile to suit your obfuscation needs.

Please add a space between the = and the value of variables, in the Makefile, making sure that the = comes immediately after the name. See the example Makefile for examples.

The rest of this section and its subsections will assume that you are using some variant of the example Makefile, again renamed as Makefile.

We suggest that you compile your submission with a commonly available -std=gnu17 (ISO C 2017 with GNU extensions) C compiler.

Default compiler flags

Unless you clearly state otherwise in your remarks.md file, AND put in your submission’s Makefile, we will compile using -std=gnu17 -O3 -g3!

It is OK if you need to require your submission to NOT be compiled using the default -std=gnu17 -O3 -g3 settings. Simply explain why your submission should NOT be compiled using -std=gnu17 -O3 -g3 in your remarks.md file, AND adjust your Makefile accordingly.

One reason that you might have to change the flags, is that the optimiser is known to break some programs, but there are certainly other possible valid reasons. Again, just update the Makefile and explain it in your remarks.md. See the optimiser section for details for changing optimiser flags.

Default compiler

IMPORTANT NOTE: The use of -std=gnu17 does NOT imply the use of the gcc compiler! We often start by compiling using the clang C compiler instead.

PLEASE NOTE: in macOS, the compiler gcc found at /usr/bin/gcc is in truth the clang compiler, as /usr/bin/gcc --version will show!

C standard

You may change the standard under which your submission is compiled by modifying the CSTD Makefile variable. For example, to use c17 instead:

    CSTD= -std=c17

Default optimisation level

You may change the level of optimization and compiler debug level that your submission is compiled with, by modifying the OPT Makefile variable. For example, to compile without optimization, and to include debug symbols:

    OPT= -O0 -g3

Compiler warnings

The default warning flags are set via the CWARN variable, as shown in the example Makefile:

    # Common C compiler warning flags
    #
    CWARN= -Wall -Wextra ${CSILENCE} ${CUNKNOWN}

For details on CSILENCE and CUNKNOWN, see the section on disabling warnings.

The -Weverything option

For compilers, such as clang, that have the -Weverything option, while you may wish to try it, you should read our FAQ on “clang -Weverything”. We do NOT recommend that you put the use of -Weverything into your submission’s Makefile for the reasons cited there. This goes even if your version does not trigger a warning as some other version might!

On the other hand, if ${CC} has “clang” in the name, the example Makefile will automatically enable -Weverything, so you might have to use -Wno-foo options anyway, as detailed below. See the FAQ on “-Weverything” for more details.

If “clang” is NOT in ${CC}, the CWARN variable will not be further modified.

There is no real penalty for compiler warnings. Sometimes compiler warnings cannot be helped: especially in the case of obfuscated C. :-) So if you cannot easily get rid of a compiler warning, try not fret too much.

We LIKE code that has a minimum of warnings, especially under the more strict -Wall -Wextra -pedantic mode:

    CWARN= -Wall -Wextra -pedantic

The two previous guidelines might be thought by some as being somewhat contradictory. Isn’t life, and isn’t trying to satisfy “contradictory customer requirements” all too often like that? :-) Try to minimize warnings if you can.

If you manage to produce very few warnings, or perhaps no warnings at all under the -Wall -Wextra -pedantic mode, then by all means brag about it in your remarks.md file AND BE SURE TO TELL US the OS, OS version, compiler and compiler version in which you observed this occurring (in case our OS and compiler produces a different result: so your submission won’t be penalized for not meeting your claims).

On the other hand, some warnings cannot be disabled and are enabled by compilers without any warning option specified. These are sometimes inevitable in obfuscated code and even in some non-obfuscated code, and you should not worry about this, though it might be worth pointing out.

For instance, some compilers like to warn about use of pointers as arrays, which seems to be dubious, as it obviously can’t (always) be avoided, being a big part of C, so you should not worry about this either; this is the warning -Wunsafe-buffer-usage and the way to disable it is -Wno-unsafe-buffer-usage. See also the FAQ on “forced warnings” and the FAQ on “-Weverything”.

Disabling warnings

If you do have to disable warnings due to -Weverything automatically being included, you might wish to state this fact. :-) And even without -Weverything there can be warnings, as noted above.

If your submission issues lots of warnings but is otherwise marvelously obfuscated in multiple levels, don’t worry about it. Nevertheless, be sure that the warnings do not constitute a potential “show stopper” compiler problem. Be sure that compilers such as both gcc and clang won’t produce a compiler error and refuse to compile your code: unless for some reason that is what you intend to happen in which case document that too in your remarks.md file. :-)

All other things being equal, a program that must turn off fewer warnings will be considered better, for certain values of better.

To turn off a compiler warning, in your submission’s Makefile, try something such as:

    CSILENCE= -Wno-some-thing -Wno-another-thing

For instance:

    CSILENCE= -Wno-parentheses -Wno-binding-in-condition -Wno-misleading-indentation

If you do add “-Wno-foo” to your Makefile, consider changing:

    CUNKNOWN=

to:

    CUNKNOWN= -Wno-unknown-warning-option

Some compilers have reported this as an error, however, and if you have such a compiler you might want to not add it, or at least note in your remarks.md which OS, OS version, compiler and compiler version you had the problem.

Defining macros in the Makefile

If you need to define something on the compile line, use the CDEFINE Makefile variable. For example:

    CDEFINE= -Dfoo -Dbar=baz

Include files in the Makefile

If you need to include a file (as in #include) on the command line, use the CINCLUDE Makefile variable. For example:

    CINCLUDE= -include stdio.h

Magic in the Makefile

If you need to add other “magic” flags to your compile line, use the COTHER Makefile variable. For example:

    COTHER= -fno-math-errno

NOTE: We only recommend using “magic” flags if BOTH gcc and clang support it.

Again, please note that in macOS, /usr/bin/gcc is actually clang!

The clobber rule

When make clobber is invoked, we request that submissions be restored to their original submission state. For example, any temporary files (including the compiled program(s)) created during the build process, or during execution should be removed by the clobber rule. In other words, the only things that should be in the directory after running make clobber is what is in your submission tarball itself.

While people are free to manage their submission under git(1) or even use a GitHub repo, dot-files and dot-directories such as .git are not allowed in a submission.

The mkiocccentry(1) tool will ignore dot-files and dot-directories (such as .vimrc, .bashrc, .git and .github) and not put them in the submission’s compressed tarball. So while you may use such files and directories to help develop your submission, they won’t be included when you run the mkiocccentry(1) tool.

Even if you did manage to get dot files or dot directories in the tarball somehow, txzchk(1) will flag it as an error. When the judges run txzchk(1) on the uploaded submission compressed tarball, if anything is wrong, for instance if you “sneak in” any dot files or dot directories, the submission WILL BE REJECTED for violating Rule 17!

You may use whatever tools you need to develop your submission, including the use of git(1) or gh(1), just be sure that your submission code and your submission Makefile don’t depend on such tools.

If this is not clear, please do NOT use these tools to help with the clobber rule! For instance, do NOT use git clean! Not only does this depend on the user having git(1) but it also does not account for the submission tarballs. Even worse is when someone does have it in a git(1) repo it will remove files that are not under git(1) control! Instead, see the clobber rule in the example Makefile to see how to manage this.

In other words, for make clobber, do something like:

    clobber:
            ${RM} -f foo bar baz

and NOT something like this:

    # do NOT do this!
    clobber:
            -git clean -f

And do NOT use git for any other tool either.

Jump to: top

OUR LIKES AND DISLIKES:

We LIKE submissions that use an edited variant of the example Makefile, as described and linked to in the Makefile section, renamed as Makefile of course. This makes it easier for the IOCCC judges to test your submission. And if your submissions wins, it makes it easier to integrate it into the Official IOCCC winner website.

We LIKE submissions that have some educational value. This does NOT mean that your submission should not be obfuscated but the IOCCC has moved away from the idea of spoilers. In other words, unless your submission does some kind of encryption (or something with encryption), you should not encrypt your remarks, say with rot13 or anything else, and it is also appreciated if your remarks have some education value. And although these are not required, they are a nice bonus.

We LIKE submissions that use an edited version of the try.sh example script (and if you have alternate code, the same applies with the try.alt.sh script):

Of course, it is quite possible that only one invocation is possible, so it is not necessarily detrimental to your submission if you do not include one, though we do like interesting and creative uses of submissions. See also the FAQ on “submitting try.sh and try.alt.sh scripts”.

You might wish to add ./try.sh to the try rule in the Makefile you submit. If you have alternate code, then you can use the try.alt rule instead.

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 */

In other words, it is a compilation error.

When declaring local or global variables, you should declare the type:

    int this_is_fine;
    this_is_not;       /* <-- Try to avoid implicit type declarations */

We tend to like less a submission that requires either gcc OR clang. We prefer submissions that can compile under BOTH gcc AND clang.

We RECOMMEND that the compiler flags you use in your submission’s Makefile are supported by BOTH gcc AND clang.

We DISLIKE the use of obscure compiler flags, especially if gcc and/or clang do not support it. We suggest that you not use any really obscure compiler flags if you can help it.

One side effect of the above is that you cannot assume the use of nested functions such as:

     main() {
|        void please_dont_submit_this() {
|           printf("The machine that goes BING!!\n");
         }
|        please_dont_submit_this();
     }

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 are required by a C standard that are actually implemented in BOTH gcc AND clang.

We DISLIKE submissions that require the use of -fnested-functions.

We prefer programs that do not require a fish license: crayons and cat detector vans not withstanding.

If your submission uses functions that have a variable number of arguments, be careful. Systems implement va_list in a wide variety of ways. Because of this, a number of operations using va_list are not portable and must not be used:

In particular, do not treat va_list variables as if they were a char **s.

We DISLIKE the use of varargs.h. Use stdarg.h instead.

We DISLIKE the use of gets(3). Use fgets(3) instead.

We tend to DISLIKE the blatant use of tarballs in an attempt to simply get around the extra file number limit. We realize there may be cases where a tarball containing a number of extra files may be needed. Such a need for a tarball MUST be explained in the remarks.md file.

On 28 January 2007, the Judges rescinded the requirement that the # in a C preprocessor directive must be the 1st non-whitespace octet.

The exit(3) function returns void. Some broken systems have exit(3) return int; your submission should assume that exit(3) returns a void.

This guideline has a change mark at the very start of this line.

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.

While those who are used to temperatures found on dwarf planets (yes Virginia, dwarf planets ARE planets!), such as Pluto, might be able to explain to the Walrus why our seas are boiling hot, the question of whether pigs have wings is likely to remain a debatable point to most.

One line programs should be short one line programs: say around 80 to 120 octets long. Going well beyond 140 octets is a bit too long to be called a one-liner in our vague opinion.

We tend to DISLIKE programs that:

In order to encourage submission portability, we DISLIKE entries that fail to build unless one is using an IDE. For example, do not mandate that one must use Microsoft Visual Studio to compile your submission. Nevertheless some of the better IDEs have command-line interfaces to their compilers, once one learns how to invoke a shell.

The program must compile and link cleanly in a Single UNIX Specification environment. Therefore do not assume the system has a windows.h include file:

    #include <windows.h>  /* we DISLIKE this */

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. If your code prints time with seconds, we prefer that your code be capable of printing the time of day during a leap-second where the value in seconds after the minute mark is 60.

The “how to build” process (via the Makefile or otherwise) should not be used to try and get around the size limit. It is one thing to make use of a several -Ds on the compile line to help out, but it is quite another to use many bytes of -Ds in order to try and squeeze the source under the size limit.

Your source code, post-pre-processing, should not exceed the size of Microsoft Windows. :-)

Other windows, on the other hand, might be OK: especially where “X marks the spot”. Yet on the third hand, windows are best when they are “unseen” (i.e., not dirty). :-)

The judges, as a group, have a history giving wide degree of latitude to reasonable submissions. And recently they have had as much longitudinal variation as it is possible to have on Earth. :-)

You should try to restrict commands used in the build file to commands found in Single UNIX Specification environments and systems that conform to the Single UNIX Specification.

You may 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 of your program is reasonably portable.

We prefer programs that are portable across a wide variety of Unix-like operating systems (e.g., Linux, GNU Hurd, BSD, Unix, etc.).

You are in a maze of twisty guidelines, all different.

There are at least zero judges who think that Fideism has little or nothing to do with the IOCCC judging process.

Don’t forget that the building of your program should be done WITHOUT human intervention. So don’t do things such as:

    prog: prog.c
        #echo this next line requires data 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 it is built ‘automatically’, and when it is run with a human involved, do something more clever. For example, one could put in their Makefile:

    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 their remarks.md file for alternate / human intervention based building.

We want to get away from source that is simply a compact blob of octets. Really try to be more creative than blob coding. HINT!

Please do not use things like gzip(1) to get around the size limit. Please try to be much more creative.

We really DISLIKE entries that make blatant use of including large data files to get around the source code size limit.

We do not recommend submitting systemd source code to the IOCCC, if nothing else because that code is likely to exceed the source code size limit. This isn’t to say that another highly compact and obfuscated replacement of init would not be an interesting submission.

Did we remember to indicate that programs that blatantly use some complex state machine to do something simple are boring? We think we did. :-)

All generalizations are false, including this one. – Mark Twain

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! Remember, you can submit more than one submission. See the IOCCC rules for details (in particular, Rule 9).

We suggest that you avoid trying for the ‘smallest self-replicating’ source. The smallest, a zero byte entry, won in 1994.

Programs that claim to be the smallest C source that does something, really better be the smallest such program or they risk being rejected because they do not work as documented.

Please note that the C source below, besides lacking in obfuscation, is NOT the smallest C source file that when compiled and run, dumps core:

    main;

Unless you specify -fwritable-strings (see COTHER in the example Makefile, described in the Makefile section), do not assume this sort of code will work:

    char *T = "So many primes, so little time!";
    ...
    T[14] = ';';    /* modifying a string requires: -fwritable-strings */

Even so, one should probably not assume that this is universally accepted.

Initialized char arrays are OK to write over. For instance, this is OK:

    char b[] = "Is this OK";
    b[9] = 'k';     /* modifying an initialized char array is OK */

There are more than 1 typos in this very sentence.

X client entries should be as portable as possible. Submissions 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 are not in wide spread use.

As of Red Hat RHEL9.0, the X.org server is deprecated. See the FAQ on “Xorg deprecation”” for more details. This does not mean that a submission using this will necessarily be rejected, but it would be better if it can support Wayland.

This is the only guideline that contains the word fizzbin.

However, do you know how to play fizzbin? You do?!? (Except on Tuesday?)

OK, there are actually 3 guidelines that contain the word fizzbin.

We DISLIKE entries that use proprietary toolkits such as the M*tif, Xv*ew, or OpenL*ok toolkits, since not everyone has them. Use an open source toolkit that is widely and freely available instead.

NOTE: The previous guideline in this spot has been replaced by this guideline:

X client entries should try to not to depend on particular items in .Xdefaults. If you must do so, be sure to note the required lines in the your remarks.md file. They should also not depend on any particular window manager.

Try to avoid entries that play music that some people believe is copyrighted music.

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 to favor the Single UNIX Specification.

You are well advised to submit entries that conform to the Single UNIX Specification Version 4.

To quote the IOCCC judges:

You very well might not be completely be prohibited from failing to not partly misunderstand this particular guideline, but of course, we could not possibly comment! :-) Nevertheless, you are neither prohibited, nor are you fully required to determine that this or the previous sentence is either false and/or perhaps misleading. Therefore, it might be wise for you to not fail to consider to not do so, accordingly. Thank you very much.

Any complaints about the above guideline could be addressed to the Speaker of the House of Commons, or to the speaker of your national parliament should you have one.

We LIKE programs that:

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 submission does in your remarks.md file section rather than leaving it obscure for the judges as we might miss something and/or be too tired to notice.

Please avoid this specific individual guideline, if it at all possible.

We freely admit that interesting, creative or humorous comments in your remarks.md file help your chances of winning. If you had to read so many twisted submissions, you too would enjoy a good laugh or two. We think the readers of the contest winners do as well. We do read your remarks.md content during the judging process, so it is worth your while to write remarkable remarks.md file.

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.

One should restrict libcurses to portable features found on BSD or Linux curses.

Rule 13 no longer discourages the use of UTF-8 characters in C code.

It is a very good idea to, in your remarks.md file, tell us why you think your submission is obfuscated. This is particularly true if your submission 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 submission 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 misleading 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.md where you talk about why you think your submission 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 run on an some Intel-like x86 architecture**.

We believe that Mark Twain’s quote:

Get your facts first, then you can distort them as you please.

… is a good motto for those writing code for the IOCCC.

The IOCCC size tool source is not an original work, unless you are Anthony C Howe, in which case it is original! :-) Submitting source code that uses the content of iocccsize.c, unless you are Anthony C Howe, might run the risk of violating Rule 7.

The txzchk(1) tool source is not an original work, unless you are Cody Boone Ferguson, in which case it is original! :-) Submitting source code that uses the contents of txzchk.c, unless you are Cody Boone Ferguson, might run the risk of violating Rule 7.

Neither the chkentry tool source nor the JSON parser and library nor jstrencode nor jstrdecode nor any of the other jparse tools (see the jparse repo), nor the fnamchk tool source, are original works, unless you are Cody Boone Ferguson or Landon Curt Noll, in which case they are original! :-) Submitting source code that uses the code of any of these tools or library, unless you are Cody Boone Ferguson or Landon Curt Noll, might run the risk of violating Rule 7.

Unless you are Landon Curt Noll, the remaining tools in the mkiocccentry repo are NOT original works. Submitting source code that uses the content of those tools, unless you are Landon Curt Noll, might run the risk of violating Rule 7.

Rule 7 does not prohibit you from writing your own obfuscated versions of these tools, unless of course you are Landon Curt Noll, in which case you probably won’t win since judges are disqualified! :-) However, if you do write your own version, you might wish to make it do something more interesting than simply implementing the IOCCC tools’ algorithms; on the other hand, if you do this, you might want to keep in mind that writing an obfuscated version of a library runs the risk of violating Rule 1 as it is likely not a complete program.

Even so, we do not recommend you try and submit a JSON parser due to the fact it will likely exceed the source code size limit and because you likely can’t beat flex or bison in obfuscation. This isn’t to say that the so-called JSON spec is not obfuscated, but unless you have some really clever way to compact and obfuscate a JSON parser more than flex and bison you will likely not win, either because of the source code size limit or because it is not as obfuscated as the lexer/parser of jparse.

While programs that only run in a specific word size are OK, if you have to pick, choose a 64-bit word size.

If the IOCCC judges 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, we might just try your submission on that emulator as well :-)

If your submission MUST run only on a 64-bit or 32-bit architecture, then you MUST specify the -arch on your command line (see ARCH in the example Makefile, described in Makefile section). Do not assume a processor word size without specifying -arch. For example:

    ARCH= -m64

Note, however, that some platforms will not necessarily support some architectures. For instance, more recent versions of macOS do NOT support 32-bit!

Try to be even more creative!

If there are limitations in your submission, you are highly encouraged to note such limitations in your remarks.md file. For example if your submission factors values up to a certain size, you might want to state:

This submission factors values up 2305567963945518424753102147331756070. Attempting to factor larger values will produce unpredictable results.

The judges might try to factor the value -5, so you want to might state:

This submission factors positive values up 2305567963945518424753102147331756070. Attempting to factor large values will produce unpredictable results.

However the judges might try to also factor 0, so you want to might state:

This submission factors values between 1 and 2305567963945518424753102147331756070. Attempting to factor values outside that range will produce unpredictable results.

Moreover they might try to also factor 3.5 or 0x7, or Fred, so you want to might state:

This submission factors integers between 1 and 2305567963945518424753102147331756070. Attempting to factor anything else will produce unpredictable results.

You submission might be better off catching the attempt to factor bogus values and doing something interesting. So you might want to code accordingly and state:

This submission factors integers between 1 and 2305567963945518424753102147331756070. Attempting to factor anything else will cause the program to insult your pet fish Eric.

The judges might not have a pet fish named Eric, so you might want to state:

This submission factors integers between 1 and 2305567963945518424753102147331756070. Attempting to factor anything else will cause the program to insult your pet fish Eric, or in the case that you lack such a pet, will insult the pet that you do not have.

When all other things are equal, a submission with fewer limitations will be judged better than a submission with lots of limitations. So you might want to code accordingly and state:

This submission attempts to a factor value of any size provided that the program is given enough time and memory. If the value is not a proper integer, the program might insult a fish named Eric.

Do not fear if you’re not 100% sure of the significance of 2305567963945518424753102147331756070 as it is not of prime importance: or is it? :-)

We DISLIKE the use of use ASCII tab characters in markdown files, such as in the required remarks.md file.

We don’t mind the use ASCII tab characters in your C code. Feel free to use ASCII tab characters if that suits your obfuscation needs. If is perfectly OK to use tab characters elsewhere in your submission, just not in markdown files as this tends complicate and annoy us when it comes time to rendering your markdown content.

If you do use ASCII tab characters in your non-markdown files, be aware that some people may use a tab stop that is different than the common 8 character tab stop.

PLEASE observe our IOCCC markdown guidelines when forming your submission’s remarks.md file. And if your submission contains additional markdown files, please follow those same guidelines for those files. See also Rule 19 and our FAQ on “markdown”.

We LIKE reading remarks.md files, especially if they contain useful, informative, and even humorous content about your submission. Yes, this is a hint. :-)

We RECOMMEND you put a reasonable amount effort into the content of the remarks.md file: it is a required for a reason. :-)

Jump to: top

ABUSING THE RULES:

Legal abuse of the IOCCC rules is somewhat encouraged. Legal rule abuse may involve, but is not limited to, doing things that are technically allowed by the IOCCC 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 IOCCC rules and IOCCC guidelines.

Legal abuse of the IOCCC rules is NOT an invitation to violate the IOCCC rules. A submission that violates the rules in the opinion of the judges, WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK! If you have a submission that might otherwise be interesting, you might want to submit two versions; one that does not abuse the IOCCC rules and one that does.

If you intend to abuse the IOCCC rules, indicate so in your remarks.md file. You MUST try to justify why you consider your rule abuse to be allowed under the IOCCC rules. That is, you must plead your case as to why your submission is valid. Humor and/or creativity help plead a case. As there is no guarantee that you will succeed, you might consider submitting an alternate version that conforms to the IOCCC rules.

If you do bypass the mkiocccentry(1) warnings about Rule 2a and/or about Rule 2b and submit a submission anyway, you MUST try to justify why the IOCCC judges should not reject your submission due to a rule violation, and you would be wise to do this towards the top of your remarks.md file.

Abusing the web submission procedure tends to annoy us more than amuse us. Spend your creative energy on content of your submission rather than on the submission process itself.

We are often asked why the contest IOCCC rules and IOCCC 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 IOCCC rules and IOCCC 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 can continue. A clever author should be able to read them and “drive a truck through the holes” in the IOCCC rules and IOCCC guidelines.

At the risk of stating the obvious, this contest is a parody of the software development process. The IOCCC rules and IOCCC guidelines are only a small part of the overall contest. Even so, one might think the contest IOCCC rules and IOCCC guidelines 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 and even from customers themselves on an all too regular basis. This is one of the reasons why the IOCCC rules and IOCCC guidelines are written in obfuscated form.

Jump to: top

JUDGING PROCESS:

Entries are judged by Leonid A. Broukhis and Landon Curt Noll.

Each submission submitted is given a random id number and subdirectory. The submission files including, but not limited to prog.c, Makefile, remarks.md, .info.json, .auth.json as well as any data files that you submit, are all placed under their own directory and stored and judged from this directory.

Any information about the authors is not read by 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, we 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 submission.

Now some people point out that coding and/or writing style might reveal the information about the authors. 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. The judges are on to this trick and therefore consider any obfuscated source or data file claiming to be from Honeyman to not be from Honeyman. This of course creates an interesting paradox known as the “obfuscated Peter Honeyman paradox”. Should Peter Honeyman actually submit to the IOCCC, he alone is excluded from the above, as we will likely believe it’s just another attempt at confusion. This guideline is known as the “Peter Honeyman is exemptguideline.

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 to the IOCCC in the past. In the past, Peter had denied submitting anything to the IOCCC. Perhaps those entries were submitted by one of his students?

Hopefully we are VERY CLEAR on this point! The rules now strongly state: PLEASE DO NOT put a name of an author, in an obvious way, into your source code, remarks.md, data files, etc., the above “Peter Honeyman is exempt” notwithstanding.

We seemed to have digressed again … :-) 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 are 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 printouts. By tradition, we do not even reveal the number of entries that we received.

During the judging process, a process that spans multiple sessions over a few weeks, we post general updates from our Mastodon account.

Make sure you reload the feed every so often because unless you are mentioned you will NOT get a push notification!

Jump to: top

JUDGING ROUNDS:

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, a submission gets at least two readings.

Jump to: top

JUDGING READINGS:

A reading consists of a number of actions:

In later rounds, other actions are performed including performing miscellaneous tests on the source and binary.

This is the very guideline that goes, BING!

Until we reduce the stack of submissions down to about 25 submissions, submissions are judged on an individual basis. A submission is set aside because it does not, in our opinion, meet the standard established by the round. When the number of submissions thins to about 25 submissions, we begin to form award categories. Submissions begin to compete with each other for awards. A submission will often compete in several categories.

The actual award category list will vary depending on the types of submissions we receive. A typical category list might be:

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 to about half that number: declaring those remaining to be 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 submission is good enough to win, but is beat out by a similar, but slightly better submission. For this reason, it is sometimes worthwhile to resubmit an improved version of a submission that failed to win in a previous year, the next year. This assumes, of course, that the submission is worth improving in the first place!

Over the years, more than one IOCCC judge has been known to bribe another IOCCC judge into voting for a winning entry by offering a bit of high quality chocolate, or other fun item.

One should NOT attempt to bribe an IOCCC judge, unless you are an IOCCC judge, because bribing an IOCCC judge by a non-judge has been shown to NOT be effective when the person attempting the bribe is made known to the IOCCC judges (i.e., they are not anonymous) AND/OR the bribe is otherwise associated with a submission to the IOCCC.

With the previous guideline in mind: anonymous gifts for the IOCCC judges that are NOT ASSOCIATED WITH a submission to the IOCCC may be sent to the IOCCC judges via the IOCCC Amazon wishlist. It has been shown that receiving anonymous gifts provides the IOCCC judges with a nice dopamine boost, and happy IOCCC judges help make the IOCCC better for everyone. :-)

See the FAQ on “supporting the IOCCC”.

More often than not, we select a small submission (usually one line) and a strange/creative layout submission. We sometimes also select a submission that abuses the IOCCC guidelines in an interesting way, or that stretches the contest rules that while legal, it nevertheless goes against the intent of the rules.

Nevertheless, see Rule 12.

In the end, we traditionally pick one submission as ‘best’. Sometimes such a submission simply far exceeds any of the other entries. More often, the ‘best’ is picked because it does well in a number of categories.

In years past, we renamed the winning submission from prog.c to a name related to the author(s)’ names. This is no longer done. Winning source is called prog.c. A compiled binary is called prog.

Jump to: top

ANNOUNCEMENT OF WINNERS:

The judges will toot initial announcement of who won, the name of their award, and a very brief description (award title) of the winning entry from the @IOCCC Mastodon account.

We recommend that you follow us on mastodon but please make sure to refresh the feed every so often (if not more often) because unless you are mentioned or someone boosts your post you will not get a push notification.

Jump to: top

How the new IOCCC winners will be announced

The current status of the IOCCC will change from judging to closed .

The contest_status in the status.json file will change from judging to closed as well.

When the above happens, the winning entries have been selected by the IOCCC judges.

The IOCCC judges will begin to prepare to release the source code of the new IOCCC winners.

The IOCCC judges will commit the winning source to the IOCCC winner repo which will update the Official IOCCC website.

The IOCCC news will also contain an announcement of the winners.

Jump to: top

An important 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 that, in turn, updates the Official IOCCC website.

In addition a note is posted to the IOCCC Mastodon account.

Jump to: top

Back to announcement of winners

It is pointless to ask the IOCCC judges how many submissions we receive. See How many submissions do the judges receive for a given IOCCC?.

Often, winning entries are published in selected magazines from around the world. Winners have appeared in books (‘The New Hacker's Dictionary’, ‘Obfuscated C and Other Mysteries’, ‘Pointers On C’, others) and on t-shirts (sometimes by the author(s) themselves). More than one winner has been turned into a tattoo!

Last, but not least, winners receive international fame and flames! :-)

Jump to: top

FOR MORE INFORMATION:

For questions or comments about the contest, see Contacting the IOCCC.

Be sure to review the IOCCC Rules and Guidelines as the IOCCC rules and the IOCCC guidelines may (and often do) change from year to year.

You should be sure you have the current IOCCC rules and IOCCC guidelines prior to submitting entries.

See the Official IOCCC website news for additional information.

For the updates and breaking IOCCC news, you are encouraged to follow the IOCCC on Mastodon. See our FAQ on “Mastodon” for more information. Please be aware that unless you are mentioned you most likely will NOT get a notification so you should make sure to check the page.

Check out the Official IOCCC website in general.

Jump to: top

Leonid A. Broukhis
chongo (Landon Curt Noll) /\cc/\


Jump to: top