diff --git a/next/guidelines.html b/next/guidelines.html index 09d6d2568..6c0fb86b4 100644 --- a/next/guidelines.html +++ b/next/guidelines.html @@ -452,28 +452,1245 @@ - -

The IOCCC is closed

-

The IOCCC is NOT accepting new submissions at this time. See the -IOCCC winning entries page for the entries that have won the -IOCCC in the past.

-

These guidelines are a TENTATIVE proposal for the next IOCCC -and are likely be to be updated before the next IOCCC.

-

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”.

-

Watch both the IOCCC status page and the -@IOCCC mastodon feed for information about -future IOCCC openings.

-

HINT to mastodon users: You may wish to refresh the @IOCCC -mastodon feed page and/or mastodon -app from time to time to view IOCCC mastodon updates.

- - - +

29th International Obfuscated C Code Contest Official Guidelines

+

+Copyright © 2025 Leonid A. Broukhis and Landon Curt Noll. +

+

All Rights Reserved. Permission for personal, education or non-profit use is +granted provided 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.

+

Guidelines Version

+

+These IOCCC guidelines are version 29.01 2025-11-29. +

+

+The | symbol indicates an change from the previous IOCCC. +

+

+Because the IOCCC29 guidelines was a substantial rewrite, only important changes from IOCCC28 have been marked. +

+

Be sure to read the IOCCC rules.

+
+
+
+

Guidelines for Rule 2 - Size restrictions

+
+
+
+

+You should pay attention to our observations on +code size and Rule 2 remarks for IOCCC28. +

+

Your submission must satisfy BOTH the +Rule 2a Gross Size +AND +Rule 2b Net Size rules.

+

To check your code against +Rule 2 - Size restrictions, use the iocccentry(1) tool. +For example:

+
    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 bytes as 1 +excluding ASCII whitespace, and excluding any ‘;’, ‘{’ or ‘}’ followed by +ASCII whitespace, and excluding any ‘;’, ‘{’ or ‘}’ byte 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.

+
+

In cases where the above summary and the algorithm implemented by +the IOCCC size tool iocccsize(1) conflict, the algorithm implemented +by the minimum required version of iocccsize(1) is preferred by the IOCCC +judges.

+

Make sure iocccsize does not flag any issues with your prog.c.

+

There a much less need to #define C reserved words in an effort +to get around the size limits of +Rule 2 - Size restrictions +because of the iocccsize(1) algorithm.

+

Yes Virginia, the previous guideline sentence is an important hint!

+

Jump to: top

+
+
+

Guidelines for Rule 3 - Register for the IOCCC

+
+
+

See FAQ on “What is an author handle?”.

+

Jump to: top

+
+
+

Guidelines for Rule 7 - Original Work

+
+
+

While it is NOT required, you are allowed to use tools or services such as:

+ +

The IOCCC has a rich history of remarkable winning entries created by +authors who skillfully employed various techniques to develop their code. +If you do make use of such tools or services, then we ENCOURAGE you to +describe how you used such tools in your remarks.md file.

+

In short: You created it, you own it, its an original work, or you have explicit permission to the work.

+

See FAQ on “May I use AI, LLM, Virtual coding assistants, or similar tools to write my submission?”.

+

Jump to: top

+
+
+

Guidelines for Rule 11 - Legal rule abuse

+
+
+

We do realize that there are holes in the IOCCC rules, and invite +submitters to attempt to apply creative rule interpretation. A rule abuse though, even +if not rewarded, may result in a subsequent rule change for future contests.

+

We sometime award ‘Best abuse of the rules’ or ‘Worst abuse of the rules’, +or some variation, to a submission that creatively attempts to exploit a holes in the +IOCCC rules.

+

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. :-)

+

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 abuse of the IOCCC rules is NOT an invitation to violate +the IOCCC rules (especailly Rule 17 - +Packaging ). A submission that violates the +rules in the opinion of the IOCCC judges, +WILL be disqualified. RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK!

+

If you intend to abuse the IOCCC rules, +indicate so in your remarks.md file. You MUST try to justify, plead, beg, +why you consider your rule abuse to be allowed under the +IOCCC rules. Humor 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 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, making sure to note in the one that does not abuse the rules that +this is another version, so that the judges do not assume you uploaded it by +mistake.

+

If you do bypass the mkiocccentry(1) warnings about +Rule 2a - Gross Size +and/or about +Rule 2b - Net Size +or any other +rule and submit a submission anyway, you MUST try to justify why the IOCCC +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.

+

We are often asked why the contest IOCCC rules and IOCCC +guidelines seem 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 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, balloning 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

+
+
+

Guidelines for Rule 15 - GNU Makefile

+
+
+

You may use git, or services such as GitHub +to develop and maintain your submission. However, we DISLIKE +submissions that require such services in order to build/compile your submission.

+

Submissions will be judged in an environment that has no IDE. +Any submission that fails to compile/build because it requires +an IDE will be rejected.

+

We will use the GNU make(1) tool, your Makefile, as well as tools found in the +Single UNIX Specification +environments, and commonly found on systems that reasonably conform to the +Single UNIX Specification +in the building and compiling of your submission.

+

Your Makefile MUST be compatible with GNU make and we suggest you use +Makefile.example as a template, renamed as Makefile of +course.

+

Jump to: top

+
+
+
+

Guidelines for Rule 17 - Use mkiocccentry

+
+
+
+

We STRONGLY recommend you do install the most recent release of +mkiocccentry toolkit +As use of using older versions of the mkiocccentry toolkit to are HIGHLY LIKELY to be REJECTED!

+

If you submit your own JSON files (other than .auth.json and +.info.json) then they do NOT have to be valid JSON.

+

However, if you do provide invalid JSON files, PLEASE +document and clearly explain this in your remarks.md file.

+

+An extra file is defined as a file that is not prog.c, prog.alt.c, +try.sh, try.alt.sh, remarks.md, Makefile, .auth.json and .info.json: +unless it’s not in the top level directory, in which case it IS an extra +file. +

+

+The non-extra files (prog.c, prog.alt.c, +try.sh, try.alt.sh, remarks.md, Makefile, .auth.json and .info.json) +are considered free files, and to not count towards the +Rule 17 - Use mkiocccentry +limit of 31 extra files. +

+

If you use an optional filename for something other than their intended use +in order to get past the file limit, we will consider that an abuse of rules.

+

The mkiocccentry generated tarball does NOT reveal who you are! For this +reason, the tarball MUST be a v7 format tarball.

+

You should NOT use a tarball as an extra file for a test-suite unless you +have a very good reason for this: if you do include a tarball as an extra file, +then you MUST specify why in your remarks.md file.

+

If you DO include a tarball an extra file, and the build process or the program extracts +said tarball(s), the make clobber rule MUST remove the extracted files.

+

Instead of including a large test-suite that requires a lot of files as part of your submission, +and your submission doesn’t require the test-suite to be available to run, +then in your remarks.md a URL where such a test-suite may be downloaded from +and how to use the test-suite to test your submission.

