## To build: This entry requires SDL2 to be installed. See the FAQ on "[SDL1 and SDL2](../../faq.html#SDL)" if you don't have it installed and don't know how to do so. ``` make ``` ## To use: ``` ./prog ``` ## Try: ``` ./prog ioccc.txt ./prog prog.c ./prog sand.txt ./prog sand.alt.txt ``` **NOTE**: these invocations will take quite some time to finish. ## Judges' remarks: Can you explain the behavior of the program when [ioccc.txt](ioccc.txt) is given to it as input? How would the description of the state machine look like when translated from Polynomish to English? ## Author's remarks: ### Remarks This entry graphically displays a simulation of sand falling. It uses SDL to draw the interface. The code makes the following assumptions about the underlying system: * SDL2 is installed from [https://libsdl.org](https://libsdl.org) or your package manager. * `double` is an IEEE 754 floating-point type and `sizeof(double)==8`. * The compiler supports the C99 standard. In order to simulate the motion of the sand, a cellular automaton is used. The state transition table is not stored directly. Instead, the program stores the coefficients of a polynomial that map each state to the correct one. These coefficients are stored as raw hexadecimal in the `V[]` array, and they are reinterpreted as `double`s when used. This allows more numeric precision in fewer characters (base 16 > base 10), and makes the purpose of the array less clear. The code is laid out graphically as a bucket pouring sand, and it is far easier to observe this high-level layout than the code's actual function. The preprocessor is used to both obfuscate the code as a whole and abbreviate the calls to SDL. Additionally, throughout the code, the variables were named so that they are short and easily confused with each other.