fix Makefile and README.md for 2004/kopczynski
This commit is contained in:
1 parent
f4449fbe07
commit
49630a3dc0
2 files changed
+128
-116
No files matched your search
@@ -102,7 +102,7 @@ CINCLUDE=
|
|||||||
#CINCLUDE= -include stdlib.h
|
#CINCLUDE= -include stdlib.h
|
||||||
#CINCLUDE= -include stdio.h
|
#CINCLUDE= -include stdio.h
|
||||||
#CINCLUDE= -include stdlib.h -include stdio.h
|
#CINCLUDE= -include stdlib.h -include stdio.h
|
||||||
#CINCLUDE= -I ${X11_INCDIR}
|
#CINCLUDE= -I ${X11_INCDIR} -I ${X11_INCDIR}/X11
|
||||||
#CINCLUDE= `${SDL2_CONFIG} --cflags`
|
#CINCLUDE= `${SDL2_CONFIG} --cflags`
|
||||||
|
|
||||||
# Optimization
|
# Optimization
|
||||||
|
|||||||
+127
-115
@@ -8,170 +8,182 @@
|
|||||||
|
|
||||||
http://www.mimuw.edu.pl/~erykk/
|
http://www.mimuw.edu.pl/~erykk/
|
||||||
|
|
||||||
## To build:
|
# To build:
|
||||||
|
|
||||||
make all
|
```sh
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
### To run
|
### To run:
|
||||||
|
|
||||||
./kopczynski < input_file
|
```sh
|
||||||
|
./kopczynski < input_file
|
||||||
|
```
|
||||||
|
|
||||||
### Try:
|
### Try:
|
||||||
|
|
||||||
./kopczynski < kopczynski-8a
|
```sh
|
||||||
./kopczynski < kopczynski-8b
|
./kopczynski < kopczynski-8a
|
||||||
./kopczynski < kopczynski-8c
|
./kopczynski < kopczynski-8b
|
||||||
./kopczynski < kopczynski-9
|
./kopczynski < kopczynski-8c
|
||||||
./kopczynski < kopczynski-10
|
./kopczynski < kopczynski-9
|
||||||
./kopczynski < kopczynski-11
|
./kopczynski < kopczynski-10
|
||||||
|
./kopczynski < kopczynski-11
|
||||||
|
```
|
||||||
|
|
||||||
### Alternate code
|
### Alternate code
|
||||||
|
|
||||||
The judges modified the program to print its result. The original
|
The judges modified the program to print its result. The original
|
||||||
program returned the result as an exit code:
|
program returned the result as an exit code:
|
||||||
|
|
||||||
make alt
|
```sh
|
||||||
|
make alt
|
||||||
|
```
|
||||||
|
|
||||||
./kopczynski.alt < kopczynski-10
|
Then try:
|
||||||
echo $?
|
|
||||||
|
```sh
|
||||||
|
./kopczynski.alt < kopczynski-10
|
||||||
|
echo $?
|
||||||
|
```
|
||||||
|
|
||||||
## Judges' comments
|
## Judges' comments
|
||||||
|
|
||||||
What is in a line? A lot when you obfuscate the way Eryk Kopczynski
|
What is in a line? A lot when you obfuscate the way Eryk Kopczynski
|
||||||
did it. This small one line program is an outstanding technical
|
did it. This small one line program is an outstanding technical
|
||||||
work of art as well as one of the better one-liner programs that
|
work of art as well as one of the better one-liner programs that
|
||||||
we have seen in years!
|
we have seen in years!
|
||||||
|
|
||||||
Compile and run without arguments. As input, give it an ASCII graphics
|
Compile and run without arguments. As input, give it an ASCII graphics
|
||||||
figure 8, 9, 10, or 11 made of pound signs and spaces, of any size,
|
figure 8, 9, 10, or 11 made of pound signs and spaces, of any size,
|
||||||
shape, or orientation (that's right, an upside down 9 is still 9 :-).
|
shape, or orientation (that's right, an upside down 9 is still 9 :-).
|
||||||
There is one restriction: the only line not containing "#" characters
|
There is one restriction: the only line not containing "#" characters
|
||||||
must be the last.
|
must be the last.
|
||||||
|
|
||||||
The program will print what it thinks you've entered. If you enter
|
The program will print what it thinks you've entered. If you enter
|
||||||
anything that does not resemble 8, 9, 10, or 11, the result is
|
anything that does not resemble 8, 9, 10, or 11, the result is
|
||||||
seemingly arbitrary. Actually it is not pseudo-random; can you find
|
seemingly arbitrary. Actually it is not pseudo-random; can you find
|
||||||
a pattern when it does not resemble 8, 9, 10 or 11?
|
a pattern when it does not resemble 8, 9, 10 or 11?
|
||||||
|
|
||||||
Here is a related puzzle: how to continue the sequence:
|
Here is a related puzzle: how to continue the sequence:
|
||||||
|
|
||||||
1, 0, 0, 0, 0, 0, 1, 0, 2, 1, ...
|
1, 0, 0, 0, 0, 0, 1, 0, 2, 1, ...
|
||||||
|
|
||||||
With certain arguments, you can alter the exit value. Can you figure
|
With certain arguments, you can alter the exit value. Can you figure
|
||||||
out how and why?
|
out how and why?
|
||||||
|
|
||||||
## Author's comments
|
## Author's comments
|
||||||
|
|
||||||
The program proves it is not as hard to recognize numbers. The current
|
The program proves it is not as hard to recognize numbers. The current
|
||||||
one liner version should correctly recognize all numbers from 8 to 11.
|
one liner version should correctly recognize all numbers from 8 to 11.
|
||||||
(Unless you give it some very hard cases. For example, it cannot
|
(Unless you give it some very hard cases. For example, it cannot
|
||||||
recognize negatives, zeros which have dots or slashes inside them,
|
recognize negatives, zeros which have dots or slashes inside them,
|
||||||
digits should be separated, and numbers should be "complete".)
|
digits should be separated, and numbers should be "complete".)
|
||||||
|
|
||||||
This program returns the number as its exit status. (In most shells,
|
This program returns the number as its exit status. (In most shells,
|
||||||
you can see the exit status of the last command with 'echo $?' (or
|
you can see the exit status of the last command with 'echo $?' (or
|
||||||
just '$?').)
|
just '$?').)
|
||||||
|
|
||||||
[[NOTE: The judges altered the primary version to output a number.]]
|
[[NOTE: The judges altered the primary version to output a number.]]
|
||||||
|
|
||||||
On the input, give numbers formed as a sequences of empty spaces and #
|
On the input, give numbers formed as a sequences of empty spaces and #
|
||||||
signs (you can also use dots instead of spaces), ending with an empty
|
signs (you can also use dots instead of spaces), ending with an empty
|
||||||
line. (No number has an empty line in it.) The program should return
|
line. (No number has an empty line in it.) The program should return
|
||||||
the number from 8 to 11 that it thinks it is.
|
the number from 8 to 11 that it thinks it is.
|
||||||
|
|
||||||
* The line is 131 bytes long (in 1986 165 bytes was OK, and the size
|
* The line is 131 bytes long (in 1986 165 bytes was OK, and the size
|
||||||
limit has grown from 1986...).
|
limit has grown from 1986...).
|
||||||
|
|
||||||
* I have decided that it is better for this program to return the
|
* I have decided that it is better for this program to return the
|
||||||
number, not to print it, but if you think otherwise, the change would
|
number, not to print it, but if you think otherwise, the change would
|
||||||
cost 6 chars (plus a warning). Change 'return *' to 'printf("%d",*)'.
|
cost 6 chars (plus a warning). Change 'return *' to 'printf("%d",*)'.
|
||||||
('$?' is shorter)
|
('$?' is shorter)
|
||||||
|
|
||||||
* I achieved some additional tightness by '-Dif=while', saved 9 chars
|
* I achieved some additional tightness by '-Dif=while', saved 9 chars
|
||||||
of source for cost of 11 chars of build file. If I used '-DB=while',
|
of source for cost of 11 chars of build file. If I used '-DB=while',
|
||||||
I would save 12 for 10, but I think the current version is slightly
|
I would save 12 for 10, but I think the current version is slightly
|
||||||
more obfuscated.
|
more obfuscated.
|
||||||
|
|
||||||
* A remark on portability:
|
* A remark on portability:
|
||||||
|
|
||||||
It only requires two's compliment arithmetics, as far as I
|
It only requires two's compliment arithmetics, as far as I
|
||||||
know. The maximum length of an input line is N-9, where
|
know. The maximum length of an input line is N-9, where
|
||||||
N is the size of int in bits (you can try to compile with
|
N is the size of int in bits (you can try to compile with
|
||||||
an option '-Dint=long long' for longer lines).
|
an option '-Dint=long long' for longer lines).
|
||||||
|
|
||||||
-- Algorithm & Obfuscation --
|
-- Algorithm & Obfuscation --
|
||||||
|
|
||||||
1. This program works by calculating the Euler characteristics of input,
|
1. This program works by calculating the Euler characteristics of input,
|
||||||
plus 9. It is the number of digits (i.e. separated #-regions) minus the
|
plus 9. It is the number of digits (i.e. separated #-regions) minus the
|
||||||
number of holes in them. It turns out that this algorithm works
|
number of holes in them. It turns out that this algorithm works
|
||||||
correctly for all numbers from 8 to 11.
|
correctly for all numbers from 8 to 11.
|
||||||
|
|
||||||
2. We know that Euler characteristics is the number of "vertexes"
|
2. We know that Euler characteristics is the number of "vertexes"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
||||||
minus the number of "edges"
|
minus the number of "edges"
|
||||||
|
|
||||||
## # #. .#
|
## # #. .#
|
||||||
# .# #. ('.' must be empty)
|
# .# #. ('.' must be empty)
|
||||||
|
|
||||||
plus the number of "faces"
|
plus the number of "faces"
|
||||||
|
|
||||||
##
|
##
|
||||||
##
|
##
|
||||||
|
|
||||||
3. If we fill all these patterns to 2x2 squares,
|
3. If we fill all these patterns to 2x2 squares,
|
||||||
|
|
||||||
#? ## #? #. .# ##
|
#? ## #? #. .# ##
|
||||||
?? ?? #? .# #. ##
|
?? ?? #? .# #. ##
|
||||||
+1 -1 -1 -1 -1 +1
|
+1 -1 -1 -1 -1 +1
|
||||||
|
|
||||||
substitute all possible "values" of '?' and sum up, we get that it is
|
substitute all possible "values" of '?' and sum up, we get that it is
|
||||||
enough to calculate:
|
enough to calculate:
|
||||||
|
|
||||||
#. .# ##
|
#. .# ##
|
||||||
.. #. #.
|
.. #. #.
|
||||||
+1 -1 -1
|
+1 -1 -1
|
||||||
|
|
||||||
Note now it is simple and obfuscated enough to be used as
|
Note now it is simple and obfuscated enough to be used as
|
||||||
a "magic trick".
|
a "magic trick".
|
||||||
|
|
||||||
4. I make a 16-character array; when indexed by 4-bit value which
|
4. I make a 16-character array; when indexed by 4-bit value which
|
||||||
represents the 2x2 squares, it will return a number to add/subtract
|
represents the 2x2 squares, it will return a number to add/subtract
|
||||||
{-1,0,+1}
|
{-1,0,+1}
|
||||||
|
|
||||||
5. We convert lines of input to bitmaps (N-bit integers). Additionally,
|
5. We convert lines of input to bitmaps (N-bit integers). Additionally,
|
||||||
it is heavily obfuscated by using negative numbers (two's compliment).
|
it is heavily obfuscated by using negative numbers (two's compliment).
|
||||||
For example, it turns out that 6 in "z=6" in the only 1-digit number
|
For example, it turns out that 6 in "z=6" in the only 1-digit number
|
||||||
which works here (and it's not only because we have "z>5" in the
|
which works here (and it's not only because we have "z>5" in the
|
||||||
following while). The conversion routine also sets n=8 in an obfuscated
|
following while). The conversion routine also sets n=8 in an obfuscated
|
||||||
and concise way.
|
and concise way.
|
||||||
|
|
||||||
5. Since we always return the number from 8 to 11, we can calculate
|
5. Since we always return the number from 8 to 11, we can calculate
|
||||||
modulo 4. Instead of 16 {-1,0,+1} values, we use a 15-character string
|
modulo 4. Instead of 16 {-1,0,+1} values, we use a 15-character string
|
||||||
which agrees modulo 4 to the array in (4). (NUL fits very well as the
|
which agrees modulo 4 to the array in (4). (NUL fits very well as the
|
||||||
16th character, so we use 15-character string.)
|
16th character, so we use 15-character string.)
|
||||||
|
|
||||||
6. Since the rule found in (3) did not produce any funny messages, I
|
6. Since the rule found in (3) did not produce any funny messages, I
|
||||||
changed it until it did. (The # character to find vertexes is in the
|
changed it until it did. (The # character to find vertexes is in the
|
||||||
top right corner, not the top left one.) The following messages will
|
top right corner, not the top left one.) The following messages will
|
||||||
also work instead of "has dirtiest IF":
|
also work instead of "has dirtiest IF":
|
||||||
|
|
||||||
HighlandYachter
|
HighlandYachter
|
||||||
TestDirtiestTen
|
TestDirtiestTen
|
||||||
has lintiest IF
|
has lintiest IF
|
||||||
TighterLaughter
|
TighterLaughter
|
||||||
HustlerDaughter
|
HustlerDaughter
|
||||||
TighterDemoThen
|
TighterDemoThen
|
||||||
|
|
||||||
They can be mixed, of course!
|
They can be mixed, of course!
|
||||||
|
|
||||||
7. [[NOTE: Item 7 was removed by the judges so as to not spoil the
|
7. [[NOTE: Item 7 was removed by the judges so as to not spoil the
|
||||||
challenge of figuring how arguments can be used to alter
|
challenge of figuring how arguments can be used to alter
|
||||||
the exit value.]]
|
the exit value.]]
|
||||||
|
|
||||||
8. The variable names are confusing.
|
8. The variable names are confusing.
|
||||||
|
|
||||||
9. Finally, the program tries to be as concise as possible. Some
|
9. Finally, the program tries to be as concise as possible. Some
|
||||||
obfuscation comes from this. For additional obfuscation and
|
obfuscation comes from this. For additional obfuscation and
|
||||||
conciseness, 'if' means 'while'.
|
conciseness, 'if' means 'while'.
|
||||||
Reference in new issue
Block a user