+

If you DO include a tarball then make sure it uses the v7 format. See the +FAQ on “extra files” +for details on how to make a v7 tarball.

+

See the +FAQ on “What should I do with the try.sh and try.alt.sh scripts?”.

+

See the +FAQ on “What is a .auth.json file?”.

+

See the +FAQ on “What is a .info.json file?”.

+

See the +FAQ on “How can I validate my submission directory?”.

+

See the +FAQ on “What permissions may my files be and what if I need different permissions?”.

+

See the +FAQ on “What are the detailed recommendations for a submission Makefile?”.

+

See the +FAQ on “What are the details behind Rule 17 - Use mkiocccentry?”.

+

Jump to: top

+
+ +
+
+ +
+

Guidelines for the mkiocccentry toolkit

+

The IOCCC submit server, and related services +use the most recent version of the +mkiocccentry toolkit: +submissions that package using older versions of the +mkiocccentry toolkit +are LIKELY to be REJECTED!

+

You REALLY SHOULD use the latest mkiocccentry toolkit +are LIKELY to be REJECTED! So you REALLY SHOULD use the latest mkiocccentry toolkit +to package your own submission.

+

The mkiocccentry(1) tool runs a number of checks by way of these +mkiocccentry toolkit tools:

+ +

Do NOT use txzchk(1) or fnamchk(1) command line options that are labeled +“for TESTING purposes” in their respective man pages.

+

Do NOT use fnamchk(1) command line options that are labeled “for TESTING purposes” +in the fnamchk(1) man page.

+

Do NOT use chkentry(1) command line options that are labeled “for the use by the IOCCC judges only” +in the chksubmit(1) (or chkentry(1)) man page(s). +Similarly do NOT use chkentry(1) command line options marked “for the use +by the IOCCC judges only” in the chkentry(1) man page.

+

To view mkiocccentry toolkit man pages, +while your current directory is the top of the source tree:

+
man soup/man/man1/mkiocccentry.1
+man soup/man/man1/iocccsize.1
+man soup/man/man1/txzchk.1
+man test_ioccc/man/man1/fnamchk.1
+man soup/man/man1/chksubmit.1
+man soup/man/man1/chkentry.1
+

The above man(1) commands will show the toolkit man pages without having to install them first.

+

So that you do not have to repeatedly answer all the mkiocccentry(1) questions, +use mkiocccentry -a answers ... to create a file containing the answers you first give, +so later enter mkiocccentry -i answers ... to reuse those same answers.

+

The mkiocccentry -A answers ... does the same thing except that the answers file will be overwritten.

+

The mkiocccentry -i answers ... will still be required to confirm “Yes/No” questions.

+

Use mkiocccentry -Y -i answers .. to force a yes answers with great caution +because it might force a yes answer to something you do NOT want, such as a +change in your code that violates a detected rule. +The mkiocccentry -i answers .. will still be required to confirm “Yes/No” questions. +While mkiocccentry -Y -i answers .. will force yes answers, use with great caution, +because it might force a yes answer to something you do NOT want.

+

To help with not having to repeatedly enter a UUID, put your UUID into a file and use +mkiocccentry -u uuidfile ..., or use mkiocccentry -U UUID ... to give the UUID +on the command line.

+

If you wish to test that your submission passes the mkiocccentry(1) tests +without having to type 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. +For example:

+
mkiocccentry -d workdir topdir
+

Do NOT submit a tarball formed by mkiocccentry -d .. OR by +mkiocccentry -s seed .. OR by using the test UUID!

+

The mkiocccentry(1) tool creates an xz(1) compressed v7 format tarball using a tar(1) +command of the form:

+
cd workdir/UUID-slot_num && tar --format=v7 -cJf submit.UUID-slot_num.timestamp.txz UUID-slot_num
+

In many places the mkiocccentry(1) tool will prompt you to verify what you input, allowing you to +correct details as you go along.

+

Pressing the “enter key” at the mkiocccentry(1) tool prompts will allow you +to proceed with a default, however make sure the default is the CORRECT +answer.

+

The mkiocccentry(1) tool will use code from iocccsize(1) which detects a number of +issues (such as Rule 2 - Size) that you may ignore, +however ignoring such issues comes with a significant level of risk!

+

Once the tarball is packaged it will +run txzchk(1), which will also run fnamchk(1), as part of its algorithm.

+

The use of mkiocccentry -W .... is highly discouraged as this may ignore +warnings about a problem that may cause your submission to be REJECTED!”

+

If mkiocccentry encounters an error, the program will exit and the xz +compressed tarball will NOT be generated: this is a feature, not a bug!

+

If you encounter a bug with the +mkiocccentry toolkit +PLEASE run the bug_report.sh script to help us out here!

+

While you don’t have to install the +mkiocccentry toolkit, +then in order to run a tool outside the repo directory +you will have to specify mkiocccentry(1) command line options to locate required tools +such as chkentry(1) (mkiocccentry -C chkentry ..), txzchk(1) (mkiocccentry -T txzchk ..), +and fnamchk(1) (mkiocccentry -F fnamchk ..).

+

The mkiocccentry(1) tool will ignore any filename or directory that begins with a period (.).

+

The mkiocccentry(1) tool will ignore all files that begin with COPYING, COPYRIGHT, and LICENSE, regardless +of filename case.

+

The mkiocccentry(1) tool will reject any of the following files if they are found directly under +the top level directory (topdir):

+ +

The files listed in the above list are allowed to exist in sub-directories: just NOT directly under +the top level directory (topdir).

+

The mkiocccentry(1) tool evaluates all filenames and directory names in a case +independent way: thus FOO, Foo, and foo are considered the SAME file +even if your filesystem doesn’t do the same.

+

Having two or more filenames that differ only by case WILL lead to problems +because of the previous statement.

+

When the mkiocccentry(1) tool ignores a file, that file is NOT included as +part of your submission.

+

When the mkiocccentry(1) tool ignores a directory, that directory, +and everything under that directory is NOT included as part of +your submission.

+

The mkiocccentry(1) tool will ignore all symlinks.

+

Creating a directory directly under the top level directory (topdir) +that is normally considered to be a regular file, such as a directory +named Makefile, prog.alt.c, prog.c, remarks.md, try.alt.sh, +or try.sh is NOT a good idea and will likely cause the +mkiocccentry(1) tool to abort with a fatal error.

+

The required Makefile and remarks.md files may NOT be empty. This +does not mean just 0 bytes but also that it MUST have content, and +content that is relevant (e.g. a Makefile with just comments is NOT +allowed). However, with the exception of the Makefile, the mkiocccentry(1) +tool will ONLY check file size.

+

If the optional file try.alt.sh, or try.sh exists and is an empty file, +the mkiocccentry(1) tool will abort with a fatal error.

+

