diff --git a/faq.md b/faq.md index d23a0b244..816313563 100644 --- a/faq.md +++ b/faq.md @@ -1,840 +1,163 @@ - - - +# FAQ Table of Contents -
IOCCC

-
The International Obfuscated C Code Contest

+## Section 0 - [History of the IOCCC](#faq0) -

-

-The judges | -IOCCC home page | -FAQ | -How to enter | -Contacting the IOCCC -

-IOCCC news | -People who have won | -Winning entries -

-Known Bugs & (Mis)features | -How to help | -Thanks for the fixes | -A bit of web site history -
+### FAQ 0.0 - [How did the IOCCC get started?](#faq0_0) +### FAQ 0.1 - [Why are some years missing IOCCC winners?](#faq0_1) +### FAQ 0.2 - [Why do some IOCCC winners receive the Grand Prize or Best of Show award?](#faq0_2) -
+## Section 1 - [Submitting entries to a new IOCCC](#faq1) + +### FAQ 1.0 - [What types of entries have been over-submitted to the IOCCC?](#faq1_0) +### FAQ 1.1 - [What should I put in my entry's Makefile?](#faq1_1) +### FAQ 1.2 - [May I use a different source or compiled filename than prog.c or prog?](#faq1_2) +### FAQ 1.3 - [What platform should I assume for my entry?](#faq1_3) + +## Section 2 - [IOCCC Judging process](#faq2) + +### FAQ 2.0 - [How many entries do the judges receive for a given IOCCC?](#faq2_0) +### FAQ 2.1 - [What should I put in the remarks.md file of my entry?](#faq2_1) +### FAQ 2.2 - [Why don't you publish non-winners?](#faq2_2) +### FAQ 2.3 - [How much time does it take to judge the contest?](#faq2_3) +### FAQ 2.4 - [How many judging rounds do you have?](#faq2_4) + +## Section 3 - [Compiling and running IOCCC winners](#faq3) + +### FAQ 3.0 - [What Makefile are available to build or clean up IOCCC winners?](#faq3_0) +### FAQ 3.1 - [Why doesn't this IOCCC winner compile?](#faq3_1) +### FAQ 3.2 - [Why does a IOCCC winner fail on my 64-bit system?](#faq3_2) +### FAQ 3.3 - [Why do some IOCCC winners fail to compile under macOS?](#faq3_3) +### FAQ 3.4 - [Why does clang or gcc fail to compile an IOCCC winner?](#faq3_4) +### FAQ 3.5 - [What is this cb tool that is mentioned in the IOCCC?](#faq3_5) +### FAQ 3.6 - [An IOCCC winner missed by my terminal application, how do I fix this?](#faq3_6) +### FAQ 3.7 - [How do I compile and use on macOS, an IOCCC winner that requires X11?](#faq3_7) +### FAQ 3.8 - [How do I compile an IOCCC winner that requires SDL1 or SDL2?](#faq3_8) +### FAQ 3.9 - [How do I compile and use on macOS, an IOCCC winner that requires sound?](#faq3_9) +### FAQ 3.10 - [Why do Makefiles use -Weverything with clang?](#faq3_10) + +## Section 4 - [Changes made to IOCCC winners](#faq4) + +### FAQ 4.0 - [Why are some winning author remarks incongruent with the winning IOCCC code?](#faq4_0) +### FAQ 4.1 - [Why were some calls to the libc function gets changed to use fgets?](#faq4_1) +### FAQ 4.2 - [What was changed in an IOCCC winner source code?](#faq4_2) +### FAQ 4.3 - [Why do author remarks sometimes not match the source?](#faq4_3) +### FAQ 4.4 - [What is the meaning of the file ending in .orig.c in IOCCC winners?](#faq4_4) + +## Section 5 - [Updating or correcting IOCCC web site content](#faq5) + +### FAQ 5.0 - [Why does an IOCCC winner fail to compile or or fail run?](#faq5_0) +### FAQ 5.1 - [How do I report a bug in an IOCCC winner?](#faq5_1) + +## Section 6 - [Miscellaneous IOCCC](#faq6) + +### FAQ 6.0 - [How did an entry breaks the size rule 2, win the IOCCC?](#faq6_0) +### FAQ 6.1 - [Is there a list of known bugs and misfeatures of IOCCC winners?](#faq6_1) +### FAQ 6.2 - [May I mirror the IOCCC web site?](#faq6_2) +### FAQ 6.3 - [May I use parts of the IOCCC in an article, book, newsletter, or instructional material?](#faq6_3) +### FAQ 6.4 - [Why do you sometimes use the first person plural?](#faq6_4) # The IOCCC FAQ -## Q: How many entries do you receive each year? +## Section 0: History of the IOCCC -By tradition, we do not say. +### FAQ 0.0: How did the IOCCC get started? -## Q: How many judging rounds do you have? +One day (1984 March 23 to be exact), Larry Bassel and I (Landon Curt +Noll) were working for National Semiconductor's Genix porting group, we +were both in our offices trying to fix some very broken code. -Are you trying to trick us? We will not say that either. +Larry had been trying to fix a bug in the classic Bourne shell (C code #defined +to death to sort of look like Algol) and I had been working on the finger +program from early BSD (a bug ridden finger implementation to be sure). +We happened to both wander (at the same time) out to the hallway +in Building 7C to clear our heads. -## Q: What are the general Makefile rules used in order to clean and build entries for use? +We began to compare notes: '_You won't believe the code I am trying to fix_'. -In general the best way to compile everything in an entry directory is to run: +And: '_Well you cannot imagine the brain damage level of the code I'm trying to +fix'_. -```sh -make clobber all -``` +As well as: '_It's more than bad code, the author really had to try to make it +this bad!_ -If you wish to compile every entry for every year you should go to the top level -directory and run the same command as above, `make clobber all`. +After a few minutes we wandered back into my office where I posted a +[flame to +net.lang.c](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=789%40nsc.UUCP&rnum=3&filter=0") +inviting people to try and out obfuscate the UN\*X source code we had just been working on. -The `all` rule will build everything necessary except for the alternate -versions. Every Makefile has an `alt` rule but it will only do something if an -alternate version exists. To build all the entries along with any alternate code -you can do from the top level directory: +BTW: I (Landon Curt Noll) had to post this [typo +correction](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=795%40nsc.UUCP&rnum=10&filter=0). +Thus began the tradition of putting typos in the contest rules and guidelines +... to make them more obfuscated of course! :-) -``` -make clobber everything -``` +BTW: This posting was made back in the days when AT&T was the evil giant. +Now, Microsoft makes AT&T look mild and kind in comparison. :-( (IMHO) ). -If you wish to only build alternate code you can do: +BTW: See the story about the '[Bill Gates](/1993/mills/README.md)' award. :-) -```sh -make clobber alt -``` +OK, back to the story. -If you wish to not remove the entry binaries and only compile the additional alt -versions: +We (Larry and I) received a number of entries by email. +When we began to receive messages from outside of the US, Larry and I +decided to include International in the name. -```sh -make alt -``` +The +[1st IOCCC winners](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=837%40nsc.UUCP&rnum=2&filter=0) +were posted on 17 April 1984. +There were 4 winners in 1984: -The following Makefile rules should be in all Makefiles: +1. [(dis)honorable mention](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=842%40nsc.UUCP&rnum=8&filter=0) +2. [3rd place](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=843%40nsc.UUCP&rnum=7&filter=0) +3. [2nd place](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=844%40nsc.UUCP&rnum=6&filter=0) +4. [1st place](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=845%40nsc.UUCP&rnum=5&filter=0) -- all: build the entry programs (main program and any supplementary program) -- alt: build alternate code -- clobber: clean up object files and all binary files (except for those that are -not compiled) -- clean: a simpler version of `clobber` that only removes object files. `make -clobber` depends on `clean` so running `make clobber` will invoke `make clean`. -- everything: equivalent to `make all alt`. +BTW: The (dis)honorable mention wished to remain anonymous. +While many have asked who it was, we have continued to follow the +author's wish to remain anonymous. -Are there any other rules? You tell us! +A few years ago, we asked the author if they still wanted to remain anonymous. +They said: '_Yes, I want to keep my anonymity. But you can tell them that I am well known for my connection to the +C language_'. It was not until 2001 that another [anonymous +entry](/years.html#2001_anonymous) received an award. -NOTE about the above rules: the Makefile default assumes `cc` which might be a -gcc-based compiler, or a clang-based compiler, or some other compiler. Only by -forcing `CC=clang` or `CC=gcc` will one invoke a specific compiler to, say, -enable or disable additional warnings or flags. Even so different versions or -compilers might do different things, have different defects or other issues. +BTW: The [1984 winner](/years.html#1984_mullender) remains one of my (Landon Curt Noll) all time favorites. +The name used in the posting of the [1st IOCCC +winner](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=837%40nsc.UUCP&rnum=2&filter=0) +posting was **I**nternational **O**bfuscated **C** **C**ode **C**ontest or +**IOCCC** for short. -## Q: How come some entries have code that is incongruent with what the author(s) wrote about the entry? +The posting said '_1st annual_', so in 1985 we held the [2nd IOCCC contest](/years.html#1985) +and the tradition continues as the longest running contest on the Internet. -It is very likely in this case that the code was fixed to work for modern -systems as part of the reworking of the website. If you have this problem in -some entries you should look at the original code as in `winner.orig.c` or -`prog.orig.c`. `winner` is the directory name. For instance, one of Landon's -favourite entries of all time is [1984/mullender](1984/mullender/README.md) and -the winner there would be `mullender`. Sometimes the original is in an alt -version like `winner.alt.c` or `prog.alt.c`. +P.S. Part of the inspiration for making the IOCCC a contest goes to the +[Bulwer-Lytton fiction contest](http://www.bulwer-lytton.com/). +P^2.S. See the [overall README](/all/README) for more details. -## Q: Why have some entries that originally used `gets()` been modified to use `fgets()`? Doesn't this tamper with the entry too much? -A fine line indeed has to be drawn here but it was decided that it is worth it -because of alarming warnings that can be displayed, in some systems at runtime -interspersed with the output of the program. +### FAQ 0.1: Why are some years missing IOCCC winners? -For instance in macOS the entry [1990/tbr](1990/tbr/README.md) would output the -warning in such a way that caused confusing output for the entry, looking like: +Some years, such as 1997, 1999, 2002-2003, 2007-2010, 2016-2017, 2021-2023, no IOCCC was held. -```sh -$ ./tbr -$ warning: this program uses gets(), which is unsafe. -# nothing here, what to do? -``` +While we try to hold the IOCCC every year, sometime the other demands on the IOCCC judges +so not permit us to hold a new IOCCC. -In some cases changing the code to use `fgets()` is not so easy to fix and in -one case at least there is an alternate version that has the fix instead due to -a problem it creates (correct output but segfaults after the output in one of -the forms of input). +The pause during the 2021-2023 period was due to the IOCCC judges developing tools to +make is much more likely for the IOCCC to be held in a yearly basis later on. -In some cases it is not possible to fix or at least it is highly unlikely and so -those have mainly not been touched except one that has had the buffer size -increased (which could be done for others that are not possible to change to -`fgets()` though this has not been done). -Some entries can be made to look almost identical to the original entry. For -instance the fix to [1988/reddy](1988/reddy/README.md) required only a single -`#define` be added. +### FAQ 0.2: Why do some IOCCC winners receive the Grand Prize or Best of Show award? -In the future we, the judges, would prefer that entries use `fgets()` to prevent -these problems. - -NOTE: due to 'compatibility reasons' `fgets()` stores the newline and `gets()` -does not. We're not sure how this is compatibility but either way it can cause a -problem and it is this that has complicated most of the fixes though again some -can look almost identical. - - -## Q: How can I easily see what was changed in order to get an entry to work in modern systems? - -Although the [thanks-for-fixes.md](/thanks-for-fixes.md) file sometimes gives -commands to tell you how to do this, we have set up make rules to easily do -this. For these you should be in the directory of the entry you wish to see the -diff output of. - -When we say `entry` below, in a file name, we mean either the winner name or -`prog`. For instance one of Landon's all time favourite entries is -[1984/mullender](1984/mullender/README.md) so the file names would be: -`mullender.orig.c`, `mullender.alt.c` and `mullender.c`. For later years, it -would be instead `prog.orig.c`, `prog.alt.c` and `prog.c`. - -The following `make` rules exist to make a difference: - -* `make diff_orig_prog`: - - This rule will show the diff of the _original_ source to the - current source (that is `entry.orig.c` to `entry.c`). -* `make make diff_alt_orig`: - - This rule will show the diff of the alt code to the original - code (that is `entry.alt.c` to `entry.orig.c`). If no alt code exists - nothing will be shown. -* `make diff_alt_prog`: - - This rule will show the diff of the alt code to the entry as it - stands (that is `entry.alt.c` to `entry.c`). -* `make diff_orig_alt`: - - This rule will show the diff of the original code to the alt code - (that is `entry.orig.c` to `entry.alt.c`). -* `make diff_prog_alt`: - - This rule will show the diff of the entry to the alt code (that is - `entry.c` to `entry.alt.c`). -* `make diff_prog_orig`: - - This rule will show the diff of the entry to the original code (that is - `entry.c` to `entry.orig.c`). - - -Note that you might see something like: - -``` -make: [Makefile:170: diff_orig_prog] Error 1 (ignored) -``` - -at the end of the output but this is completely normal if there are differences. - -If the alt code is the same as the original, say with -[1984/anonymous](1984/anonymous/README.md), then naturally there is no point in -running the rule and the same applies for all the other rules but this system -allows for easily seeing the diffs. - -As some examples we'll first look at one that has really long lines which -will make it harder to see what is different, -[2001/anonymous](2001/anonymous/README.md). What you would do is `cd -2001/anonymous` and then do: - -```sh -make diff_orig_prog -``` - -and then be really confused! :-) - -But for an entry like [1991/dds](1991/dds/README.md), you can see the -differences much more easily. `1991/dds` is a good example where it's very -simple to see what is different as it's just a couple lines. - -You might be quite surprised how little some entries had to be changed and at -the same time how much other entries had to be changed, often with quite complex -differences! In some cases if the line is rather long, like the above mentioned -one, it will be harder to see what changed but in other cases like -[1984/decot](1984/decot/README.md) or [1986/wall](1986/wall/README.md) it's a -lot easier. - -Well, at least it's easier see the differences on a line-by-line basis but maybe -not what actually changed, especially since it's easier to know what was fixed -when you have compiler errors :-) (though there are, as noted, some examples -where it's quite easy to see the differences). - -[1991/dds](1991/dds/README.md) is also a good example to see the alt difference -very easily. To do that `cd 1991/dds` and then do: - -```sh -make diff_alt_prog -``` - -and you'll see a single line changed and very simply. - - -### Tip: if you have `colordiff` installed it's a lot easier to see the differences - -To use these rules but provide a different `diff`, for instance `colordiff`, -just do: - -```sh -make DIFF=colordiff diff_orig_prog # for orig to prog diff -make DIFF=colordiff diff_alt_prog # for alt to prog diff -``` - -Obviously if you want to view the alt code or the orig code you can just open -the files as described above. - - -## Q: Sometimes the author's or authors' remarks do not match the source! Why and what can I do about it? - -This is very likely to happen when an entry was fixed for modern systems. When -you look at the remarks of the author you should look at the `prog.orig.c` or -the `winner.orig.c` file. You might also find value in the above `diff` make -rules. - - -## Q: I cannot get entry XYZZY from year 19xx to compile! - -Some winners, particularly winners from long ago, no longer compile on more -modern systems because the C language has evolved (i.e. the modern C compilers -are much more strict in what they accept as a valid program), or the entry -depended on operation system and library features that where common back then -but are different/missing today. - -E.g. it is highly unlikely that you'll be able to execute -[1984/mullender](years.html#1984/mullender) on a computer you're using to read -this FAQ. However for that entry [Cody Boone -Ferguson](/winners.html#Cody_Boone_Ferguson) added alternative code so that you -can enjoy this entry. Try: - -```sh -make alt -./mullender.alt [microseconds] -./mullender.alt2 [microseconds] -``` - -The microseconds defaults to 10000 but has a minimum value of 1000. The -`mullender.alt2` is like the first alt except that it will start over once the -program times out. - -Thank you Cody! - -See also [Yusuke Endoh](/winners.html#Yusuke_Endoh)'s entry -[2015/endoh3](/2015/endoh3/README.md) which lets one compile it and run -it. Another entry that you can enjoy it under is [Christopher -Mill](/winners.html#Christopher_Mills)'s entry -[2018/mills](/2018/mills/README.md) which is a PDP-7 emulator as well as a -PDP-11/40 emulator. - -Others are not so easy though we're working on this and over time have added -alternative code and/or fixed them. Most entries do now work and the others we -are working on (slowly as other things are also being done and this is on free -time). - -In some cases we replaced the original code (not the `.orig.c` file!) with code -that works for modern systems but one can view the original code in the -`.orig.c` files (sometimes the original code is also in the directory as a -`winner.alt.c` or `prog.alt.c`). - -Some entries should not have modern system versions replaced. See below. - - -## Q: I can't get some entries to work in 64-bit systems that don't support 32-bit! - -Unfortunately some older entries are non-portable and require 32-bit support or -32-bit binaries. A problem system here is macOS Catalina (10.15) as as of that -version macOS no longer supports 32-bit binaries. If the entry acts on a certain -type of binary, say ELF, then that will also be a problem depending on the -entry. For example [2001/anonymous](2001/anonymous/README.md) requires 32-bit -ELF binaries. - -There are numerous example entries that require 32-bit binaries. We have tried -to note these in both the respective Makefiles and README.md files but it is -possible that some were missed. These entries are very likely in the -[bugs.md](/bugs.md) file and we welcome any help in making an alternate version -for 64-bit systems. Many were fixed to work with modern systems but some are -supposed to only work with 32-bit systems so any updated version of these -entries should be an alternate version. - -Other entries like [2001/herrmann2](/thanks-for-fixes.md#2001herrmann2-readmemd) -now work with 32-bit AND 64-bit systems. - - -## Q: Under macOS I can't compile some entries and/or they don't work right. Why? - -If the entry requires gcc and you did not explicitly install gcc in macOS you -will not be able to run or use these entries. This is because macOS gcc is -actually clang, even `/usr/bin/gcc`. - -That being said many (if not most) of these entries have been fixed and some -others will be looked at, when found. - -See also below. - - -## Q: I can't get XYZZY entry to compile with clang. What can I do? - -Although we have fixed numerous entries to work with clang (sometimes in an alt -version but usually in the program itself) there are some that simply cannot be -fixed or if they are fixable they have not yet been fixed (we are working on -this but other things have to be done too and all on free time). - -This is because clang has some defects where the args of main() are required to -be a specific type and some versions of clang allow only 1, 2 or 3 args, not 4, -to main(). In the case of types of args many were changed to the right type and -then what was main() became another function of the original main() type. - -At the same time some entries are not designed to work with clang. There might -be alternate code added at some point but as above this depends on free time and -other things that have to be done plus remembering to do it. - - -## Q: What is `cb` that is mentioned in some of the older entries? - -This was a C beautifier for Unix, both AT&T and Berkeley, but it seems to no -longer be available, code wise, except for Plan 9, but Plan 9 was never used for -judging the IOCCC. A Unix man page for `cb` -[still exists](https://www.ibm.com/docs/en/aix/7.3?topic=c-cb-command). - - -## Q: After running a program my terminal is all messed up! How do I restore my terminal? - -The simplest way to do this is to type `reset`. If echo was disabled you can get -usually away with `stty echo`. Sometimes you can also get away with `stty sane`. -`reset` does the most but note that it will clear the screen (obviously `clear` -will too but it won't reset the terminal). - - - -## Q: How do I get X11 entries to work with macOS? - -As an example we will use [1993/jonth](1993/jonth/README.md) which works well -with macOS. - -First of all you will need to install the [most recent -XQuartz](https://www.xquartz.orgl), preferably on an [Apple supported version of -macOS, preferably the most recent version](https://support.apple.com/macos). -Then open the "XQuartz" application (usually located in -`/Applications/Utilities/XQuartz.app`) by typing at the command line: - -```sh -open /Applications/Utilities/XQuartz.app -``` - -With the "XQuartz" application open you will get an [X Window System -Manager](https://www.x.org/wiki/) launched with an [Xterm window -shell](https://en.wikipedia.org/wiki/Xterm) started: - -xterm-launch in macOS - -At this point you need to cd to the winning directory and compile it. For example: - -compiling an entry in xterm in macOS - -And then run the program as directed by the `README.md` file. For example with -`1993/jonth`: - -running 1993/jonth in macOS - -Note that you can compile the code in your regular terminal prior to opening -XQuartz, should you wish to. - - -## Q: How do I compile and run entries that use SDL1/SDL2 ? - -This depends on your operating system but below are instructions for linux and -macOS with alternative methods for macOS and different package managers with -linux. - - -### Red Hat based linux - -Execute one of the following as root or via sudo: - -```sh -dnf install SDL2 SDL2-devel sdl12-compat sdl12-compat-devel -yum install SDL2 SDL2-devel sdl12-compat sdl12-compat-devel -``` - -In the past it was said that one might need to run `make` like: - -```sh -make ... SDL2_INCLUDE_ROOT=/usr -``` - -or set the following environment variable: - -```sh -export SDL2_INCLUDE_ROOT=/usr -``` - -but this might not be necessary in more modern days especially as we use -`sdl-config` and `sdl2-config` which should find the proper paths. - - -### Debian based linux - -Execute the following as root or via sudo: - -```sh -apt install libsdl1.2debian libsdl1.2-dev libsdl2-dev -``` - -and then try `make all` again. - -In the past it was said that one might need to run `make` like: - -```sh -make ... SDL2_INCLUDE_ROOT=/usr -``` - -or set the following environment variable: - -```sh -export SDL2_INCLUDE_ROOT=/usr -``` - -but this might not be necessary in more modern days especially as we use -`sdl-config` and `sdl2-config` which should find the proper paths. - - -### Other linux distributions - -Use your package manager to install the appropriate packages. Try the search -feature of the package manager to determine which packages you need to install. -Note that you might have to install both the library and the developmental -packages: one for compiling and one for linking / running. - - -### macOS - -If you're using macOS there are at least three ways to obtain it. You can -download it from the SDL website and install the package. That will not -work well for the IOCCC but these will: - - -#### MacPorts - -If you haven't already, install -[MacPorts](https://www.macports.org/install.php). Then run: - - -```sh -sudo port install libsdl libsdl2 -``` - - -#### Homebrew - -If you have not already done so, install [Homebrew](https://brew.sh). - -Then to install SDL and SDL2, execute the following command: - -```sh -brew install sdl2 sdl12-compat -eval "$(/opt/homebrew/bin/brew shellenv)" -``` - -### NOTE: there might be extra SDL packages required - -In the case that some entries do not work even with SDL1/SDL2 installed it might -be that you need additional SDL libraries. See the entry's README.md for -details. If something is not noted you're welcome to report it as an issue or -fix it and make a new pull request. - - -## Q: How do I compile and run entries that use sound in macOS? - -This might depend on the entry but in some cases like -[2001/coupard](2001/coupard/coupard.c) one needs to do more work in order to get -it to work. In this case you should be able to use the Swiss Army Knife of sound -processing programs, [SoX](https://sox.sourceforge.net). To install this easily -you can use either MacPorts or Homebrew. See below for instructions for each. - -Usually the README.md file will explain how to use it in linux so we do not -include this here, at least for now. - - -### MacPorts - -If you haven't already, install -[MacPorts](https://www.macports.org/install.php). Then run: - - -```sh -sudo port install sox -``` - - -### Homebrew - -If you have not already done so, install [Homebrew](https://brew.sh). - -Then to install SoX, execute the following command: - -```sh -brew install sox -eval "$(/opt/homebrew/bin/brew shellenv)" -``` - - -## Q: How did entry XYZZY win? It breaks rule 2! - -As entries have been fixed it is entirely possible that some of the entries no -longer fit within the year's size restrictions. Invariably the length of columns -and/or number of rows have also changed. - -The `winner.orig.c` file contains the original source code that was -subjected to rule 2 of the given IOCCC. You may also wish to see -the [/archive](/archive) directory where you can find all the -original winning entries as compressed tar files for a given year. - -In some cases the entry may have abused rule 2 and declared an -"abuse of the rules" (although now blatant abuse of the rules to -get around rule 2 size limits is discouraged). - - -## Q: I found a bug in a previous winner, what should I do? - -We do not 'maintain' the contest winners as such. The code is made available on an 'AS -IS' basis. If you have a FIX for an entry, we suggest that you try and email it -to the authors and to submit your fixes in a [GitHub pull -request](https://github.com/ioccc-src/temp-test-ioccc/pulls) (with ONE PULL -REQUEST *PER* FIX, please!). - -Note that just because you have a fix does not mean it'll be accepted. This -might be because the author objects or it doesn't fit in some way or another. Of -course if the entry does not work we'll certainly be more inclined to accept the -fix. If it is accepted we'll be happy to credit you in the entry's _README.md_ -file. If you're a previous winner we will happily link to your entries; if -you're not we can link to your website if you wish. - -More generally please see the file [how-to-bugfix.md](/how-to-bugfix.md). Note -that this file is not a tutorial on how to fix X, Y and Z problems but rather -what to do to get the fix in. - - -## Q: Do you have a list of entries with known problems and/or features that might appear to be bugs but are not? - -Yes! Please see [bugs.md](/bugs.md) for a list of known bugs and/or issues of a -variety of kinds. - -Note that just because an entry is not in the bugs file does not mean there is -not an issue and note that some issues are simply missing files, dead URL(s) or -something like that. - - -## Q: Are there types of entries that are submitted so frequently that the judges get tired of them? - -Yes, there are types of entries that show up over and over again. - -The [guidelines](guidelines.html) say: - -> _We tend to dislike programs that: are similar to previous winners_ - -We like variety. However too often we see (please look at the winning examples -given to be aware of the level of the competition): - - -### maze generator -- [1985/shapiro](years.html#1985_shapiro) - -- [1991/buzzard](years.html#1991_buzzard) - -- [1995/cdua](years.html#1995_cdua) - -- [1995/dodsond2](years.html#1995_dodsond2) - -- [1998/bas1](years.html#1998_bas1) - - -### tic-tac-toe/noughts and crosses/Xs and Os game - -- [1991/westley](years.html#1991_westley) - -- [1996/jonth](years.html#1996_jonth) - -- [2020/carlini](years.html#2020_carlini) - - -### solitaire/Othello game - -- [1987/lievaart](years.html#1987_lievaart) - -- [1994/dodsond1](years.html#1994_dodsond1) - - -### generating small primes (below is the list of all prime related winners) - -- [1985/august](years.html#1985_august) - -- [1988/applin](years.html#1988_applin) - -- [1994/weisberg](years.html#1994_weisberg) - -- [1995/makarios](years.html#1995_makarios) - -- [1996/dalbec](years.html#1996_dalbec) - -- [2000/bellard](years.html#2000_bellard) - -_As you can see, just a list of primes (let alone small primes) does not cut it -anymore._ - - -### self reproducing program - -- [1990/scjones](years.html#1990_scjones) - -- [1994/smr](years.html#1994_smr) - _do not claim your program is the smallest one without seeing this! - -- [2000/dhyang](years.html#2000_dhyang) - _unless you beat this one, your chances are slim_ - - -### entries that just print "Hello, world!" - -- [1984/anonymous](years.html#1984_anonymous) - -- [1985/applin](years.html#1985_applin) - -- [1986/applin](years.html#1986_applin) - -- [1986/holloway](years.html#1986_holloway) - -- [1989/jar.1](years.html#1989_jar.1) - -- [1992/lush](years.html#1992_lush) - -- [2000/tomx](years.html#2000_tomx) - -_**...it's so 20th century...**_ - - -### entries that use some complex state machine/table to print something - -- [1988/isaak](years.html#1988_isaak) - -- [1988/phillipps](years.html#1988_phillipps) - -- [2018/ciura](years.html#2018_ciura) - -- [2018/giles](years.html#2018_giles) - - -### rot13 - -- [1985/sicherman](years.html#1985_sicherman) - -- [1989/westley](years.html#1989_westley) - -- [1990/dg](years.html#1990_dg) - -- [1991/fine](years.html#1991_fine) - - -### **pi** or **e** computation - -- [1986/august](years.html#1986_august) - -- [1988/robison](years.html#1988_robison) - -- [1988/westley](years.html#1988_westley) - -- [1989/roemer](years.html#1989_roemer) - - -#### Hints on overused themes - -HINT: It is not fatal to send in those types of entries, it is just MUCH -HARDER to win. Such an entry would have to do something _really unique **AND** -interesting_ to even make it into the final judging rounds. Entries that -reuse these 'worn out' themes frequently lose to other entries that do -something different. - -HINT: If you really MUST send in an entry based on an 'overused theme', be sure -that it is obfuscated in several new and novel ways. Be sure to _clearly_ -explain near the beginning of your remarks why you are submitting a entry based -on an 'overused theme' and why the judges should not simply toss it out as being -boring. - - -## Q: What should I write in the 'remarks' (remarks.md) section of my entry, if anything at all? - -As much or as little as you wish. - - -### What helps: - -- explaining what your entry does - -- how to entice it to do what it is supposed to do - -- what obfuscations are used - -- what are the limitations of your entry in respect of portability and/or input data - -- how it works (if you are really condescending) - - -### What does not help: - -- admitting that your entry is not very obfuscated (you see, the contest is -called the **IOCCC**, not the **INVOCCC** :-) ); but even if you do not admit -it, not very obfuscated entries have a minuscule chance to win (although -[2000/tomx](years.html#2000_tomx) is a notable counterexample). - -- mentioning your name or any identifying information in the remark section (or -in the C code for that matter) - we like to be unbiased during the judging -rounds; we look at the author name only if an entry wins. See the guidelines if -this is not clear! - -- leaving the remark section empty. - - -## Q: I am confused: what should I put to the 'build' section? - -The 'build' section must contain UNIX shell-style commands to compile your C -language entry **in a file named prog.c** and produce an executable file. More -than one command is allowed, as far as the size rule is followed. Usually one -(or more) of these commands will be an invocation of a C compiler (use **cc** or -**gcc**), but there may be exceptions (or not anymore, see -[2000/tomx](years.html#2000_tomx)). - -If your entry depends on a particular source file name during compilation or execution, you will have to put a line - - - cp prog.c desired_name.c - - -before the compiler invocation line. - - -If in doubt, put - - cc -o prog prog.c - -in the 'build' section. - -Note however that with the [mkiocccentry -tool](https://github.com/ioccc-src/mkiocccentry) we have an example Makefile -which you should update and submit, using the instructions above if necessary. - - -## Q: What happened to the winners for 1997, 1999 2002, 2003, 2007 - 2010, 2016, 2017, 2021 and 2022 ? - -There are none. There was no IOCCC in those years. - - -## Q: What are the .orig.c files in the directories in winning entries ? - -Due to the fact that the original code has sometimes had to change these files -are the original winning entry or as close to as possible to the original that -we can find. - - -## Q: Why don't you publish non-winners? - -Because the publication on the IOCCC site **_IS_** -the award! Anyone is free to put their IOCCC hopefuls, lookalikes and/or -non-winners on their web page for everyone to see. - - -## Q: How much time does it take to judge the contest? - -It takes a fair amount of time to setup, run, answer email, process entries, -review entries, trim down the set entries to a set of winners, doing the -write-up of the winners, announcing the winners, reviewing final edits of the -winning entry set, posting the winners, being flamed :-), tell folks who send in -late entries to wait until the next contest, etc... It takes a few weekends and -a number nights of study and work ... which is hard given that we are busy with -many other activities as well. - -Note that we do not contact the author if an entry does not compile or does not -work as advertised, we might attempt to fix obvious compilation problems or -incompatibilities, but no more than that - so be sure that your entry does work -on at least a couple different platforms, at least one of them being UNIX or -POSIX-conforming. - - -## Q: What platform should I assume for my entry? - -Your entry must compile with GCC and run under at least one flavor of UNIX (e.g. -Linux or Solaris). To improve chances to win, it should work under both BSD and -SysV style UNIX (think **stty cbreak**), and should not depend on endianness. -If it can compile and run on Windows and/or Mac (see -[2000/thadgavin](/years.html#2000_thadgavin) for one example, amongst others), -even better. Being able to compile with other compilers like clang is also a -good thing. - - -## Q: I would like to mirror the IOCCC web site. May I do so? - -We are not accepting mirror requests at this time, sorry. - - -## Q: I want to publish some parts of the IOCCC in an article, or book, or newsletter, or use then in class/instructional notes, or quote from the IOCCC. May I do so? - -Please ask the [IOCCC judges](/judges.html) first. Please send your request using the -instructions on the [contacting the IOCCC Judges](/contact.html) page. - - -## Q: What are the grand prize / Best of Show winners? +In some years, the IOCCC judges discover a truly amazing IOCCC winner that +stands out among all of the other IOCCC entries received that year. +For such an IOCCC winner, the IOCCC judges award a "Grand Prize" +or "Best of Show award. In 1984-1987, the grand prize winners are: @@ -882,183 +205,644 @@ These could be considered the 'best entry' for those years with 1 or more other entries that came in close behind. -## Q: I managed to get entry XYZZY from year 19xx to compile; now it fails to run! +## Section 1: Submitting entries to a new IOCCC -switch(19xx/XYZZY) { - case [1984/mullender](years.html#1984_mullender): +### FAQ 1.0: What types of entries have been over-submitted to the IOCCC? -try the alternative code added by [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) like: +There are types of entries that show up over and over again. The +IOCCC judges, and we suspect the public that enjoy viewing the +results of the IOCCC, like variety. + +While it is possible to win a new IOCCC with one of these +__over-submitted__ types of entries, level of the competition from +previous IOCCC winners make it more challenging to be successful. + + +It is also important to note that the [guidelines](guidelines.html) say: + +> _We tend to dislike programs that: are similar to previous winners_ + + +#### maze generator +- [1985/shapiro](years.html#1985_shapiro) + +- [1991/buzzard](years.html#1991_buzzard) + +- [1995/cdua](years.html#1995_cdua) + +- [1995/dodsond2](years.html#1995_dodsond2) + +- [1998/bas1](years.html#1998_bas1) + + +#### tic-tac-toe/noughts and crosses/Xs and Os game + +- [1991/westley](years.html#1991_westley) + +- [1996/jonth](years.html#1996_jonth) + +- [2020/carlini](years.html#2020_carlini) + + +#### solitaire/Othello game + +- [1987/lievaart](years.html#1987_lievaart) + +- [1994/dodsond1](years.html#1994_dodsond1) + + +#### generating small primes (below is the list of all prime related winners) + +- [1985/august](years.html#1985_august) + +- [1988/applin](years.html#1988_applin) + +- [1994/weisberg](years.html#1994_weisberg) + +- [1995/makarios](years.html#1995_makarios) + +- [1996/dalbec](years.html#1996_dalbec) + +- [2000/bellard](years.html#2000_bellard) + +_As you can see, just a list of primes (let alone small primes) does not cut it +anymore._ + + +#### self reproducing program + +- [1990/scjones](years.html#1990_scjones) + +- [1994/smr](years.html#1994_smr) - _do not claim your program is the smallest one without seeing this! + +- [2000/dhyang](years.html#2000_dhyang) - _unless you beat this one, your chances are slim_ + + +#### entries that just print "Hello, world!" + +- [1984/anonymous](years.html#1984_anonymous) + +- [1985/applin](years.html#1985_applin) + +- [1986/applin](years.html#1986_applin) + +- [1986/holloway](years.html#1986_holloway) + +- [1989/jar.1](years.html#1989_jar.1) + +- [1992/lush](years.html#1992_lush) + +- [2000/tomx](years.html#2000_tomx) + +_**...it's so 20th century...**_ + + +#### entries that use some complex state machine/table to print something + +- [1988/isaak](years.html#1988_isaak) + +- [1988/phillipps](years.html#1988_phillipps) + +- [2018/ciura](years.html#2018_ciura) + +- [2018/giles](years.html#2018_giles) + + +#### rot13 + +- [1985/sicherman](years.html#1985_sicherman) + +- [1989/westley](years.html#1989_westley) + +- [1990/dg](years.html#1990_dg) + +- [1991/fine](years.html#1991_fine) + + +#### **pi** or **e** computation + +- [1986/august](years.html#1986_august) + +- [1988/robison](years.html#1988_robison) + +- [1988/westley](years.html#1988_westley) + +- [1989/roemer](years.html#1989_roemer) + + +#### Hints on overused themes + +HINT: It is not fatal to send in those types of entries, it is just MUCH +HARDER to win. Such an entry would have to do something _really unique **AND** +interesting_ to even make it into the final judging rounds. Entries that +reuse these 'worn out' themes frequently lose to other entries that do +something different. + +HINT: If you really MUST send in an entry based on an 'overused theme', be sure +that it is obfuscated in several new and novel ways. Be sure to _clearly_ +explain near the beginning of your remarks why you are submitting a entry based +on an 'overused theme' and why the judges should not simply toss it out as being +boring. + + +### FAQ 1.1: What should I put in my entry's Makefile? + +We recommend starting with the [sample +Makefile](https://github.com/ioccc-src/mkiocccentry/blob/master/Makefile.example) +as found in the [mkiocccentry GitHub repo](https://github.com/ioccc-src/mkiocccentry), +(renamed as `Makefile` of course) as a starting point for your +entry's `Makefile`. + +The `Makefile` is a file used by the `make(1)` command that contains +rules and UNIX shell-style commands. + +The first and default rule should be the "all" rule and should build your entry's executable file. + +If your entry depends on a particular source file name during compilation or execution, +your `Makefile` should copy `prog.c` into the desired filename. For example: + +If you are not familiar `Makefile`s, you might consider the following tutorials: + +- [GNU make](https://www.gnu.org/software/make/manual/make.html#Introduction) +- [What is a Makefile and how does it work?](https://opensource.com/article/18/8/what-how-makefile) +- [Learn Makefiles](https://makefiletutorial.com) + +For the `make(1)` _connoisseur_: As of 2023, IOCCC judges use [GNU +make compatible](https://www.gnu.org/software/make/) `make(1)` +command that is compatible with GNU Make version 3.81. + + +### FAQ 1.2: May I use a different source or compiled filename than prog.c or prog? + +While your entry's source filename, as submitted, must be `prog.c`, your entry's `Makefile` +may copy `prog.c` to a different filename as part of the compiling/building process. For example: + +```make +all: desired_name + +desired_name: desired_name.c + cc desired_name.c -o $@ + +desired_name.c: prog.c + rm -f $@ + cp -f prog.c $@ + +clobber: + rm -f desired_name.c desired_name +``` + +We recommend that the `make clobber` rule remove files that your entry +creates as part of the compiling/building process. + +You may also copy the compiled `prog` into a different file as part of compiling process. +For example: + +```make +different_name: prog + rm -f $@ + cp -f prog $@ +``` + + +### FAQ 1.3: What platform should I assume for my entry? + +Your entry must compile with GCC and run under at least one flavor of UNIX (e.g. +Linux or Solaris). To improve chances to win, it should work under both BSD and +SysV style UNIX (think **stty cbreak**), and should not depend on endianness. +If it can compile and run on Windows and/or Mac (see +[2000/thadgavin](/years.html#2000_thadgavin) for one example, amongst others), +even better. Being able to compile with other compilers like clang is also a +good thing. + + +## Section 2: IOCCC Judging process + + +### FAQ 2.0: How many entries do the judges receive for a given IOCCC? + +By tradition, we do not say. + + +### FAQ 2.1: What should I put in the remarks.md file of my entry? + +While you may put in as much or as little as you wish into your entry's +`remarks.md` file, we do have few important suggestions: + +We recommend that you explain how to use your entry. Explain the +command line (if any command line options and arguments are used) +and any input or actions if applicable. + +We highly recommend that you explain why you think your entry is +well obfuscated. + +For those entries that win the IOCCC, we often use much of text from the +`remarks.md` file in the _Author's remarks_ section of the `README.md` file. +For this reason, a well written `remarks.md` file is considered a plus. + +While not required, consider adding bit of humor to your `remarks.md` +as most people who are not humor impaired, as well as the IOCCC judges +appreciate the opportunity for a fun read as well as a chuckle or two. + + +#### What helps: + +- explaining what your entry does + +- how to entice it to do what it is supposed to do + +- what obfuscations are used + +- what are the limitations of your entry in respect of portability and/or input data + +- how it works (if you are really condescending) + + +#### What does not help: + +- admitting that your entry is not very obfuscated (you see, the contest is +called the **IOCCC**, not the **INVOCCC** :-) ); but even if you do not admit +it, not very obfuscated entries have a minuscule chance to win (although +[2000/tomx](years.html#2000_tomx) is a notable counterexample). + +- mentioning your name or any identifying information in the remark section (or +in the C code for that matter) - we like to be unbiased during the judging +rounds; we look at the author name only if an entry wins. See the guidelines if +this is not clear! + +- leaving the remark section empty. + + +### FAQ 2.2: Why don't you publish non-winners? + +Because the publication on the IOCCC site **_IS_** the award! +Anyone is free to put their IOCCC hopefuls, lookalikes and/or +non-winners on their web page for everyone to see. + + +### FAQ 2.3: How much time does it take to judge the contest? + +It takes a fair amount of time to setup, run, answer email, process entries, +review entries, trim down the set entries to a set of winners, doing the +write-up of the winners, announcing the winners, reviewing final edits of the +winning entry set, posting the winners, being flamed :-), tell folks who send in +late entries to wait until the next contest, etc... It takes a few weekends and +a number nights of study and work ... which is hard given that we are busy with +many other activities as well. + +Note that we do not contact the author if an entry does not compile or does not +work as advertised, we might attempt to fix obvious compilation problems or +incompatibilities, but no more than that - so be sure that your entry does work +on at least a couple different platforms, at least one of them being UNIX or +POSIX-conforming. + + +### FAQ 2.4: How many judging rounds do you have? + +By tradition, we do not say how many judging rounds we have in a given IOCCC. + +We often report when the IOCCC judges start the 1st round, and +when usually when the IOCCC judges start near final judging rounds, and +sometimes the final judging round, so you may guess that we have at +least 3 rounds. :-) The actual number of rounds is certainly more than 3. + + +## Section 3: Compiling and running IOCCC winners + + +### FAQ 3.0: What Makefile are available to build or clean up IOCCC winners? + +In general the best way to compile everything in an entry directory is to run: + +```sh +make clobber all +``` + +If you wish to compile every entry for every year you should go to the top level +directory and run the same command as above, `make clobber all`. + +The `all` rule will build everything necessary except for the alternate +versions. Every Makefile has an `alt` rule but it will only do something if an +alternate version exists. To build all the entries along with any alternate code +you can do from the top level directory: + +``` +make clobber everything +``` + +If you wish to only build alternate code you can do: + +```sh +make clobber alt +``` + +If you wish to not remove the entry binaries and only compile the additional alt +versions: + +```sh +make alt +``` + +The following Makefile rules should be in all Makefiles: + +- all: build the entry programs (main program and any supplementary program) +- alt: build alternate code +- clobber: clean up object files and all binary files (except for those that are +not compiled) +- clean: a simpler version of `clobber` that only removes object files. `make +clobber` depends on `clean` so running `make clobber` will invoke `make clean`. +- everything: equivalent to `make all alt`. + +Are there any other rules? You tell us! + +NOTE about the above rules: the Makefile default assumes `cc` which might be a +gcc-based compiler, or a clang-based compiler, or some other compiler. Only by +forcing `CC=clang` or `CC=gcc` will one invoke a specific compiler to, say, +enable or disable additional warnings or flags. Even so different versions or +compilers might do different things, have different defects or other issues. + + +### FAQ 3.1: Why doesn't this IOCCC winner compile? + +Some winners, particularly winners from long ago, no longer compile on more +modern systems because the C language has evolved (i.e. the modern C compilers +are much more strict in what they accept as a valid program), or the entry +depended on operation system and library features that where common back then +but are different/missing today. + +E.g., it is highly unlikely that you'll be able to execute +[1984/mullender](years.html#1984/mullender) on a computer you're using to read +this FAQ. However for that entry [Cody Boone +Ferguson](/winners.html#Cody_Boone_Ferguson) added alternative code so that you +can enjoy this entry. Try: ```sh make alt ./mullender.alt [microseconds] +./mullender.alt2 [microseconds] ``` -where microseconds is the number of microseconds to sleep between writes. -Default 10000. This is useful to see different speeds as well as if your CPU is -too slow or too fast for the entry. See the -[README.md](/1984/mullender/README.md) for more details. +The microseconds defaults to 10000 but has a minimum value of 1000. The +`mullender.alt2` is like the first alt except that it will start over once the +program times out. -Thank you Cody for your help! +See also [Yusuke Endoh](/winners.html#Yusuke_Endoh)'s entry +[2015/endoh3](/2015/endoh3/README.md) which lets one compile it and run +it. Another entry that you can enjoy it under is [Christopher +Mill](/winners.html#Christopher_Mills)'s entry +[2018/mills](/2018/mills/README.md) which is a PDP-7 emulator as well as a +PDP-11/40 emulator. -BTW: in this case it's a slight fix and improvement to our original suggested -code: +Others are not so easy though we're working on this and over time have added +alternative code and/or fixed them. Most entries do now work and the others we +are working on (slowly as other things are also being done and this is on free +time). -```c -main(){int i=512;do write(1," :-)\b\b\b\b",9),usleep(i);while(--i);} +In some cases we replaced the original code (not the `.orig.c` file!) with code +that works for modern systems but one can view the original code in the +`.orig.c` files (sometimes the original code is also in the directory as a +`winner.alt.c` or `prog.alt.c`). + + +### FAQ 3.2: Why does a IOCCC winner fail on my 64-bit system? + +Unfortunately some older entries are non-portable and require 32-bit support or +32-bit binaries. A problem system here is macOS Catalina (10.15) as as of that +version macOS no longer supports 32-bit binaries. If the entry acts on a certain +type of binary, say ELF, then that will also be a problem depending on the +entry. For example [2001/anonymous](2001/anonymous/README.md) requires 32-bit +ELF binaries. + +There are numerous example entries that require 32-bit binaries. We have tried +to note these in both the respective Makefiles and README.md files but it is +possible that some were missed. These entries are very likely in the +[bugs.md](/bugs.md) file and we welcome any help in making an alternate version +for 64-bit systems. Many were fixed to work with modern systems but some are +supposed to only work with 32-bit systems so any updated version of these +entries should be an alternate version. + +Other entries like [2001/herrmann2](/thanks-for-fixes.md#2001herrmann2-readmemd) +now work with 32-bit AND 64-bit systems. + + +### FAQ 3.3: Why do some IOCCC winners fail to compile under macOS? + +If the entry requires gcc and you did not explicitly install gcc in macOS you +will not be able to run or use these entries. This is because macOS gcc is +actually clang, even `/usr/bin/gcc`. + +That being said many (if not most) of these entries have been fixed and some +others will be looked at, when found. + + +### FAQ 3.4: Why does clang or gcc fail to compile an IOCCC winner? + +Although we have fixed numerous entries to work with clang (sometimes in an alt +version but usually in the program itself) there are some that simply cannot be +fixed or if they are fixable they have not yet been fixed (we are working on +this but other things have to be done too and all on free time). + +This is because clang has some defects where the args of main() are required to +be a specific type and some versions of clang allow only 1, 2 or 3 args, not 4, +to main(). In the case of types of args many were changed to the right type and +then what was main() became another function of the original main() type. + +At the same time some entries are not designed to work with clang. There might +be alternate code added at some point but as above this depends on free time and +other things that have to be done plus remembering to do it. + + +### FAQ 3.5: What is this cb tool that is mentioned in the IOCCC? + +This was a C beautifier for Unix, both AT&T and Berkeley, but it seems to no +longer be available, code wise, except for Plan 9, but Plan 9 was never used for +judging the IOCCC. A Unix man page for `cb` +[still exists](https://www.ibm.com/docs/en/aix/7.3?topic=c-cb-command). + + +### FAQ 3.6: An IOCCC winner missed by my terminal application, how do I fix this? + +The simplest way to do this is to type `reset`. If echo was disabled you can get +usually away with `stty echo`. Sometimes you can also get away with `stty sane`. +`reset` does the most but note that it will clear the screen (obviously `clear` +will too but it won't reset the terminal). + + +### FAQ 3.7: How do I compile and use on macOS, an IOCCC winner that requires X11? + +As an example we will use [1993/jonth](1993/jonth/README.md) which works well +with macOS. + +First of all you will need to install the [most recent +XQuartz](https://www.xquartz.orgl), preferably on an [Apple supported version of +macOS, preferably the most recent version](https://support.apple.com/macos). +Then open the "XQuartz" application (usually located in +`/Applications/Utilities/XQuartz.app`) by typing at the command line: + +```sh +open /Applications/Utilities/XQuartz.app ``` -BTW: is there such a thing as too fast a CPU ? :-) actually yes for certain code -which is probably not as uncommon as you think :-) ). +With the "XQuartz" application open you will get an [X Window System +Manager](https://www.x.org/wiki/) launched with an [Xterm window +shell](https://en.wikipedia.org/wiki/Xterm) started: -break; +xterm-launch in macOS -- case [1991/davidguy](years.html#1991_davidguy): disable access -control of your X server (**xhost +**). If it does not help (or if you -see black screen), restart the X server without access control and with visual -depth of 8 bits or less. +At this point you need to cd to the winning directory and compile it. For example: -break; +compiling an entry in xterm in macOS -- default: Try enabling `-fwritable-strings` for GCC or its equivalent for other -compilers. +And then run the program as directed by the `README.md` file. For example with +`1993/jonth`: -} +running 1993/jonth in macOS + +Note that you can compile the code in your regular terminal prior to opening +XQuartz, should you wish to. -## Q: How did the IOCCC get started? +### FAQ 3.8: How do I compile an IOCCC winner that requires SDL1 or SDL2? -One day (23 March 1984 to be exact), Larry Bassel and I (Landon Curt -Noll) were working for National Semiconductor's Genix porting group, we -were both in our offices trying to fix some very broken code. +This depends on your operating system but below are instructions for Linux and +macOS with alternative methods for macOS and different package managers with Linux. -Larry had been trying to fix a bug in the classic Bourne shell (C code #defined -to death to sort of look like Algol) and I had been working on the finger -program from early BSD (a bug ridden finger implementation to be sure). +#### Red Hat based linux -We happened to both wander (at the same time) out to the hallway -in Building 7C to clear our heads. +Execute one of the following as root or via sudo: -We began to compare notes: '_You won't believe the code I am trying to fix_'. +```sh +dnf install SDL2 SDL2-devel sdl12-compat sdl12-compat-devel +yum install SDL2 SDL2-devel sdl12-compat sdl12-compat-devel +``` -And: '_Well you cannot imagine the brain damage level of the code I'm trying to -fix'_. +In the past it was said that one might need to run `make` like: -As well as: '_It's more than bad code, the author really had to try to make it -this bad!_ +```sh +make ... SDL2_INCLUDE_ROOT=/usr +``` -After a few minutes we wandered back into my office where I posted a -[flame to -net.lang.c](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=789%40nsc.UUCP&rnum=3&filter=0") -inviting people to try and out obfuscate the UN\*X source code we had just been working on. +or set the following environment variable: -BTW: I (Landon Curt Noll) had to post this [typo -correction](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=795%40nsc.UUCP&rnum=10&filter=0). -Thus began the tradition of putting typos in the contest rules and guidelines -... to make them more obfuscated of course! :-) +```sh +export SDL2_INCLUDE_ROOT=/usr +``` -BTW: This posting was made back in the days when AT&T was the evil giant. -Now, Microsoft makes AT&T look mild and kind in comparison. :-( (IMHO) ). - -BTW: See the story about the '[Bill Gates](/1993/mills/README.md)' award. :-) - -OK, back to the story. - -We (Larry and I) received a number of entries by email. -When we began to receive messages from outside of the US, Larry and I -decided to include International in the name. - -The -[1st IOCCC winners](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=837%40nsc.UUCP&rnum=2&filter=0) -were posted on 17 April 1984. +but this might not be necessary in more modern days especially as we use +`sdl-config` and `sdl2-config` which should find the proper paths. -There were 4 winners in 1984: +#### Debian based linux -1. [(dis)honorable mention](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=842%40nsc.UUCP&rnum=8&filter=0) -2. [3rd place](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=843%40nsc.UUCP&rnum=7&filter=0) -3. [2nd place](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=844%40nsc.UUCP&rnum=6&filter=0) -4. [1st place](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=845%40nsc.UUCP&rnum=5&filter=0) +Execute the following as root or via sudo: -BTW: The (dis)honorable mention wished to remain anonymous. -While many have asked who it was, we have continued to follow the -author's wish to remain anonymous. +```sh +apt install libsdl1.2debian libsdl1.2-dev libsdl2-dev +``` -A few years ago, we asked the author if they still wanted to remain anonymous. -They said: '_Yes, I want to keep my anonymity. But you can tell them that I am well known for my connection to the -C language_'. It was not until 2001 that another [anonymous -entry](/years.html#2001_anonymous) received an award. +and then try `make all` again. -BTW: The [1984 winner](/years.html#1984_mullender) remains one of my (Landon -Curt Noll) all time favorites. +In the past it was said that one might need to run `make` like: + +```sh +make ... SDL2_INCLUDE_ROOT=/usr +``` + +or set the following environment variable: + +```sh +export SDL2_INCLUDE_ROOT=/usr +``` + +but this might not be necessary in more modern days especially as we use +`sdl-config` and `sdl2-config` which should find the proper paths. -The name used in the posting of the [1st IOCCC -winner](http://groups.google.com/groups?q=Obfuscated&hl=en&lr=&ie=UTF-8&as_drrb=b&as_mind=1&as_minm=1&as_miny=1983&as_maxd=18&as_maxm=4&as_maxy=1984&selm=837%40nsc.UUCP&rnum=2&filter=0) -posting was **I**nternational **O**bfuscated **C** **C**ode **C**ontest or -**IOCCC** for short. +#### Other linux distributions -The posting said '_1st annual_', so in 1985 we held the [2nd IOCCC contest](/years.html#1985) -and the tradition continues as the longest running contest on the Internet. - -P.S. Part of the inspiration for making the IOCCC a contest goes to the -[Bulwer-Lytton fiction contest](http://www.bulwer-lytton.com/). - -

