URL / format fix 1996/schweikh1/README.md

This commit is contained in:
Cody Boone Ferguson committed 2023-04-18 09:27:01 -07:00
1 parent 591d8774ef
commit 231ab04074
1 file changed
+54 -34
+54 -34
View File
@@ -1,20 +1,32 @@
# Worst Abuse of the C Preprocessor # Worst Abuse of the C Preprocessor
Jens Schweikhardt Jens Schweikhardt
DFN Network Operation Center DFN Network Operation Center
Schlartaeckerweg 3 (home address) Schlartaeckerweg 3 (home address)
D-71384 Weinstadt D-71384 Weinstadt
Germany Germany
<http://www.schweikhardt.net>
http://www.uni-stuttgart.de/People/schweikhardt/home.html
## To build: ## To build:
make all ```sh
make all
```
## To run: ## To run:
./schweikh1 ```sh
./schweikh1
```
## Try:
To find the day that Easter falls on in the current year:
```sh
./schweikh1 |grep $(date +%Y)
```
## Judges' remarks: ## Judges' remarks:
@@ -27,18 +39,18 @@ C Preprocessor that the judges have seen this year!
## Author's remarks: ## Author's remarks:
What this program does ### What this program does
----------------------
This program is an implementation of an algorithm that calculates This program is an implementation of an algorithm that calculates
the date of the Sunday following the first full moon after the the date of the Sunday following the first full moon after the
spring equinoxe. (Also known as "Easter", defined this way by the spring equinox. (Also known as "Easter", defined this way by the
Nicaean Concilium in 325 Anno Domini.) The algorithm is attributed Nicaean Concilium in 325 Anno Domini.) The algorithm is attributed
to the famous mathematician Carl Friedrich Gauss ["Meyers Handbuch to the famous mathematician Carl Friedrich Gauss ["Meyers Handbuch
ueber das Weltall", Meyer, 5th Edition, 1973, p149] and is suitable ueber das Weltall", Meyer, 5th Edition, 1973, p149] and is suitable
for anni domini within the Gregorian Calendar, that is, from 1582 AD for anni domini within the Gregorian Calendar, that is, from 1582 AD
to 2199 AD: to 2199 AD:
```
Let J be the year. Let J be the year.
If J is from 1582 to 1699, let M be 22, let N be 2 If J is from 1582 to 1699, let M be 22, let N be 2
If J is from 1700 to 1799, let M be 23, let N be 3 If J is from 1700 to 1799, let M be 23, let N be 3
@@ -51,29 +63,37 @@ Let c be the modulus of J divided by 7
Let d be the modulus of (19a + M) divided by 30 Let d be the modulus of (19a + M) divided by 30
Let e be the modulus of (2b + 4c + 6d + N) divided by 7 Let e be the modulus of (2b + 4c + 6d + N) divided by 7
```
The interesting Sunday is either: The interesting Sunday is either:
March 22 + d + e or ```
April d + e - 9 (only one of them is a valid date) March 22 + d + e or
April d + e - 9 (only one of them is a valid date)
```
with the following exceptions: with the following exceptions:
April 26 must always be changed to April 19 ```
April 25 must be changed to April 18 if d is 28 and a greater than 10 April 26 must always be changed to April 19
April 25 must be changed to April 18 if d is 28 and a greater than 10
```
### Example: ### Example:
J = 1962, M = 24, N = 5 ```
a = J % 19 = 5 J = 1962, M = 24, N = 5
b = J % 4 = 2 a = J % 19 = 5
c = J % 7 = 2 b = J % 4 = 2
d = 119 % 30 = 29 c = J % 7 = 2
e = 191 % 7 = 2 d = 119 % 30 = 29
e = 191 % 7 = 2
```
March 53 is invalid, so the result is April 22 1962 March 53 is invalid, so the result is April 22 1962.
Why I think this is obfuscated
------------------------------ ### Why I think this is obfuscated
Apart from the calculation of the Easter date, the definition *and* Apart from the calculation of the Easter date, the definition *and*
calculation of which are obfuscations in their own right, calculation of which are obfuscations in their own right,
@@ -101,22 +121,22 @@ Try to be as precise as can be and no one will comprehend what you mean.
#### The formula: #### The formula:
comprehension = 1/(2**precision) ```
comprehension = 1/(2**precision)
```
#### The interpretation: #### The interpretation:
"Say nothing and everybody will understand." "Say nothing and everybody will understand."
The `-I/usr/include` in the build file is needed by gcc on Solaris because The `-I/usr/include` in the build file is needed by gcc on Solaris because
gcc's "fixed" header in gcc-lib/sparc-sun-solaris2.5/2.7.2/include/errno.h `gcc`'s "fixed" header in `gcc-lib/sparc-sun-solaris2.5/2.7.2/include/errno.h`
is broken (sort of) because it has *two* identical extern is broken (sort of) because it has *two* identical extern declarations of errno.
declarations of errno. This leads to an error due to the This leads to an error due to the redefinition of main. The `-I` option makes
redefinition of main. The `-I` option makes sure the working sure the working /usr/include/errno.h is found first, which shouldn't cause any
/usr/include/errno.h is found first, which shouldn't harm on other problems on other systems.
systems.
Usage ### Usage
-----
The program is run without arguments. It prints all dates in order. The program is run without arguments. It prints all dates in order.