If the mkiocccentry(1) tool encounters anything that isn’t a file, isn’t a +directory, and isn’t a symlink (which the tool ignores), the mkiocccentry(1) +tool to abort with a fatal error.

+

See +FAQ on “How do I report bugs in an mkiocccentry tool?”.

+

See Rule 11 - Legal rule abuse for warnings about ignoring mkiocccentry(1) tool warnings.

+

See +FAQ on “What is the fnamchk tool?”.

+

See +FAQ on “What is mkiocccentry in simple terms?”.

+

See +FAQ on “What is the mkiocccentry tool, how do I obtain it and how do I use it”.

+

Jump to: top

+
+
+

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, via clang(1) +and/or gcc(1). +

+
+
+

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! +

+

+It is OK if you need to require your submission to NOT be compiled +using the default -std=gnu17 -O3 settings. Simply explain why +your submission should NOT be compiled using -std=gnu17 -O3 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. +

+

+For more fun when it comes to optimisers breaking code, see +1986/marshall/compilers.html. +

+
+

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 c99 instead: +

+
    CSTD= -std=c99
+
+
+
+
+
+

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 to 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 in your remarks.md file. +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 file, which OS, OS version, compiler and compiler version +that has such a 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
+

+NOTE: just because we offer a default way to use the -D option, we still +do not like excess use of -D to get past size limits, especially since you +could use #define in your code instead. +

+
+

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. +

+
+

General Guidelines

+
+
+ +
+

General Overall Guidelines

+

These guideline are hints and suggestions, NOT IOCCC rules.

+

While submissions that violate guideline are allowed, +submissions that remain within the IOCCC guidelines are preferred.

+

You are encouraged to review the following FAQs:

+ +

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

+

The official locale of the IOCCC is C.

+

You are encouraged to examine the winners of previous contests.

+

Because rules change from year to year, some winning entries +of the past may be rejected this year.

+

What was 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 as in certain cases, +a test is not important.

+

Submissions that compete for the +‘strangest/most creative source layout’ need not do as well as +others in terms of their algorithm.

+

Given two submissions, we are more inclined to pick the submission that +does something interesting when it’s executed.

+

IMPORTANT: Be sure that your submission works as documented in your remarks.md file.

+

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 otherwise excellent submissions +fall down because they didn’t work as documented.

+

If you submission has bugs and/or mis-features, you are MUCH BETTER off +documenting such bugs and/or mis-features in your remarks.md file.

+

Consider an example of a prime number +printing program that claims that 16 is a prime number. +Noting such a bug in your remarks.md file could save your submission:

+
+

“this submission sometimes prints the 4th power of a prime by mistake”

+
+

Sometimes a strange bug or (mis-)feature can even help the submission! Of course, a correctly +working submission might be better.

+

We tend to look down on a +prime number +printer that claims that 16 is a prime number. +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.

+

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 VERY GOOD START +to a great submission!

+

Jump to: top

+
+ +
+
+ +
+

OUR LIKES AND DISLIKES:

+

We VERY MUCH 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 VERY MUCH LIKE submissions that have some educational value. This does NOT mean +that your submission should not be obfuscated but rather that the IOCCC has moved away from +the idea of “spoilers”. You should not encrypt or rot13 content in your remarks.md file.

+

It is VERY MUCH appreciated if your remarks have some educational +value. And although educational value is not required, it is an +EXCELLENT 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”.

+

+Even if it only has one invocation we still LIKE the try scripts. +

+

+If you do include a try.sh then PLEASE remove the try rule in the Makefile. +

+

+If you do include a try.alt.sh then PLEASE remove the try.alt rule in the Makefile. +

+

+If you don’t have a prog.alt.c, then PLEASE remove the try.alt rule as well. +

+

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, and in order to get older +IOCCC winning entries that did this to compile, we had to update them to not do this.

+

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. Hint!

+

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:

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

On 2012 July 20, the IOCCC 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.

+

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

+

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.

+

+Using a mass of gotos to obfuscate your code has become ‘old’ and is unlikely +to make it through the final rounds, if it even gets that far. +

+

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

+

The exit(3) function returns void. Some broken systems have exit(3) +return int; your submission should assume that exit(3) 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 to 132 +bytes long. Going well beyond 132 bytes 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 submissions 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.

+

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.

+

The Makefile 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. :-)

+

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.).

+

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

+

We want to get away from source that is simply a compact blob of +bytes. 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 submissions 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! +Remember, you can submit more than one submission. See the +IOCCC rules +for details (in particular, +Rule 8 - Submitting requirements).

+

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

X client submissions 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 submissions 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 in +some way or another.

+

We DISLIKE submissions 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.

+

X client submissions 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 submissions 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 code that conforms to the Single UNIX +Specification Version 4.

+

To quote the IOCCC judges:

+

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 +IOCCC judges as we might miss something and/or be too tired to +notice.

+

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 a 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 submissions. 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 both BSD +and Linux curses.

+

+If you do #include <curses.h> make CERTAIN you link in curses (i.e. +-lcurses) and not ncurses (i.e. -lncurses). +

+

Rule 12 - UTF-8 +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**.

+

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

+

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!

+

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 IOCCC 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 IOCCC 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 IOCCC 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.

+
+

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

+

We don’t mind the use of 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 annoy us when it comes time to +rendering your markdown content as it complicates the process.

+

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 4 - Required files, +and the +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 file for a reason. :-)

+

Try to be even more creative!

+

Jump to: top

+
+ +
+

Fun😄damental Guidelines

+

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

+

At least 2 of several reasons for selecting the prime, 2503, for +Rule 2b - Net Size +may be found on the “Curios!” about 2503.

+

The 2503 value for Rule 2b - Net Size is a decimal anagram +of the number of the kernel disk pack of one of the judge’s BESM-6.

+

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

+

Excessively “dotty” use of the chksubmit(1) or chkentry(1) commands suggests that +either you like silly things, or that you”RTFS” with some level of care.

+

Some people might question what actually constitutes a valid JSON file, given +the state of the “so-called” JSON spec.. :-)

+

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

+

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

+

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.

+

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.

+

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 IOCCC 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. :-) +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 IOCCC 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 are in a maze of twisty guidelines, all different.

+
+

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

+
+

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

+
+

+There are more than about 1 typos in this very sentence. +

+

This could be 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 2 guidelines that contain the word +fizzbin, +unless you count this one, in which case there are 3. :-)

+

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

+

+

+

You very well might not be completely 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 or partly +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 (allegedly).

+
+

+

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.

+

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

+

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.

+

+We do not recommend submitting systemd source code to the IOCCC, +if nothing else because that code is likely to exceed +Rule 2 - Size. +This isn’t to say that another highly compact and obfuscated +replacement of init(8) would not be an interesting submission. +

+

+The +mkiocccentry toolkit +is not an original work, unless you one of the +several mkiocccentry toolkit contributors. +in which case it is original! :-) +

+

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 :-)

+

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

+

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 they +may (and often do) change from year to year.

+