- -P^2.S. See the -[overall README](/all/README) -for more details. - - - - - -
Creative Commons License

© Copyright 1984-2020, -[Leo Broukhis, Landon Curt Noll](/judges.html) -- All rights reserved\ -This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

 
+Use your package manager to install the appropriate packages. Try the search +feature of the package manager to determine which packages you need to install. +Note that you might have to install both the library and the developmental +packages: one for compiling and one for linking / running. -## Q: Why do you sometimes use the first person plural? +#### macOS -As a precedent for [first person -plural](https://en.wikipedia.org/wiki/Nosism), we may sight [Two-, -Three-, and Four-Atom Exchange Effects in bcc in -3He](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.35.1442) and -the co-authorship of [F. D. C. -Willard](https://en.wikipedia.org/wiki/F._D._C._Willard) as well -as the [APS New Open Access -Initiative](https://journals.aps.org/2014/04/01/aps-announces-a-new-open-access-initiative). - -The number of [IOCCC judges](https://www.ioccc.org/judges.html) has -always been "> 1" such that IOCCC judges often prefer to themselves -in the plural, sometimes [in the common -plural](https://en.wikipedia.org/wiki/Plural), sometimes in the -[first person plural](https://en.wikipedia.org/wiki/Nosism), there -may be some who reject such a practice. Therefore please consider -that when you believe that just one of the [IOCCC -judges](https://www.ioccc.org/judges.html) is in action, you may -consider that [F. D. C. -Willard](https://en.wikipedia.org/wiki/F._D._C._Willard) has been -consulted, agreed, and has authorized the statement thus allowing -the [in the common plural](https://en.wikipedia.org/wiki/Plural) -to be used without offense. - -And while some might claim that [F. D. C. -Willard](https://en.wikipedia.org/wiki/F._D._C._Willard) died in -1982, we suggest that the [Schrödinger's -cat](https://en.wikipedia.org/wiki/Schrödinger%27s_cat) superposition -may still be in effect and the 1982 [report of death was an -exaggeration](https://books.google.com/books?id=ms3tce7BgJsC&lpg=PA134&vq=%22the%20report%20of%20my%20death%20was%20an%20exaggeration%22&pg=PA134#v=onepage&q=%22the%20report%20of%20my%20death%20was%20an%20exaggeration%22&f=false). - -p.s. Here is an image of F. D. C. Willard: - -[F D C Willard](png/F.D.C.Willard.png) +If you're using macOS there are at least three ways to obtain it. You can +download it from the SDL website and install the package. That will not +work well for the IOCCC but these will: -## Q: Why do Makefiles use `-Weverything` with `clang`? Don't you know that its use is not recommended by clang developers? +##### MacPorts + +If you haven't already, install +[MacPorts](https://www.macports.org/install.php). Then run: + + +```sh +sudo port install libsdl libsdl2 +``` + + +##### Homebrew + +If you have not already done so, install [Homebrew](https://brew.sh). + +Then to install SDL and SDL2, execute the following command: + +```sh +brew install sdl2 sdl12-compat +eval "$(/opt/homebrew/bin/brew shellenv)" +``` + +#### NOTE: there might be extra SDL packages required + +In the case that some entries do not work even with SDL1/SDL2 installed it might +be that you need additional SDL libraries. See the entry's README.md for +details. If something is not noted you're welcome to report it as an issue or +fix it and make a new pull request. + + +### FAQ 3.9: How do I compile and use on macOS, an IOCCC winner that requires sound? + +This might depend on the entry but in some cases like +[2001/coupard](2001/coupard/coupard.c) one needs to do more work in order to get +it to work. In this case you should be able to use the Swiss Army Knife of sound +processing programs, [SoX](https://sox.sourceforge.net). To install this easily +you can use either MacPorts or Homebrew. See below for instructions for each. + +Usually the README.md file will explain how to use it in linux so we do not +include this here, at least for now. + + +#### MacPorts + +If you haven't already, install +[MacPorts](https://www.macports.org/install.php). Then run: + + +```sh +sudo port install sox +``` + + +#### Homebrew + +If you have not already done so, install [Homebrew](https://brew.sh). + +Then to install SoX, execute the following command: + +```sh +brew install sox +eval "$(/opt/homebrew/bin/brew shellenv)" +``` + + +### FAQ 3.10: Why do Makefiles use -Weverything with clang? + +While we know that use of `-Weverything` is generally not recommended +by `clang` C compiler developers, we do use the `-Weverything` +option in a certain case in IOCCC winner `Makefile`s. The use of `-Weverything` is limited to when one forces `CC=clang`. Users with clang compilers are not required to set `CC=clang` but when they do, @@ -1129,5 +913,312 @@ not work completely) due to these defects, for instance As you can see, using `clang` has some additional problems to work out but if you can get your entry to work well in `clang` it might very well be considered better than other entries. - - + + +## Section 4: Changes made to IOCCC winners + + +### FAQ 4.0: Why are some winning author remarks incongruent with the winning IOCCC code? + +It is very likely in this case that the code was fixed to work for modern +systems as part of the reworking of the website. If you have this problem in +some entries you should look at the original code as in `winner.orig.c` or +`prog.orig.c`. `winner` is the directory name. For instance, one of Landon's +favourite entries of all time is [1984/mullender](1984/mullender/README.md) and +the winner there would be `mullender`. Sometimes the original is in an alt +version like `winner.alt.c` or `prog.alt.c`. + + +### FAQ 4.1: Why were some calls to the libc function gets changed to use fgets? + +Some may wonder: "Doesn't this tamper with the entry too much?" + +A fine line indeed has to be drawn here but it was decided that it is worth it +because of alarming warnings that can be displayed, in some systems at runtime +interspersed with the output of the program. + +For instance in macOS the entry [1990/tbr](1990/tbr/README.md) would output the +warning in such a way that caused confusing output for the entry, looking like: + +```sh +$ ./tbr +$ warning: this program uses gets(), which is unsafe. +# nothing here, what to do? +``` + +In some cases changing the code to use `fgets()` is not so easy to fix and in +one case at least there is an alternate version that has the fix instead due to +a problem it creates (correct output but segfaults after the output in one of +the forms of input). + +In some cases it is not possible to fix or at least it is highly unlikely and so +those have mainly not been touched except one that has had the buffer size +increased (which could be done for others that are not possible to change to +`fgets()` though this has not been done). + + +Some entries can be made to look almost identical to the original entry. For +instance the fix to [1988/reddy](1988/reddy/README.md) required only a single +`#define` be added. + +In the future we, the judges, would prefer that entries use `fgets()` to prevent +these problems. + +NOTE: due to 'compatibility reasons' `fgets()` stores the newline and `gets()` +does not. We're not sure how this is compatibility but either way it can cause a +problem and it is this that has complicated most of the fixes though again some +can look almost identical. + + +### FAQ 4.2: What was changed in an IOCCC winner source code? + +We have set up make rules to easily do see what was changed in the IOCCC +winner source. Using the `Makefile` in the winner directory, use +one of the following _make(1)_ rules: + +The following `make` rules exist to make a difference: + +* `make diff_orig_prog`: + - This rule will show the diff of the _original_ source to the + current source (that is `entry.orig.c` to `entry.c`). +* `make make diff_alt_orig`: + - This rule will show the diff of the alt code to the original + code (that is `entry.alt.c` to `entry.orig.c`). If no alt code exists + nothing will be shown. +* `make diff_alt_prog`: + - This rule will show the diff of the alt code to the entry as it + stands (that is `entry.alt.c` to `entry.c`). +* `make diff_orig_alt`: + - This rule will show the diff of the original code to the alt code + (that is `entry.orig.c` to `entry.alt.c`). +* `make diff_prog_alt`: + - This rule will show the diff of the entry to the alt code (that is + `entry.c` to `entry.alt.c`). +* `make diff_prog_orig`: + - This rule will show the diff of the entry to the original code (that is + `entry.c` to `entry.orig.c`). + +For instance one of Landon's all time favourite entries is +[1984/mullender](1984/mullender/README.md) so the file names would be: +`mullender.orig.c`, `mullender.alt.c` and `mullender.c`. For later years, it +would be instead `prog.orig.c`, `prog.alt.c` and `prog.c`. + +Note that you might see something like: + +``` +make: [Makefile:170: diff_orig_prog] Error 1 (ignored) +``` + +at the end of the output but this is completely normal if there are differences. + +If the alt code is the same as the original, say with +[1984/anonymous](1984/anonymous/README.md), then naturally there is no point in +running the rule and the same applies for all the other rules but this system +allows for easily seeing the diffs. + +As some examples we'll first look at one that has really long lines which +will make it harder to see what is different, +[2001/anonymous](2001/anonymous/README.md). What you would do is `cd +2001/anonymous` and then do: + +```sh +make diff_orig_prog +``` + +and then be really confused! :-) + +But for an entry like [1991/dds](1991/dds/README.md), you can see the +differences much more easily. `1991/dds` is a good example where it's very +simple to see what is different as it's just a couple lines. + +You might be quite surprised how little some entries had to be changed and at +the same time how much other entries had to be changed, often with quite complex +differences! In some cases if the line is rather long, like the above mentioned +one, it will be harder to see what changed but in other cases like +[1984/decot](1984/decot/README.md) or [1986/wall](1986/wall/README.md) it's a +lot easier. + +Well, at least it's easier see the differences on a line-by-line basis but maybe +not what actually changed, especially since it's easier to know what was fixed +when you have compiler errors :-) (though there are, as noted, some examples +where it's quite easy to see the differences). + +[1991/dds](1991/dds/README.md) is also a good example to see the alt difference +very easily. To do that `cd 1991/dds` and then do: + +```sh +make diff_alt_prog +``` + +and you'll see a single line changed and very simply. + + +#### Tip: if you have `colordiff` installed it's a lot easier to see the differences + +To use these rules but provide a different `diff`, for instance `colordiff`, +just do: + +```sh +make DIFF=colordiff diff_orig_prog # for orig to prog diff +make DIFF=colordiff diff_alt_prog # for alt to prog diff +``` + +Obviously if you want to view the alt code or the orig code you can just open +the files as described above. + + +### FAQ 4.3: Why do author remarks sometimes not match the source? + +This is very likely to happen when an entry was fixed for modern systems. When +you look at the remarks of the author you should look at the `prog.orig.c` or +the `winner.orig.c` file. You might also find value in the above `diff` make +rules. + + +### FAQ 4.4: What is the meaning of the file ending in .orig.c in IOCCC winners? + +Due to the fact that the original code has sometimes had to change these files +are the original winning entry or as close to as possible to the original that +we can find. + + +## Section 5: Updating or correcting IOCCC web site content + + +### FAQ 5.0: Why does an IOCCC winner fail to compile or or fail run? + +What may have worked years ago may not work well or work at all today. +Please note that the IOCCC judges do **NOT** support IOCCC winners. +Nevertheless, there may be a number of reasons why an IOCCC winner +may fail to compile or run well or fail to run on your system. + +In some cases the American National Standards Institute's ANSI C +committee has damaged the C standard to the point where perfectly +valid C programs no longer compile with modern compilers. As such +some old IOCCC winners cannot no longer be compiled with modern compilers. + +In some cases programs that may have worked on an old computer system +longer work on modern computers. Some IOCCC winners do not work well, +or no longer work on modern computers or modern operating systems. +Some IOCCC winners fail to compile under clang, or gcc. +Some IOCCC winners require operating system services that +may not be present on your system. + +In some cases the IOCCC winner simply has bugs or (Mis)features. + +If you are having problems compiling or running an IOCCC winner, +we recommend that you look in [bugs.md](/bugs.md) to see if +there is a known bugs or (Mis)feature. In some cases what you +may think is a bug is actually an feature that was intentionally +written by the authors. In some cases the problem is well +known and we are looking for someone to attempt to fix it. + +In some cases there is an alternate version of the IOCCC winner +that you may wish to try. + +It also possible that you may have discovered a bug in an IOCCC +winner. If so, you are invited to try an fix the IOCCC winner and +submit that fix by way of a [GitHub pull +request](https://github.com/ioccc-src/temp-test-ioccc/pulls). Please +see the FAQ How do I report a bug in an IOCCC +winner? for details. + + +### FAQ 5.1: How do I report a bug in an IOCCC winner? + +We do not 'maintain' the contest winners as such. The code is made available on an 'AS +IS' basis. If you have a FIX for an entry, we suggest that you try and email it +to the authors and to submit your fixes in a [GitHub pull +request](https://github.com/ioccc-src/temp-test-ioccc/pulls) (with ONE PULL +REQUEST *PER* FIX, please!). + +Note that just because you have a fix does not mean it'll be accepted. This +might be because the author objects or it doesn't fit in some way or another. Of +course if the entry does not work we'll certainly be more inclined to accept the +fix. If it is accepted we'll be happy to credit you in the entry's _README.md_ +file. If you're a previous winner we will happily link to your entries; if +you're not we can link to your website if you wish. + +More generally please see the file [how-to-bugfix.md](/how-to-bugfix.md). Note +that this file is not a tutorial on how to fix X, Y and Z problems but rather +what to do to get the fix in. + + +## Section 6: Miscellaneous IOCCC + + +### FAQ 6.0: How did an entry breaks the size rule 2, win the IOCCC? + +As entries have been fixed it is entirely possible that some of the entries no +longer fit within the year's size restrictions. Invariably the length of columns +and/or number of rows have also changed. + +The `winner.orig.c` file contains the original source code that was +subjected to rule 2 of the given IOCCC. You may also wish to see +the [/archive](/archive) directory where you can find all the +original winning entries as compressed tar files for a given year. + +In some cases the entry may have abused rule 2 and declared an +"abuse of the rules" (although now blatant abuse of the rules to +get around rule 2 size limits is discouraged). + + +### FAQ 6.1: Is there a list of known bugs and misfeatures of IOCCC winners? + +Yes! Please see [bugs.md](/bugs.md) for a list of known bugs and/or issues of a +variety of kinds. + +Note that just because an entry is not in the bugs file does not mean there is +not an issue and note that some issues are simply missing files, dead URL(s) or +something like that. + + +### cFAQ 6.2: May I mirror the IOCCC web site? + +We are not accepting mirror requests at this time, sorry. + + +### FAQ 6.3: May I use parts of the IOCCC in an article, book, newsletter, or instructional material? + +While IOCCC judges look favorably on most requests to use IOCCC material, +we request that you ask the [IOCCC judges](/judges.html) first. + +Please send your request using the instructions on the [contacting +the IOCCC Judges](/contact.html) page. + + +### FAQ 6.4: Why do you sometimes use the first person plural? + +As a precedent for [first person +plural](https://en.wikipedia.org/wiki/Nosism), we may sight [Two-, +Three-, and Four-Atom Exchange Effects in bcc in +3He](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.35.1442) and +the co-authorship of [F. D. C. +Willard](https://en.wikipedia.org/wiki/F._D._C._Willard) as well +as the [APS New Open Access +Initiative](https://journals.aps.org/2014/04/01/aps-announces-a-new-open-access-initiative). + +The number of [IOCCC judges](https://www.ioccc.org/judges.html) has +always been "> 1" such that IOCCC judges often prefer to themselves +in the plural, sometimes [in the common +plural](https://en.wikipedia.org/wiki/Plural), sometimes in the +[first person plural](https://en.wikipedia.org/wiki/Nosism), there +may be some who reject such a practice. Therefore please consider +that when you believe that just one of the [IOCCC +judges](https://www.ioccc.org/judges.html) is in action, you may +consider that [F. D. C. +Willard](https://en.wikipedia.org/wiki/F._D._C._Willard) has been +consulted, agreed, and has authorized the statement thus allowing +the [in the common plural](https://en.wikipedia.org/wiki/Plural) +to be used without offense. + +And while some might claim that [F. D. C. +Willard](https://en.wikipedia.org/wiki/F._D._C._Willard) died in +1982, we suggest that the [Schrödinger's +cat](https://en.wikipedia.org/wiki/Schrödinger%27s_cat) superposition +may still be in effect and the 1982 [report of death was an +exaggeration](https://books.google.com/books?id=ms3tce7BgJsC&lpg=PA134&vq=%22the%20report%20of%20my%20death%20was%20an%20exaggeration%22&pg=PA134#v=onepage&q=%22the%20report%20of%20my%20death%20was%20an%20exaggeration%22&f=false). + +p.s. Here is an image of F. D. C. Willard: + +[F D C Willard](png/F.D.C.Willard.png)