## To build: ``` make all ``` ## To use: ``` ./imc number ``` where `number` is an optional number. Default is 5. ## Try: ``` ./try.sh ``` ## Judges' remarks: This entry's algorithm is as magic as its output! ## Author's remarks: This program may be compiled with an ANSI or K&R compiler. A few harmless warnings are displayed only if `gcc -Wall` is used. This entry is really a set of library functions, but an example `main()` function has been added so that the library can be tested. If the program appears too large, consider that functions `o()` and `s()` can each be separated from the rest of the program (except for the short functions `p()` and `r()`, which they require) and used alone. However, the main part of the program is the function `e`, which does require all the other functions (apart from `main()`). The program should be supplied with an integer parameter. If no parameter or an invalid parameter is given, then 5 is assumed. The maximum parameter is determined only by the amount of CPU time, virtual memory and display (or file) space available. ### NOTICE to those who wish for a greater challenge: **If you want a greater challenge, don't read any further**: just try to understand the program via the source. If you get stuck, come back and read below for additional hints and information. ### How this entry works: OK, so you have probably seen magic square printers before. But what about one that deals with even sizes as well as odd ones, or one that prints out a different one each time (or attempts to, at any rate)? I have formatted the important functions `o()`, `s()` and `e()` to show how useful the word `for` is, and (in function `e()`) how useful the words `if` and `else` are. In fact, hardly anything happens that isn't in one of these instructions. I did this in order to simplify the code - the algorithms used to make the random squares are quite complex without being shrouded in obfuscated code! :-) Incidentally, I was surprised to find out how useful the exclusive-or operator was while writing function `s()`. Here are the descriptions of the functions in the library: > `o(n,a,q,d)`: makes a magic square of order `n` when `n` is odd and at least 3.
> `s(n,a,q,d)`: makes a magic square of order `n` when `n` equals 4.
> `e(n,a,q,d)`: makes a magic square of order `n` when `n` is even and at least 6. In the above, `a` (of type `int *`) points to an area of memory in which the magic square will be stored and `q` (also of type `int *`) points to an area of memory of length at least `n*sizeof(int)` bytes which can be used as a work space. Both `a` and `q` must be allocated by the caller. The integer parameter `d`, usually zero, indicates the length of a gap which will be left between adjacent rows of the magic square. The square which is returned will (or should) be a permutation of the numbers 1 to `n*n` in which all rows and columns and the two diagonals add up to `n*(n*n+1)/2`.