PLEASE be sure you have the current IOCCC rules and +IOCCC guidelines prior to submitting to the contest.

+

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 do note that unless +you are mentioned by us you will NOT get a notification from the app so you +should refresh the page even if you do follow us.

+

Check out the Official IOCCC winner website in general.

+

Consider joining the IOCCC discord community via this link: +https://discord.gg/Wa42Qujwnw

+

See the +FAQs on “obtaining, compiling, installing and using the 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 for the IOCCC.

+
+

Jump to: top +

diff --git a/next/guidelines.md b/next/guidelines.md index c6308c625..061ef30a8 100644 --- a/next/guidelines.md +++ b/next/guidelines.md @@ -1,28 +1,1636 @@ - -# The IOCCC is closed +# 29th International Obfuscated C Code Contest Official Guidelines -The IOCCC is **NOT** accepting new submissions at this time. See the -[IOCCC winning entries page](../years.html) for the entries that have won the -IOCCC in the past. +

+Copyright © 2025 Leonid A. Broukhis and Landon Curt Noll. +

-These guidelines are a **TENTATIVE proposal** for the next IOCCC -and are **likely be to be updated** before the next IOCCC. +All Rights Reserved. Permission for personal, education or non-profit use is +granted provided 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](../contact.html). -See our -FAQ on "[rules, guidelines, tools feedback](../faq.html#feedback)" -as well as our -FAQ on "[about asking questions](../faq.html#question)" -about these guidelines. You might also find the FAQ in general useful, especially the -FAQ on "[how to enter the IOCCC](../quick-start.html#enter)". -Watch both [the IOCCC status page](../status.html) and the -[@IOCCC mastodon feed](https://fosstodon.org/@ioccc) for information about -future IOCCC openings. +# Guidelines Version -**HINT to mastodon users**: You may wish to refresh the [@IOCCC -mastodon feed](https://fosstodon.org/@ioccc) page and/or mastodon -app from time to time to view IOCCC mastodon updates. +

+These IOCCC guidelines are version **29.01 2025-11-29**. +

- - +

+The | symbol indicates an **change** from the previous IOCCC. +

+ +

+Because the **IOCCC29** guidelines was a substantial rewrite, only **important changes** from **IOCCC28** have been marked. +

+ +Be sure to read the [IOCCC rules](rules.html). + + +
+
+
+# Guidelines for [Rule 2 - Size restrictions](rules.html#rule2-size-restrictions) +
+
+
+ +

+You should pay attention to our observations on +[code size and Rule 2 remarks for IOCCC28](../2024/index.html#code-size-and-rule-2). +

+ +Your submission must satisfy **BOTH** the +[Rule 2a Gross Size](rules.html#rule2a-gross-size) +**AND** +[Rule 2b Net Size](rules.html#rule2b-net-size) rules. + +To check your code against +[Rule 2 - Size restrictions](rules.html#rule2-size), use the `iocccentry(1)` tool. +For example: + +``` + 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 bytes as 1 +excluding ASCII whitespace, and excluding any '`;`', '`{`' or '`}`' followed by +ASCII whitespace, and excluding any '`;`', '`{`' or '`}`' byte 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. + +In cases where the above summary and the algorithm implemented by +the IOCCC size tool `iocccsize(1)` conflict, the algorithm implemented +by the minimum required version of `iocccsize(1)` is preferred by the [IOCCC +judges](../judges.html). + +Make sure `iocccsize` does not flag any issues with your `prog.c`. + +There a much less need to `#define` C reserved words in an effort +to get around the size limits of +[Rule 2 - Size restrictions](rules.html#rule2-size) +because of the `iocccsize(1)` algorithm. + +Yes Virginia, **the previous guideline sentence is an important hint**! + + +Jump to: [top](#) + + +
+
+# Guidelines for [Rule 3 - Register for the IOCCC](rules.html#rule3-register) +
+
+ +See FAQ on "[What is an author handle?](../faq.html#author_handle_faq)". + + +Jump to: [top](#) + + +
+
+# Guidelines for [Rule 7 - Original Work](rules.html#rule7-original-work) +
+
+ +While it is **NOT** required, you are allowed to use tools or services such as: + +* Code generators +* Static and runtime code analysis tools +* Machine learning tools +* Natural language models +* Large language models (LLMs) +* Code copilot tools +* So called "_AI services_" +* Etc. + +The IOCCC has a rich history of remarkable winning entries created by +authors who skillfully employed various techniques to develop their code. +If you do make use of such tools or services, then we **ENCOURAGE you to +describe how you used such tools** in your `remarks.md` file. + +In short: You created it, you own it, its an original work, or you have explicit permission to the work. + +See FAQ on "[May I use AI, LLM, Virtual coding assistants, or similar tools to write my submission?](../faq.html#ai)". + + +Jump to: [top](#) + + +
+
+# Guidelines for [Rule 11 - Legal rule abuse](rules.html#rule11-legal-rule-abuse) +
+
+ +We do realize that there are holes in the [IOCCC rules](rules.html), and invite +submitters to attempt to apply creative rule interpretation. A rule abuse though, even +if not rewarded, may result in a subsequent rule change for future contests. + +We sometime award '**Best abuse of the rules**' or '**Worst abuse of the rules**', +or some variation, to a submission that creatively attempts to exploit a holes in the +[IOCCC rules](rules.html). + +When we do need to plug a hole in the [IOCCC rules](rules.html) +or [IOCCC guidelines](guidelines.html), we will attempt to use a very small plug, +if not smaller. + +Or, maybe not. :-) + +Legal rule abuse may involve, but is not limited to, doing things that are +technically allowed by the [IOCCC rules](rules.html) and yet do not fit the spirit of what +we intended to be submitted. + +Legal abuse of the [IOCCC rules](rules.html) is **NOT** an invitation to violate +the [IOCCC rules](rules.html) (especailly [Rule 17 - +Packaging](./rules.html#rule-17---packaging) ). A submission that violates the +[rules](rules.html) in the opinion of the [IOCCC judges](../judges.html), +**WILL** be disqualified. **_RULE ABUSE CARRIES A CERTAIN LEVEL OF RISK!_** + +If you intend to abuse the [IOCCC rules](rules.html), +indicate so in your `remarks.md` file. You **MUST** try to justify, plead, beg, +why you consider your rule abuse to be allowed under the +[IOCCC rules](rules.html). Humor 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](rules.html). + +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](rules.html) and +one that does, making sure to note in the one that does not abuse the rules that +this is another version, so that the judges do not assume you uploaded it by +mistake. + +If you do bypass the `mkiocccentry(1)` warnings about +[Rule 2a - Gross Size](rules.html#rule-2a-gross-size) +and/or about +[Rule 2b - Net Size](rules.html#rule-2b-net-size) +or any other +rule and submit a submission anyway, you **MUST** try to justify why the IOCCC +[IOCCC judges](../judges.html) 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. + +We are often asked why the contest [IOCCC rules](rules.html) and [IOCCC +guidelines](guidelines.html) seem 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](rules.html) and [IOCCC guidelines](guidelines.html) 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](rules.html) and [IOCCC +guidelines](guidelines.html). + +At the risk of stating the obvious, this contest is a parody of the software +development process. The [IOCCC rules](rules.html) and [IOCCC guidelines](guidelines.html) +are only part of the overall contest. Even so, one might think the +contest [IOCCC rules](rules.html) and [IOCCC guidelines](guidelines.html) 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, balloning 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](rules.html) and +[IOCCC guidelines](guidelines.html) are written in obfuscated form. + + +Jump to: [top](#) + + +
+
+# Guidelines for [Rule 15 - GNU Makefile](rules.html#rule15-gnu-makefile) +
+
+ +You may use `git,` or services such as [GitHub](https://www.github.com) +to develop and maintain your submission. However, we **DISLIKE** +submissions that **require** such services in order to build/compile your submission. + +Submissions will be judged in an environment that has no **IDE**. +Any submission that fails to compile/build because it requires +an **IDE** will be rejected. + +We will use the `GNU make(1)` tool, your `Makefile`, as well as tools found in the +[Single UNIX Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification) +environments, and commonly found on systems that reasonably conform to the +[Single UNIX Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification) +in the building and compiling of your submission. + +Your Makefile **MUST** be compatible with GNU `make` and we suggest you use +[Makefile.example](Makefile.example) as a template, renamed as Makefile of +course. + + +Jump to: [top](#) + + +
+
+
+# Guidelines for [Rule 17 - Use mkiocccentry](rules.html#rule17-mkiocccentry) +
+
+
+ + +We **STRONGLY** recommend you **do** install the most recent release of +[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) +As use of using older versions of the mkiocccentry toolkit to are **HIGHLY LIKELY** to be **REJECTED**! + +If you submit your own JSON files (other than `.auth.json` and +`.info.json`) then they do **NOT** have to be valid JSON. + +However, if you do provide invalid JSON files, **PLEASE** +document and **clearly explain** this in your `remarks.md` file. + +

+An _extra file_ is defined as a file that is not `prog.c`, `prog.alt.c`, +`try.sh`, `try.alt.sh`, `remarks.md`, `Makefile`, `.auth.json` and `.info.json`: +unless it's not in the top level directory, in which case it **IS** an _extra +file_. +

+ +

+The non-extra files (`prog.c`, `prog.alt.c`, +`try.sh`, `try.alt.sh`, `remarks.md`, `Makefile`, `.auth.json` and `.info.json`) +are considered _free files_, and to not count towards the +[Rule 17 - Use mkiocccentry](rules.html#rule17-mkiocccentry) +limit of **31** _extra files_. +

+ +If you use an optional filename for something other than their intended use +in order to get past the file limit, we will consider that an abuse of rules. + +The `mkiocccentry` generated tarball does **NOT** reveal who you are! For this +reason, the tarball **MUST** be a **v7 format** tarball. + +You should NOT use a tarball as an _extra file_ for a test-suite unless you +have a very good reason for this: if you do include a tarball as an _extra file_, +then you **MUST** specify why in your `remarks.md` file. + +If you **DO** include a tarball an _extra file_, and the build process or the program extracts +said tarball(s), the make `clobber` rule **MUST** remove the extracted files. + +Instead of including a large test-suite that requires a lot of files as part of your submission, +and your submission doesn't require the test-suite to be available to run, +then in your `remarks.md` a URL where such a test-suite may be downloaded from +and how to use the test-suite to test your submission. + +If you **DO** include a tarball then make sure it uses the v7 format. See the +FAQ on "[extra files](../faq.html#extra-files)" +for details on how to make a v7 tarball. + +See the +FAQ on "[What should I do with the `try.sh` and `try.alt.sh` scripts?](../faq.html#try_scripts)". + +See the +FAQ on "[What is a `.auth.json` file?](../faq.html#auth_json)". + +See the +FAQ on "[What is a `.info.json` file?](../faq.html#info_json)". + +See the +FAQ on "[How can I validate my submission directory?](../faq.html#chksubmit)". + +See the +FAQ on "[What permissions may my files be and what if I need different permissions?](../faq.html#file_perms)". + +See the +FAQ on "[What are the detailed recommendations for a submission Makefile?](../faq.html#makefile_details)". + +See the +FAQ on "[What are the details behind Rule 17 - Use mkiocccentry?](../faq.html#rule17)". + + +Jump to: [top](#) + + +
+
+ +# Guidelines for the mkiocccentry toolkit + +The [IOCCC submit server](https://submit.ioccc.org), and related services +use the **most recent version** of the +[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry): +submissions that package using older versions of the +[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) +are **LIKELY** to be **REJECTED**! + +You **REALLY SHOULD** use the latest [mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) +are **LIKELY** to be **REJECTED**! So you **REALLY SHOULD** use the latest [mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) +to package your own submission. + +The `mkiocccentry(1)` tool runs a number of checks by way of these +[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) tools: + +* iocccsize(1) +* txzchk(1) +* fnamchk(1) +* chksubmit(1) +* chkentry(1) + +Do **NOT** use `txzchk(1)` or `fnamchk(1)` command line options that are labeled +"**for TESTING purposes**" in their respective man pages. + +Do **NOT** use `fnamchk(1)` command line options that are labeled "**for TESTING purposes**" +in the `fnamchk(1)` man page. + +Do **NOT** use `chkentry(1)` command line options that are labeled "**for the use by the IOCCC judges only**" +in the `chksubmit(1)` (or `chkentry(1)`) man page(s). +Similarly do **NOT** use `chkentry(1)` command line options marked "**for the use +by the IOCCC judges only**" in the `chkentry(1)` man page. + +To view [mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) man pages, +while your current directory is the top of the source tree: + +``` +man soup/man/man1/mkiocccentry.1 +man soup/man/man1/iocccsize.1 +man soup/man/man1/txzchk.1 +man test_ioccc/man/man1/fnamchk.1 +man soup/man/man1/chksubmit.1 +man soup/man/man1/chkentry.1 +``` + +The above `man(1)` commands will show the toolkit man pages without having to install them first. + +So that you do not have to repeatedly answer all the `mkiocccentry(1)` questions, +use `mkiocccentry -a answers ...` to create a file containing the answers you first give, +so later enter `mkiocccentry -i answers ...` to reuse those same answers. + +The `mkiocccentry -A answers ...` does the same thing except that the **answers file will be overwritten**. + +The `mkiocccentry -i answers ...` will still be required to confirm "_Yes/No_" questions. + +Use `mkiocccentry -Y -i answers ..` to force a yes answers with **great caution** +because it might force a yes answer to something you do **NOT** want, such as a +change in your code that violates a detected rule. +The `mkiocccentry -i answers ..` will still be required to confirm "_Yes/No_" questions. +While `mkiocccentry -Y -i answers ..` will force yes answers, use with **great caution**, +because it might force a yes answer to something you do **NOT** want. + +To help with not having to repeatedly enter a UUID, put your UUID into a file and use +`mkiocccentry -u uuidfile ...`, or use `mkiocccentry -U UUID ...` to give the `UUID` +on the command line. + +If you wish to **test** that your submission passes the `mkiocccentry(1)` tests +without having to type 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. +For example: + +``` +mkiocccentry -d workdir topdir +``` + +Do **NOT** submit a tarball formed by `mkiocccentry -d ..` **OR** by +`mkiocccentry -s seed ..` **OR** by using the `test` UUID! + +The `mkiocccentry(1)` tool creates an `xz(1)` compressed **v7 format** tarball using a `tar(1)` +command of the form: + +``` +cd workdir/UUID-slot_num && tar --format=v7 -cJf submit.UUID-slot_num.timestamp.txz UUID-slot_num +``` + +In many places the `mkiocccentry(1)` tool will prompt you to verify what you input, allowing you to +correct details as you go along. + +Pressing the "_enter key_" at the `mkiocccentry(1)` tool prompts will allow you +to proceed with a default, however make sure the default is the **CORRECT** +answer. + +The `mkiocccentry(1)` tool will use code from `iocccsize(1)` which detects a number of +issues (such as [Rule 2 - Size](rules.html#rule2-size)) that you may ignore, +however ignoring such issues **comes with a significant level of risk!** + +Once the tarball is packaged it will +run `txzchk(1)`, which will also run `fnamchk(1)`, as part of its algorithm. + +The use of `mkiocccentry -W ....` is **highly discouraged** as this may ignore +warnings about a problem that may cause your submission to be **REJECTED!**" + +If `mkiocccentry` encounters an **error**, the program will exit and the xz +compressed tarball **will NOT be generated**: this is a **feature, not a bug**! + +If you encounter a **bug** with the +[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) +**PLEASE run the `bug_report.sh` script to help us out here!** + +While you don't have to install the +[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry), +then in order to run a tool outside the repo directory +you will have to specify `mkiocccentry(1)` command line options to locate required tools +such as `chkentry(1)` (`mkiocccentry -C chkentry ..`), `txzchk(1)` (`mkiocccentry -T txzchk ..`), +and `fnamchk(1)` (`mkiocccentry -F fnamchk ..`). + +The `mkiocccentry(1)` tool will ignore any filename or directory that begins with a period (`.`). + +The `mkiocccentry(1)` tool will ignore all files that begin with `COPYING`, `COPYRIGHT`, and `LICENSE`, regardless +of filename case. + +The `mkiocccentry(1)` tool will reject any of the following files if they are found directly under +the top level directory (`topdir`): + +* README.md +* index.html +* prog +* prog.alt +* prog.alt.o +* prog.orig.c +* filenames matching the `[0-9][0-9][0-9][0-9]_*.tar.bz2` file glob + +The files listed in the above list are allowed to exist in sub-directories: just **NOT** directly under +the top level directory (`topdir`). + +The `mkiocccentry(1)` tool evaluates all filenames and directory names in a case +independent way: thus `FOO`, `Foo`, and `foo` are considered the **SAME** file +even if your filesystem doesn't do the same. + +Having two or more filenames that differ only by case **WILL** lead to problems +because of the previous statement. + +When the `mkiocccentry(1)` tool ignores a file, that file is **NOT** included as +part of your submission. + +When the `mkiocccentry(1)` tool ignores a directory, that directory, +and everything under that directory is **NOT** included as part of +your submission. + +The `mkiocccentry(1)` tool will ignore all symlinks. + +Creating a directory directly under the top level directory (`topdir`) +that is normally considered to be a regular file, such as a directory +named `Makefile`, `prog.alt.c`, `prog.c`, `remarks.md`, `try.alt.sh`, +or `try.sh` is **NOT** a good idea and will likely cause the +`mkiocccentry(1)` tool to abort with a **fatal error**. + +The required `Makefile` and `remarks.md` files may **NOT** be empty. This +does not mean just 0 bytes but also that it **MUST** have **content**, and +content that is relevant (e.g. a Makefile with just comments is **NOT** +allowed). However, with the exception of the `Makefile`, the `mkiocccentry(1)` +tool will **ONLY** check file size. + +If the optional file `try.alt.sh`, or `try.sh` exists and is an empty file, +the `mkiocccentry(1)` tool will abort with a **fatal error**. + +If the `mkiocccentry(1)` tool encounters anything that isn't a file, isn't a +directory, and isn't a symlink (which the tool ignores), the `mkiocccentry(1)` +tool to abort with a **fatal error**. + +See +FAQ on "[How do I report bugs in an `mkiocccentry` tool?](../faq.html#mkiocccentry_bugs)". + +See [Rule 11 - Legal rule abuse](rules.html#rule11-legal-rulea-abuse) for warnings about ignoring `mkiocccentry(1)` tool warnings. + +See +FAQ on "[What is the `fnamchk` tool?](../faq.html#fnamchk)". + +See +FAQ on "[What is mkiocccentry in simple terms?](../faq.html#about_mkiocccentry)". + +See +FAQ on "[What is the mkiocccentry tool, how do I obtain it and how do I use it](../faq.html#mkiocccentry)". + + +Jump to: [top](#) + +
+
+# Makefiles +
+
+ +

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

+ +- [view example Makefile](%%REPO_URL%%/next/Makefile.example) +- download example 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, via `clang(1)` +and/or `gcc(1)`. +

+ +
+
+## 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`! +

+ +

+It **is OK** if you need to require your submission to **NOT be** compiled +using the default `-std=gnu17 -O3` settings. Simply **explain why** +your submission should NOT be compiled using `-std=gnu17 -O3` 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](#optimiser) for details for changing optimiser +flags. +

+ +

+For more fun when it comes to optimisers breaking code, see +[1986/marshall/compilers.html](../1986/marshall/compilers.html). +

+ + +
+## 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 `c99` instead: +

+ + +``` + CSTD= -std=c99 +``` + +
+
+
+
+
+## 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](#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](../faq.html#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](../faq.html#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 to 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](../faq.html#forced_warnings)" +and the +FAQ on "[-Weverything](../faq.html#weverything)". +

+ +
+## Disabling warnings +
+ +

+If you do have to disable warnings due to `-Weverything` automatically being +included, you might wish to state this fact in your `remarks.md` file. +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` file, which OS, OS version, compiler and compiler version +that has such a 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 +``` + +

+**NOTE**: just because we offer a default way to use the `-D` option, we still +do not like excess use of `-D` to get past size limits, especially since you +could use `#define` in your code instead. +

+ +
+## 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. +

+ + + +
+# General Guidelines +
+
+ +# General Overall Guidelines + +These [guideline](guidelines.html) are **hints** and **suggestions**, **NOT** [IOCCC rules](rules.html). + +While submissions that violate [guideline](guidelines.html) are allowed, +submissions that remain within the [IOCCC guidelines](guidelines.html) are preferred. + +You are encouraged to review the following [FAQs](../faq.html): + +* [How to enter the IOCCC](../quick-start.html#enter) + +* [Obtaining and compiling the most recent mkiocccentry toolkit](../faq.html#mkiocccentry) + +* [How to upload your submission](../next/submit.html) + +While the contest is **[open](../faq.html#open)**, you may modify your +previously uploaded submission by rebuilding your submission with the +[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry), +and then re-uploading it to **the same slot number** on the +[submit server](https://submit.ioccc.org). + +The **official locale** of the **IOCCC** is **C**. + +You are **encouraged** to examine the [winners of previous contests](../years.html). + +Because [rules](rules.html) change from year to year, some [winning entries](../years.html) +of the past may be rejected this year. + +What was _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: + +* look at the original source +* C pre-process the source ignoring `#include` lines +* C pre-process the source ignoring `#define` _and_ `#include` lines +* run it through a C beautifier (such as `clang-format(1)`) +* examine the algorithm +* compile it (with flags to enable all warnings) +* execute it + +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 as in certain cases, +a test is not important. + +Submissions that compete for the +'**strangest/most creative source layout**' need not do as well as +others in terms of their algorithm. + +Given two submissions, we are more inclined to pick the submission that +does something interesting when it's executed. + +**IMPORTANT:** Be sure that **your submission works** as documented in your `remarks.md` file. + +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 otherwise excellent submissions +fall down because they didn't work as documented. + +If you submission has bugs and/or mis-features, you are **MUCH BETTER** off +documenting such bugs and/or mis-features in your `remarks.md` file. + +Consider an example of a [prime number](https://en.wikipedia.org/wiki/Prime_number) +printing program that claims that 16 is a prime number. +Noting such a bug in your `remarks.md` file could save your submission: + +> "_this submission sometimes prints the 4th power of a prime by mistake_" + +Sometimes a strange bug or (mis-)feature can even help the submission! Of course, a correctly +working submission might be better. + +We tend to look down on a +[prime number](https://en.wikipedia.org/wiki/Prime_number) +printer that claims that 16 is a prime number. +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**. + +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 **VERY GOOD START** +to a great submission! + + +Jump to: [top](#) + + +
+
+ +# OUR LIKES AND DISLIKES: + +We **VERY MUCH LIKE** submissions that use an edited variant of the +example Makefile, as described and linked to in the [Makefile section](#makefile), +renamed as `Makefile` of course. This makes it easier for the [IOCCC judges](../judges.html) +to test your submission. And if your submissions wins, it makes it easier to integrate it into +the [Official IOCCC winner website](https://www.ioccc.org/index.html). + +We **VERY MUCH LIKE** submissions that have some educational value. This does **NOT** mean +that your submission should not be obfuscated but rather that the IOCCC has moved away from +the idea of "spoilers". You should not encrypt or rot13 content in your `remarks.md` file. + +It is **VERY MUCH** appreciated if your remarks have some educational +value. And although educational value is not required, it is an +**EXCELLENT** 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): + +- [view example try.sh](%%REPO_URL%%/next/try.sh) +- download example try.sh + +- [view example try.alt.sh](%%REPO_URL%%/next/try.alt.sh) +- download example try.alt.sh + +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](../faq.html#try_scripts)". + +

+Even if it only has one invocation we still **LIKE** the try scripts. +

+ +

+If you do include a `try.sh` then **PLEASE** remove the `try` rule in the Makefile. +

+ +

+If you do include a `try.alt.sh` then **PLEASE** remove the `try.alt` rule in the Makefile. +

+ +

+If you don't have a prog.alt.c, then **PLEASE** remove the `try.alt` rule as well. +

+ +Doing masses of `#define`s to obscure the source has become 'old'. We +tend to 'see thru' masses of `#define`s due to our pre-processor tests +that we apply. Simply abusing `#define`s 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, and in order to get older +IOCCC winning entries that did this to compile, we had to update them to not do this. + +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`. **Hint!** + +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: + +``` + int main() { +| void please_dont_submit_this() { +| printf("The machine that goes BING!!\n"); + } +| please_dont_submit_this(); + } +``` + +On 2012 July 20, the [IOCCC judges](../judges.html) 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`. + +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**: + +* 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 **`. + +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. + +

+Using a mass of `goto`s to obfuscate your code has become 'old' and is unlikely +to make it through the final rounds, if it even gets that far. +

+ +On 28 January 2007, the Judges rescinded the requirement that the +`#` in a C preprocessor directive must be the 1st non-whitespace byte. + +The `exit(3)` function returns `void`. Some broken systems have `exit(3)` +return `int`; your submission should assume that `exit(3)` 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** to **132** +bytes long. Going well beyond **132** bytes is a bit too long to be called +a one-liner in our vague opinion. + +We tend to **DISLIKE** programs that: + +* are very hardware specific +* are very OS version specific (`index(3)`/`strchr(3)` differences are OK, but +sockets/streams specific code is likely not to be) +* dump core or have compiler warnings (it is OK only if +you warn us in your `remarks.md` file) +* won't compile or run in a [Single UNIX +Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification) +environment +* depend on a utility or application not normally found +in systems that conform to the [Single UNIX +Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification) +* abuse the build file to get around the size limit +* obfuscate by use of ANSI trigraphs +* obfuscate by use of digraphs +* are larger than they need to be +* have more lines than they need to have +* are "blob-ier" (just a pile of unformatted C code) than they need to be +* are rather similar to **[previous winners](../years.html)** :-( +* are **identical** to **[previous losers](https://en.wikipedia.org/wiki/Null_device)** :-) +* that mandate the exclusive use of a specific Integrated Development Environment (IDE) + +In order to encourage submission portability, we **DISLIKE** submissions 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. + +The program must compile and link cleanly in a [Single UNIX +Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification) +environment. Therefore do not assume the system has a +[windows.h](https://en.wikipedia.org/wiki/Windows.h) include file: + + +``` + #include /* 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. + +The `Makefile` 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 line 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. + +Your source code, post-pre-processing, should not exceed the size of +[Microsoft Windows](https://en.wikipedia.org/wiki/Microsoft_Windows). :-) + +You should try to restrict commands used in the build file to commands found in +[Single UNIX +Specification](https://en.wikipedia.org/wiki/Single_UNIX_Specification) +environments and systems that conform to the [Single UNIX +Specification](https://en.wikipedia.org/wiki/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.). + +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 your `remarks.md` file for +alternate / human intervention based building. + +We want to get away from source that is simply a compact blob of +bytes. **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** submissions 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! +Remember, you can submit more than one submission. See the +[IOCCC rules](rules.html) +for details (in particular, +[Rule 8 - Submitting requirements](rules.html#rule8-submitting-requirements)). + +We suggest that you avoid trying for the '**smallest self-replicating**' +source. The smallest, a [zero byte entry](../1994/smr/index.html), won in +[1994](../years.html#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](#makefile)), 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 */ +``` + +X client submissions 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](https://www.w3.org/standards/). +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 submissions 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"](../faq.html#Xorg_deprecated)" +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 in +some way or another. + +We **DISLIKE** submissions 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. + +X client submissions 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 submissions 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](https://en.wikipedia.org/wiki/Single_UNIX_Specification). + +You are **well advised** to submit code that conforms to the [Single UNIX +Specification Version 4](https://unix.org/version4/overview.html). + +To quote the [IOCCC judges](../judges.html): + +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 OBFUSCATIONS!** **<== HINT!!** +* make us laugh and/or throw up :-) (humor really helps!) +* make us want to eat good chocolate + +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 +[IOCCC judges](../judges.html) as we might miss something and/or be too tired to +notice. + +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 a 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 submissions. 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 both BSD +and Linux curses. + +

+If you do `#include ` make **CERTAIN** you link in curses (i.e. +`-lcurses`) and not ncurses (i.e. `-lncurses`). +

+ +[Rule 12 - UTF-8](rules.html#rule12-utf8) +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**. + +While programs that only run in a specific word size are OK, if you have +to pick, choose a 64-bit word size. + +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](#makefile)). 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! + +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 [IOCCC judges](../judges.html) 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 [IOCCC judges](../judges.html) 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 [IOCCC judges](../judges.html) 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. + +We **DISLIKE** the use of ASCII tab characters in markdown files, such as in the required `remarks.md` file. + +We don't mind the use of 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 annoy us when it comes time to +rendering your markdown content as it complicates the process. + +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](../markdown.html) +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 4 - Required files](rules.html#rule4-required-files), +and the +FAQ on "[markdown](../faq.html#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 file for a reason. :-) + +Try to be even more creative! + + +Jump to: [top](#) + + +
+ +# Fun😄damental Guidelines + +The reason for the times of day are so that key IOCCC events are **calculated** +to be a **fun**ctional UTC time. :-) + +At least 2 of several reasons for selecting the prime, 2503, for +[Rule 2b - Net Size](rules.html#rule2b-net-size) +may be found on the ["Curios!" about 2503](https://t5k.org/curios/page.php/2503.html). + +The 2503 value for [Rule 2b - Net Size](rules.html#rule2b-net-size) is a decimal anagram +of the number of the kernel disk pack of one of the judge's [BESM-6](https://en.wikipedia.org/wiki/BESM-6). + +There may or may not be fewer than 2^7+1 reasons why these [IOCCC +guidelines](guidelines.html) seem obfuscated. + +Excessively "_dotty"_ use of the `chksubmit(1)` or `chkentry(1)` commands suggests that +either you like silly things, or that you "_RTFS"_ with some level of care. + +Some people might question what actually constitutes a valid JSON file, given +the state of the "_so-called_" JSON spec.. :-) + +We prefer programs that do not require a fish license: crayons and +cat detector vans not withstanding. + +

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

+ +While those who are used to temperatures found on [dwarf +planets](https://science.nasa.gov/dwarf-planets/) +(**yes Virginia, dwarf planets _ARE_ planets!**), such as +[Pluto](https://science.nasa.gov/dwarf-planets/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. + +At least one judge prefers to maintain the use of the +[leap-second](https://en.wikipedia.org/wiki/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**. + +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 [IOCCC judges](../judges.html), 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](https://science.nasa.gov/earth/). :-) +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 [IOCCC judges](../judges.html), 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](https://science.nasa.gov/earth/). :-) + +> You are in a maze of twisty _guidelines_, all different. + +There are at least zero [IOCCC judges](../judges.html) who think that +[Fideism](https://en.wikipedia.org/wiki/Fideism) has little +or nothing to do with the IOCCC judging process. + +> All generalizations are false, including this one. -- **Mark Twain** + +

+There are more than about 1 typos in this very sentence. +

+ +This could be the only _guideline_ that contains the word +[fizzbin](https://en.wikipedia.org/wiki/List_of_games_in_Star_Trek#Fizzbin). + +However, do you know how to play [fizzbin](https://en.wikipedia.org/wiki/List_of_games_in_Star_Trek#Fizzbin)? +You do?!? (Except on Tuesday?) + +OK, there are actually 2 _guidelines_ that contain the word +[fizzbin](https://en.wikipedia.org/wiki/List_of_games_in_Star_Trek#Fizzbin), +unless you count this one, in which case there are 3. :-) + +**NOTE**: The previous _guideline_ in this spot has been replaced by this _guideline_: + +

+> You very well might not be completely 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 or partly +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 (allegedly). +

+ +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. + +

+Please try to avoid this specific individual _guideline_, if it at all possible. +

+ +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. + +

+We do not recommend submitting [systemd](https://systemd.io) source code to the IOCCC, +if nothing else because that code is likely to exceed +[Rule 2 - Size](rules.html#rule2-size). +This isn't to say that another highly compact and obfuscated +replacement of `init(8)` would not be an interesting submission. +

+ +

+The +[mkiocccentry toolkit](https://github.com/ioccc-src/mkiocccentry) +is not an original work, unless you one of the +[several mkiocccentry toolkit contributors](https://github.com/ioccc-src/mkiocccentry/graphs/contributors). +in which case it is original! :-) +

+ +If the [IOCCC judges](../judges.html) 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 :-) + +Do not fear if you're not 100% sure of the significance of +`2305567963945518424753102147331756070` as it is not of prime importance: or is +it? :-) + + +Jump to: [top](#) + + +
+
+ +# FOR MORE INFORMATION: + +For questions or comments about the contest, see [Contacting the IOCCC](../contact.html). + +**Be SURE** to review the [IOCCC Rules and Guidelines](index.html) as they +may (and **often do**) change from year to year. + +**PLEASE** be sure you have the current [IOCCC rules](rules.html) and +[IOCCC guidelines](guidelines.html) prior to submitting to the contest. + +See the [Official IOCCC website news](../news.html) for additional information. + +For the updates and breaking IOCCC news, you are encouraged to follow +the [IOCCC on Mastodon](https://fosstodon.org/@ioccc). See our +FAQ on "[Mastodon](../faq.html#try_mastodon)" +for more information. Please do note that unless +you are mentioned by us you will **NOT** get a notification from the app _so you +should refresh the page **even if you do follow us**_. + +Check out the [Official IOCCC winner website](https://www.ioccc.org/index.html) in general. + +Consider joining the IOCCC discord community via this link: +[https://discord.gg/Wa42Qujwnw](https://discord.gg/Wa42Qujwnw) + +See the +FAQs on "[obtaining, compiling, installing and using the mkiocccentry tools](../faq.html#mkiocccentry)" +and the +FAQ on "[how to enter the IOCCC](../quick-start.html#enter)" +as that FAQ has important details on +[how to register](../next/register.html) +as well as +[how to upload your submission](../next/submit.html) for the IOCCC. + + +
+ + +Jump to: [top](#)