Merge pull request #1754 from xexyl/richards11-opt
Restore optimiser in 2011/richards
This commit is contained in:
17 files changed
+246
-55
No files matched your search
+1
-1
@@ -67,7 +67,7 @@ CINCLUDE=
|
||||
|
||||
# Optimization
|
||||
#
|
||||
OPT=
|
||||
OPT= -O3
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo "Running shark.sh:"
|
||||
./shark.sh shark.sh README.md jaw.c try.sh > receive || exit 1
|
||||
./shark.sh atob shark.sh README.md jaw.c try.sh > receive || exit 1
|
||||
echo "Done."
|
||||
|
||||
|
||||
|
||||
+8
-3
@@ -42,7 +42,7 @@ CSILENCE= -Wno-bitwise-op-parentheses -Wno-char-subscripts \
|
||||
-Wno-deprecated-declarations -Wno-empty-body -Wno-error \
|
||||
-Wno-implicit-function-declaration -Wno-parentheses -Wno-pedantic \
|
||||
-Wno-return-type -Wno-unused-parameter -Wno-unused-value \
|
||||
-Wno-deprecated-non-prototype
|
||||
-Wno-deprecated-non-prototype -Wno-implicit-int
|
||||
|
||||
# Common C compiler warning flags
|
||||
#
|
||||
@@ -69,7 +69,9 @@ CINCLUDE=
|
||||
|
||||
# Optimization
|
||||
#
|
||||
OPT=
|
||||
# We DISABLE the optimiser because having it enabled will cause a crash in some
|
||||
# invocations in some systems.
|
||||
OPT= -O0
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
@@ -133,8 +135,11 @@ all: data ${TARGET}
|
||||
clean clobber install love haste waste maker easter_egg \
|
||||
sandwich supernova deep_magic magic charon pluto
|
||||
|
||||
# We DISABLE THE OPTIMISER because when it's enabled in some conditions it
|
||||
# crashes.
|
||||
#
|
||||
${PROG}: ${PROG}.c
|
||||
${CC} ${CFLAGS} $< -o $@ ${LDFLAGS}
|
||||
${CC} ${CFLAGS} -O0 $< -o $@ ${LDFLAGS}
|
||||
|
||||
ag: ${PROG}
|
||||
${RM} -f $@
|
||||
|
||||
+6
-1
@@ -4,6 +4,10 @@
|
||||
make all
|
||||
```
|
||||
|
||||
NOTE: we DISABLE the optimiser because having it enabled causes some invocations
|
||||
to crash in some systems.
|
||||
|
||||
|
||||
### Bugs and (Mis)features:
|
||||
|
||||
The current status of this entry is:
|
||||
@@ -127,13 +131,14 @@ Instead, it tries to achieve both its speed and its obscurity through a
|
||||
careful choice of algorithms. Some of the finer points of those
|
||||
algorithms are outlined in the spoiler below.
|
||||
|
||||
|
||||
### How it works:
|
||||
|
||||
Here follows a description of some of the data structures and
|
||||
algorithms used by AG. It is by no means complete, but it may help
|
||||
you get an idea about the general principles.
|
||||
|
||||
--
|
||||
---
|
||||
|
||||
Internally, AG represents words and sentences as arrays of 32
|
||||
4-bit integer elements. Each element represents the number of
|
||||
|
||||
Executable
+117
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# try.sh - demonstrate IOCCC winner 1992/gson
|
||||
#
|
||||
|
||||
# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
|
||||
# this way allows us to have the user specify a different compiler in an easy
|
||||
# way.
|
||||
if [[ -z "$CC" ]]; then
|
||||
CC="cc"
|
||||
fi
|
||||
|
||||
make CC="$CC" all >/dev/null || exit 1
|
||||
|
||||
# clear screen after compilation so that only the entry is shown
|
||||
clear
|
||||
|
||||
# attempt to find a dictionary file if DICT unset or not a regular readable file
|
||||
#
|
||||
if [[ -z "$DICT" || ! -f "$DICT" || ! -r "$DICT" ]]; then
|
||||
DICT="/usr/share/dict/words"
|
||||
|
||||
if [[ ! -r "$DICT" ]]; then
|
||||
DICT="/usr/share/lib/spell/words"
|
||||
|
||||
if [[ ! -r "$DICT" ]]; then
|
||||
DICT="/usr/ucblib/dict/words"
|
||||
|
||||
if [[ ! -r "$DICT" ]]; then
|
||||
DICT="/dev/null"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# safety check that DICT is not empty and is a readable file
|
||||
#
|
||||
if [[ -n "$DICT" && -f "$DICT" && -r "$DICT" ]]; then
|
||||
echo "$ ./ag free software foundation < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag free software foundation < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag obfuscated c contest < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag obfuscated c contest < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag unix international < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag unix international < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag george bush < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag george bush < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag bill clinton < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag bill clinton < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag ross perot < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag ross perot < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag paul e tsongas < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag paul e tsongas < "$DICT" 2>/dev/null | less -rEXF
|
||||
fi
|
||||
|
||||
# now try making our own dictionary with mkdict.sh:
|
||||
#
|
||||
rm -f words
|
||||
cat README.md try.sh Makefile | ./mkdict.sh > words
|
||||
DICT="words"
|
||||
|
||||
read -r -n 1 -p "Press any key to use our own dict from mkdict.sh: "
|
||||
echo 1>&2
|
||||
|
||||
echo "$ ./ag free software foundation < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag free software foundation < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag obfuscated c contest < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag obfuscated c contest < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag unix international < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag unix international < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag george bush < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag george bush < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag bill clinton < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag bill clinton < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag ross perot < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag ross perot < "$DICT" 2>/dev/null | less -rEXF
|
||||
|
||||
echo "$ ./ag paul e tsongas < $DICT" 1>&2
|
||||
read -r -n 1 -p "Press any key to continue (space = next page, q = quit): "
|
||||
echo 1>&2
|
||||
./ag paul e tsongas < "$DICT" 2>/dev/null | less -rEXF
|
||||
@@ -15,11 +15,6 @@ make CC="$CC" all >/dev/null || exit 1
|
||||
# clear screen after compilation so that only the entry is shown
|
||||
clear
|
||||
|
||||
if [[ ! -f "tomx" || ! -e "tomx" ]]; then
|
||||
echo "Compiling tomx.c:" 1>&2
|
||||
make all || exit 1
|
||||
fi
|
||||
|
||||
echo "Running tomx:" 1>&2
|
||||
echo "$ ./tomx" 1>&2
|
||||
./tomx
|
||||
|
||||
@@ -71,7 +71,7 @@ CINCLUDE=
|
||||
|
||||
# Optimization
|
||||
#
|
||||
OPT=
|
||||
OPT= -O3
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
|
||||
@@ -68,7 +68,7 @@ CINCLUDE= -I ${X11_INCDIR} -I ${X11_INCDIR}/X11
|
||||
|
||||
# Optimization
|
||||
#
|
||||
OPT= -ggdb3
|
||||
OPT= -O3
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
|
||||
@@ -66,7 +66,8 @@ CINCLUDE= -include stdio.h -include setjmp.h -include string.h -include time.h -
|
||||
|
||||
# Optimization
|
||||
#
|
||||
OPT=
|
||||
# We DISABLE the optimiser because having it enabled BREAKS the program.
|
||||
OPT= -O0
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
@@ -131,8 +132,10 @@ all: data ${TARGET}
|
||||
clean clobber install love haste waste maker easter_egg \
|
||||
sandwich supernova deep_magic magic charon pluto
|
||||
|
||||
# NOTE: We FORCE the use of -O0 even if someone overrides it because this entry
|
||||
# will not work with it enabled.
|
||||
${PROG}: ${PROG}.c
|
||||
${CC} ${CFLAGS} $< -o $@ ${LDFLAGS}
|
||||
${CC} ${CFLAGS} -O0 $< -o $@ ${LDFLAGS}
|
||||
|
||||
# alternative executable
|
||||
#
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
make
|
||||
```
|
||||
|
||||
NOTE: We FORCE the use of -O0 even if someone overrides it because this entry
|
||||
will not work with it enabled.
|
||||
|
||||
|
||||
## To use:
|
||||
|
||||
|
||||
@@ -66,7 +66,8 @@ CINCLUDE=
|
||||
|
||||
# Optimization
|
||||
#
|
||||
OPT=
|
||||
# We DISABLE the optimiser because having it enabled BREAKS the program.
|
||||
OPT= -O0
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
@@ -129,8 +130,10 @@ all: data ${TARGET}
|
||||
clean clobber install love haste waste maker easter_egg \
|
||||
sandwich supernova deep_magic magic charon pluto
|
||||
|
||||
# NOTE: We FORCE the use of -O0 even if someone overrides it because this entry
|
||||
# will not work with it enabled.
|
||||
${PROG}: ${PROG}.c
|
||||
${CC} ${CFLAGS} $< -o $@ ${LDFLAGS}
|
||||
${CC} ${CFLAGS} -O0 $< -o $@ ${LDFLAGS}
|
||||
|
||||
# alternative executable
|
||||
#
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
make
|
||||
```
|
||||
|
||||
NOTE: We FORCE the use of -O0 even if someone overrides it because this entry
|
||||
will not work with it enabled.
|
||||
|
||||
|
||||
## To use:
|
||||
|
||||
@@ -15,22 +18,9 @@ make
|
||||
### Try:
|
||||
|
||||
```sh
|
||||
./kopczynski < kopczynski-8a
|
||||
./kopczynski < kopczynski-8b
|
||||
./kopczynski < kopczynski-8c
|
||||
./kopczynski < kopczynski-9
|
||||
./kopczynski < kopczynski-10
|
||||
./kopczynski < kopczynski-11
|
||||
./try
|
||||
```
|
||||
|
||||
Also try:
|
||||
|
||||
```sh
|
||||
./kopczynski < kopczynski-a
|
||||
```
|
||||
|
||||
What happens?
|
||||
|
||||
What happens if you feed the program source to the program? Can you figure out
|
||||
why?
|
||||
|
||||
@@ -38,7 +28,9 @@ why?
|
||||
## Alternate code:
|
||||
|
||||
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 which is what the alternate version
|
||||
does.
|
||||
|
||||
|
||||
### Alternate build:
|
||||
|
||||
|
||||
@@ -69,8 +69,9 @@ CDEFINE=
|
||||
CINCLUDE= -include stdio.h -include string.h -include unistd.h -include stdlib.h
|
||||
|
||||
# Optimization
|
||||
# We DISABLE the optimiser because having it enabled BREAKS the program.
|
||||
#
|
||||
OPT=
|
||||
OPT= -O0
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
@@ -135,8 +136,10 @@ all: data ${TARGET}
|
||||
clean clobber install love haste waste maker easter_egg \
|
||||
sandwich supernova deep_magic magic charon pluto
|
||||
|
||||
# NOTE: We FORCE the use of -O0 even if someone overrides it because this entry
|
||||
# will not work with it enabled.
|
||||
${PROG}: ${PROG}.c
|
||||
${CC} ${CFLAGS} $< -o $@ ${LDFLAGS}
|
||||
${CC} ${CFLAGS} -O0 $< -o $@ ${LDFLAGS}
|
||||
|
||||
test: ${PROG} test.sh
|
||||
./test.sh
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
make
|
||||
```
|
||||
|
||||
NOTE: We FORCE the use of -O0 even if someone overrides it because this entry
|
||||
will not work with it enabled.
|
||||
|
||||
|
||||
### Bugs and (Mis)features:
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ CINCLUDE= -include stdlib.h -include string.h -include stdio.h -include ctype.h
|
||||
|
||||
# Optimization
|
||||
#
|
||||
OPT=
|
||||
OPT= -O3
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
|
||||
@@ -302,6 +302,9 @@ crashes.
|
||||
NOTE: this does NOT apply to entries under the INABIAF status (though they're
|
||||
not mutually exclusive in some cases).
|
||||
|
||||
REMINDER: if you're debugging a crash it will be very helpful to have `-O0 -g`
|
||||
or if you can `-ggdb3` when compiling as that will help with debugging symbols.
|
||||
|
||||
|
||||
## STATUS: uses gets() - change to fgets() if possible
|
||||
|
||||
@@ -667,6 +670,60 @@ Enjoy! :-)
|
||||
# 1990
|
||||
|
||||
|
||||
## 1990 jaw
|
||||
|
||||
### STATUS: known bug - please help us fix
|
||||
### Source code: [1990/jaw/jaw.c](1990/jaw/jaw.c)
|
||||
### Information: [1990/jaw/README.md](1990/jaw/README.md)
|
||||
|
||||
[Cody Boone Ferguson](https://www.ioccc.org/winners.html#Cody_Boone_Ferguson)
|
||||
fixed some issues in this program and [Yusuke
|
||||
Endoh](https://www.ioccc.org/winners.html#Yusuke_Endoh) provided the `btoa`
|
||||
script but it appears there is a bug in this entry. The judges wrote that to
|
||||
test the entry one can do:
|
||||
|
||||
```sh
|
||||
echo "Quartz glyph jocks vend, fix, BMW." | compress | ./btoa | ./jaw
|
||||
```
|
||||
|
||||
which should apply the identity transformation to a minimal holoalphabetic
|
||||
sentence.
|
||||
|
||||
But doing this shows instead:
|
||||
|
||||
```sh
|
||||
echo "Quartz glyph jocks vend, fix, BMW." | compress | ./btoa | ./jaw
|
||||
a얖?)V...?????777??hC??h??-? )SSSSXXX????r?L=???*?-???ppp,,,?R
|
||||
?j
|
||||
111-)))? '..F@E
|
||||
???b111?
|
||||
..F..F.?n,,,,,L@E$
|
||||
```
|
||||
|
||||
Notice how there's no newline at the end: that final `$` is the prompt.
|
||||
|
||||
If one does, however:
|
||||
|
||||
```sh
|
||||
echo "Quartz glyph jocks vend, fix, BMW." | compress | ./btoa | ./jaw | ./jaw
|
||||
```
|
||||
|
||||
they will get just
|
||||
|
||||
```
|
||||
oops
|
||||
```
|
||||
|
||||
which seems to be an error message (one of the fixes was to make it not use
|
||||
`perror(3)` - this fixed something else though it's no longer known what).
|
||||
|
||||
The script [shark.sh](/1990/jaw/shark.sh) has some issues too in that due to
|
||||
path not having `.` (this and maybe some other things were fixed) and `tar` not
|
||||
wanting to accept reading from `stdin` (this in particular) even with the right
|
||||
options used, seemingly, it has to write to disk the tarball which seems to
|
||||
defeat the purpose. This would ideally be fixed.
|
||||
|
||||
|
||||
## 1990 theorem
|
||||
|
||||
### STATUS: INABIAF - please **DO NOT** fix
|
||||
@@ -839,7 +896,18 @@ problem of `gets()` being used in a more complex way.
|
||||
|
||||
It would be ideal if it were to use `fgets()` though. This will probably be
|
||||
looked at later but you're welcome to try and fix this too! A tip on how
|
||||
`gets()` is being used is in the [FAQ](/faq.md#gets) file.
|
||||
`gets()` is being used from Cody:
|
||||
|
||||
Previously it had a buffer size of 256 which could easily overflow. In this
|
||||
entry `gets(3)` is used in a more complicated way: first `m` is set to `*++p` in
|
||||
a for loop where `p` is argv. Later `m` is set to point to `h` which was of size
|
||||
256. `gets(3)` is called as `m = gets(m)`) but trying to change it to use
|
||||
`fgets(3)` proved more a problem. Since the input must come from the command
|
||||
line Cody changed the buffer size to `ARG_MAX+1` which should be enough (again
|
||||
theoretically) especially since the command expects redirecting a dictionary
|
||||
file as part of the command line. This also makes it possible for longer strings
|
||||
to be read (in case the `gets(3)` was not used in a loop).
|
||||
|
||||
|
||||
|
||||
## 1992 kivinen
|
||||
|
||||
+13
-19
@@ -1420,25 +1420,19 @@ commands that we suggested and some additional ones that provide for some fun.
|
||||
[Cody](#cody) fixed a crash that prevented this entry from working in some cases in some
|
||||
systems (like macOS) by disabling the optimiser in the Makefile.
|
||||
|
||||
Cody also changed the buffer size in such a way that `gets(3)` should be safe
|
||||
(theoretically) as it comes from the command line (though it can also read input
|
||||
from stdin after starting the program). Ideally `fgets(3)` would be used but this
|
||||
is a more problematic. Previously it had a buffer size of 256 which could
|
||||
easily overflow. In this entry `gets(3)` is used in a more complicated way:
|
||||
first `m` is set to `*++p` in a for loop where `p` is argv. Later `m` is set to
|
||||
point to `h` which was of size 256. `gets(3)` is called as `m = gets(m)`) but
|
||||
trying to change it to use `fgets(3)` proved more a problem. Since the input must
|
||||
come from the command line Cody changed the buffer size to `ARG_MAX+1` which
|
||||
should be enough (again theoretically) especially since the command expects
|
||||
redirecting a dictionary file as part of the command line. This also makes it
|
||||
possible for longer strings to be read (in case the `gets(3)` was not used in a
|
||||
loop).
|
||||
Cody also added the [try.sh](/1992/gson/try.sh) script.
|
||||
|
||||
Cody also added the [mkdict.sh](/1992/gson/mkdict.sh) script that the author
|
||||
included in their remarks. See the README.md for its purpose. It was NOT fixed
|
||||
for [ShellCheck](https://github.com/koalaman/shellcheck)
|
||||
because the author deliberately obfuscated it so **PLEASE DO NOT
|
||||
FIX THIS**.
|
||||
because the author deliberately obfuscated it so **PLEASE *DO NOT* FIX THIS OR
|
||||
MODERNISE IT**.
|
||||
|
||||
Cody also changed the buffer size in such a way that `gets(3)` should be safe
|
||||
(well, theoretically) as it comes from the command line (though it can also read input
|
||||
from `stdin` after starting the program). Ideally `fgets(3)` would be used but this
|
||||
is a more problematic. See [1992/gson in bugs.md](/bugs.md#1992-gson) for more
|
||||
details if you're interested in trying to understand it (or fix?).
|
||||
|
||||
|
||||
## <a name="1992_imc"></a>[1992/imc](/1992/imc/imc.c) ([README.md](/1992/imc/README.md]))
|
||||
@@ -2671,16 +2665,16 @@ For clang the problem was that `main()` had one arg, a `char *` and this is not
|
||||
allowed in any version of clang. In some versions it is allowed if the arg is an
|
||||
`int` but never if it's anything else. To get it to work took numerous changes.
|
||||
|
||||
First the inclusion of `setjmp.h` was necessary. Without this `longjmp()`
|
||||
implicitly returned int which was used for the purpose of binary expression but
|
||||
First the inclusion of `setjmp.h` was necessary. Without this `longjmp(3)`
|
||||
implicitly returned `int` which was used for the purpose of binary expression but
|
||||
this no longer worked.
|
||||
|
||||
But by including `setjmp.h` it naturally made the binary expressions invalid (as
|
||||
it returns void which no longer is allowed in binary expressions) so the comma
|
||||
it returns `void` which is not allowed in binary expressions) so the comma
|
||||
operator with `0` (`,0`) had to be used (`,1` was tried first but this did not
|
||||
work right).
|
||||
|
||||
`longjmp()` was being called with one arg which was an element
|
||||
`longjmp(3)` was being called with one arg which was an element
|
||||
of an `int[4][1000]` which had to be changed to a `jmp_buf p[4]` (this due to
|
||||
the prototype being included).
|
||||
|
||||
|
||||
Reference in new issue
Block a user