Fix Makefile and README.md for 2001/jason

This commit is contained in:
Landon Curt Noll committed 2023-03-18 11:01:35 -07:00
1 parent 83ff856bc9
commit 80bd54903c
2 files changed
+351 -249

No files matched your search

+263 -169
View File
@@ -1,18 +1,9 @@
#!/usr/bin/env make
#
# IOCCC 2001 entry Makefile
# IOCCC 2001 winning entry - jason
################################################################################
#
# An Historical Makefile NOTE:
#
# The orig.Makefile, if it exits, is the original Makefile before this IOCCC
# year directory was reworked so that entries are in separate directories.
# This also applies to any orig.ansi.mk and orig.common.mk files.
#
# Several Makefiles were modified / formed in 2022, and as such it may have
# elements that are not historically compatible with way entries were built.
#
# Regarding individual entries:
#
# IOCCC winning entry code may not work on your system. Even with standards,
@@ -45,192 +36,295 @@
# See: http://creativecommons.org/licenses/by-sa/3.0/
SHELL= /bin/sh
CAT= cat
RM= rm
SED= sed
TRUE= true
#CINCLUDE= -I ${HOMEBREW_PREFIX}/include/SDL2
# optimization
#############################
# shell used by this Makefile
#############################
#
# Most compiles will safely use -O2. Some can use only -O.
# A few compilers have broken optimizers and thus you may
# not want anything.
SHELL= bash
#######################
# common tool locations
#######################
#
include ../../var.mk
# Set X11_LIBDIR to the directory where the X11 library resides
#
#X11_LIBDIR= /usr/X11R6/lib
#X11_LIBDIR= /usr/X11/lib
X11_LIBDIR= /opt/X11/lib
# Set X11_INCLUDEDIR to the directory where the X11 include files reside
#
#X11_INCDIR= /usr/X11R6/include
#X11_INCDIR= /usr/X11/include
X11_INCDIR= /opt/X11/include
# Common C compiler warnings to silence
#
#CSILENCE=
CSILENCE= -Wno-char-subscripts -Wno-extra-semi -Wno-string-plus-int \
-Wno-unused-parameter
# Common C compiler warning flags
#
#CWARN= ${CSILENCE}
#CWARN= -Wall ${CSILENCE}
#CWARN= -Wall -Wextra ${CSILENCE}
CWARN= -Wall -Wextra -pedantic ${CSILENCE}
# Compiler standard
#
#CSTD=
#CSTD= -ansi
CSTD= -std=gnu99
# Compiler bit architecture
#
# Some entries require 32-bitness:
# ARCH= -m32
#
# Some entries require 64-bitness:
# ARCH= -m64
#
# By default we assume nothing:
#
ARCH=
# Defines that are needed to compile
#
CDEFINE=
#CDEFINE= -DIOCCC
# Include files that are needed to compile
#
CINCLUDE=
#CINCLUDE= -include stdlib.h
#CINCLUDE= -include stdio.h
#CINCLUDE= -include stdlib.h -include stdio.h
#CINCLUDE= -I ${X11_INCDIR} -I ${X11_INCDIR}/X11
#CINCLUDE= `${SDL2_CONFIG} --cflags`
# Optimization
#
# Most compiles will safely use -O2. Some can use only -O1 or -O.
# A few compilers have broken optimizers or this entry make break
# under those buggy optimizers and thus you may not want anything.
# Reasonable compilers will allow for -O3.
#
#OPT=
#OPT= -O
OPT= -O2
#OPT= -O1
#OPT= -O2
OPT= -O3
# flags for ANSI compiles
# Default flags for ANSI C compilation
#
# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode,
# others such as gcc may want -ansi, others (Compaq Tru64 Unix)
# want -std1, and others may want nothing at all.
# Adjust the CFLAGS line as needed.
#
# NOTE: Some compilers cannot optimize, or optimize some entries
# incorrectly. You might want to turn on -O to see if your
# compiler can handle them.
#
#
#CFLAGS= -Xa ${OPT}
#CFLAGS= -std1 $(OPT)
CFLAGS= -ansi ${OPT}
CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
# NOTE: On some systems, the library path does not include the location
# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir
# in order to compile with these libs.
# Libraries needed to build
#
X11CCFLAGS= -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/usr/include/X11
#X11CCFLAGS=
X11LDFLAGS= -L/usr/X11R6/lib -Wl,-R/usr/X11R6/lib
#X11LDFLAGS=
LIBS=
#LIBS= -lm
#LIBS= -L ${X11_LIBDIR} -lX11
#LIBS= `${SDL2_CONFIG} --libs`
# ANSI compiler
#
# Set CC to the name of your ANSI compiler.
#
# Some entries seem to need gcc. If you have gcc, set
# both CC and MAY_NEED_GCC to gcc.
#
# If you do not have gcc, set CC to the name of your ANSI compiler, and
# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just :
# to disable such programs.
# C compiler to use
#
CC= cc
MAY_NEED_GCC= gcc
#CC=clang
#CC=gcc
# winners that compile under ANSI C
# Compiler add-ons or replacements for clang only
#
WINNERS= anonymous bellard bellard.otccex cheong coupard \
ctk dgbeards herrmann1 herrmann2 jason kev ollinger rosten \
schweikh westley williams
ALT_NAMES= westley.orig
DATA_FILES= anonymous_files bellard_files herrmann1_files herrmann2_files
all: ${WINNERS}
# Most likely to amaze
ifeq ($(CC),clang)
#
anonymous: anonymous.c
magic='${MAY_NEED_GCC} -O1'; \
X='-DA(X)=#X'; \
warning='-pedantic -Dprocessor'; \
$$magic $$warning -Dmagic= $$X "-DX=A($$magic \"$$X\")" \
-o anonymous anonymous.c
anonymous_files: anonymous.ten.c
# Best abuse of the rules
CSILENCE+= -Wno-implicit-int-conversion -Wno-missing-prototypes \
-Wno-missing-variable-declarations -Wno-poison-system-directories \
-Wno-redundant-parens -Wno-shorten-64-to-32 -Wno-sign-conversion \
-Wno-strict-prototypes
#
bellard: bellard.c
${CC} -rdynamic ${CFLAGS} bellard.c -o bellard -ldl
bellard_files: bellard.otccex.c
# Best short program
CWARN+= -Weverything
#
cheong: cheong.c
${CC} ${CFLAGS} cheong.c -o cheong
endif
# Most obfuscated sound
# Specific add-ons or replacements for gcc only
#
coupard: coupard.c
${CC} ${CFLAGS} -o coupard coupard.c
# Worst Driver
ifeq ($(CC),gcc)
#
ctk: ctk.c
${CC} ${CFLAGS} -o ctk ctk.c
# Worst AI
#CSILENCE+=
#
dgbeards: dgbeards.c
${CC} ${CFLAGS} -DE=break -DF=char -DK=case -DP=int -DR=return \
-DI=0xFFFF dgbeards.c -o dgbeards
# Best abuse of the C preprocessor
#CWARN+=
#
herrmann1: herrmann1.c herrmann1.sh
@echo "NOTE: $@ must be built/run using the script $@.sh"
${SHELL} ./herrmann1.sh
endif
herrmann1_files: herrmann1.gcd herrmann1.sh herrmann1.times2
# Most eye-crossing
##############################
# Special flags for this entry
##############################
#
# This entry requires the GCC -include feature.
ENTRY= jason
PROG= ${ENTRY}
#
herrmann2: herrmann2.c
${MAY_NEED_GCC} ${CFLAGS} herrmann2.c -o herrmann2 \
-include /usr/include/stdlib.h -include /usr/include/stdio.h \
-include /usr/include/time.h -include /usr/include/unistd.h
herrmann2_files: herrmann2.cup herrmann2.ioccc
# Best Of Show
OBJ= ${PROG}.o
DATA=
TARGET= ${PROG}
#
jason: jason.c
${CC} ${CFLAGS} -o jason jason.c
ALT_OBJ=
ALT_TARGET=
# Best Curses Game
#################
# build the entry
#################
#
kev: kev.c
${CC} ${CFLAGS} -DPORT=5455 -DSPEED=50 -o kev kev.c \
-lcurses -ltermcap \
-Dl_="socket(il.sin_family=AF_INET,SOCK_STREAM,0)"
# Best primal ASCII graphics
#
ollinger: ollinger.c
${CC} ${CFLAGS} ollinger.c -o ollinger
# Best abuse of the user
#
rosten: rosten.c
${CC} ${CFLAGS} rosten.c ${X11CCFLAGS} ${X11LDFLAGS} -pedantic -lX11 \
-o rosten
# Best one-liner
#
schweikh: schweikh.c
${CC} ${CFLAGS} schweikh.c -o schweikh
# Best position-independant code
#
westley: westley.c
${CC} ${CFLAGS} westley.c -o westley
westley.orig: westley.orig.c
${CC} ${CFLAGS} westley.orig.c -o westley.orig
# Best position-independant code
#
williams: williams.c
${CC} williams.c ${X11CCFLAGS} ${X11LDFLAGS} -lX11 -o williams
everything: ${WINNERS} ${ALT_NAMES} ${DATA_FILES}
love:
@echo 'not war?'
haste:
${MAKE} waste
waste:
@echo 'waste'
clean:
${RM} -f *.o a.out core ${WINNERS}
clobber: clean
${RM} -f ${WINNERS}
${RM} -f ${ALT_NAMES}
nuke: clobber
all: data ${TARGET}
@${TRUE}
install: all
${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null
.PHONY: all alt data everything clean clobber install \
love haste waste maker easter_egg sandwich \
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
#
alt: data ${ALT_TARGET}
@${TRUE}
# data files
#
data: ${DATA}
@${TRUE}
# both all and alt
#
everything: all alt
###############
# utility rules
###############
#
clean:
${RM} -f ${OBJ} ${ALT_OBJ}
@-if [ -f indent.c ]; then \
echo ${RM} -f indent.c; \
${RM} -f indent.c; \
fi
clobber: clean
${RM} -f ${TARGET} ${ALT_TARGET}
@-if [ -e sandwich ]; then \
${RM} -f sandwich; \
echo 'ate sandwich'; \
fi
install:
@echo "Dr. Spock says that is not logical!"
@${TRUE}
# you may be able to misunderstand the source by reading indent.c
#
indent.c: ${PROG}.c
@if which "${GINDENT}" >/dev/null 2>&1; then \
echo ${RM} -f $@; \
${RM} -f $@; \
echo "${GINDENT} < $< > $@"; \
${GINDENT} < $< > $@; \
elif which "${INDENT}" >/dev/null 2>&1; then \
echo ${RM} -f $@; \
${RM} -f $@; \
echo "${INDENT} < $< > $@"; \
${INDENT} < $< > $@; \
else \
echo "no intent tool found, ident $< yourself, sorry"; \
echo "exit 1"; \
exit 1; \
fi
##################
# 133t hacker rulz
##################
#
love:
@echo 'not war?'
@${TRUE}
haste:
$(MAKE) waste
@${TRUE}
waste:
@echo 'haste'
@${TRUE}
maker:
@echo 'Participate in a maker faire'
@${TRUE}
easter_egg:
@echo "you expected to often misunderstand this $${RANDOM} magic"
@echo "chongo '<was here>' /\\oo/\\"
@echo "Eggy"
sandwich: easter_egg
@if [ `id -u` -eq 0 ]; then \
echo 'Okay.'; \
echo "$${RANDOM}`date +%s`$${RANDOM}" > $@; \
else \
echo 'What? Make it yourself.'; \
exit 1; \
fi
# Understand the history of the Homebrew Computer Club
# as well as the West Coast Computer Faire and
# you might be confused different. :-)
#
supernova: sandwich
@-if [ -r .code_anal ]; then \
${RM} -f .code_anal_v6; \
else \
echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \
fi
@echo "A $@ helps ${MAKE} the elements that help form planets"
@${TRUE}
deep_magic: supernova
@-if [ -r .code_anal ]; then \
ccode_analysis --deep_magic 7889066cdbdf09b0408021754586e895be641cc9be29e7eafd3ca65359541f17 \
--FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \
else \
echo "Wrong! Do it again!"; \
sleep 2; \
echo "Wrong! Do it again!"; \
sleep 2; \
echo "Wrong! Do it again!"; \
fi
@${TRUE}
magic: deep_magic
@-if [ -r .code_anal ]; then \
ccode_analysis --level 20003 --mode 5717175 --FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \
else \
echo "If you don't eat yer meat, you can't have any pudding!"; \
echo "How can you have any pudding if you don't eat yer meat?!"; \
fi
@${TRUE}
# The IOCCC resident astronomer states
#
charon: magic
@echo "$@ is a dwarf planet"
@echo "dwarf is a type of planet"
@echo "therefore IAU, $@ is a planet"
pluto: charon
${MAKE} charon
@echo "$@ is a dwarf planet"
@echo "dwarf is a type of planet"
@echo "therefore, $@ is a planet"
@echo "having lots of planets is good feature because supernovae can help ${MAKE} a lot of them"
+88 -80
View File
@@ -1,4 +1,4 @@
Best Of Show:
# Best Of Show:
Jason Orendorff
5 Buchanan St.
@@ -7,109 +7,117 @@ Best Of Show:
http://www.jorendorff.com/
# To build:
Judge's Remarks:
```sh
make
```
To build:
### To run:
make jason
```sh
./jason
```
Try:
### Try:
./jason
```sh
echo "Do or do not. There is no try."
```
You are in a maze of twisty little passages, all alike.
## Judges' comments:
The really amazing part of this is tha it's a text adventure, and there's
not a single word in the source that isn't a C keyword or function name,
being used as such.
You are in a maze of twisty little passages, all alike.
The interface isn't very tolerant of errors, but you can't really
expect that from something this small.
The really amazing part of this is tha it's a text adventure, and there's
not a single word in the source that isn't a C keyword or function name,
being used as such.
Of particular interest: Go ahead, run it through the preprocessor. You
*still* won't see the words that are used in the game.
The interface isn't very tolerant of errors, but you can't really
expect that from something this small.
Of particular interest: Go ahead, run it through the preprocessor. You
*still* won't see the words that are used in the game.
## Author's comments:
TED shroyer came up with the idea that made it possible to hide all
the text. Thanks, TED. You won. :)
Selected Author's Comments:
$ cc -o prog prog.c
$ ./prog
you are in a maze of twisty little passages
caves lead: left forward back
you see
a lamp
> _
TED shroyer came up with the idea that made it possible to hide all
the text. Thanks, TED. You won. :)
This program is a rather nostalgic little labyrinth game. Start
out by typing "get lamp", then use the direction words "left",
"right", "forward", and "back" to explore the caves. Note that
these words can refer to different passages depending on which way
you're facing. "back" always takes you back the way you came.
Type "quit" to quit.
The maze is randomly generated each time you play. The algorithm
ensures that you start at least 6 hops away from the exit. All
passages are two-way.
$ cc -o prog prog.c
$ ./prog
you are in a maze of twisty little passages
caves lead: left forward back
you see
a lamp
> _
(There is a trick, well-known among adventure game fans, to
keeping one's bearings in games like this. Unless you know the
trick, it can be very difficult to find your way around. Try it
out first; I'll give away the secret at the bottom of this
document.)
This program is a rather nostalgic little labyrinth game. Start
out by typing "get lamp", then use the direction words "left",
"right", "forward", and "back" to explore the caves. Note that
these words can refer to different passages depending on which way
you're facing. "back" always takes you back the way you came.
Type "quit" to quit.
The goal is to collect 8 treasures (plus the lamp) and escape into
the sunlight - or moonlight, as the case may be. After a few
minutes, the lamp runs out of oil, and things become perilous.
The maze is randomly generated each time you play. The algorithm
ensures that you start at least 6 hops away from the exit. All
passages are two-way.
If you manage to escape, you score 50 points for your hide, 50
points per item, and bonus points for speed.
(There is a trick, well-known among adventure game fans, to
keeping one's bearings in games like this. Unless you know the
trick, it can be very difficult to find your way around. Try it
out first; I'll give away the secret at the bottom of this
document.)
Why I think this program is obfuscated:
The goal is to collect 8 treasures (plus the lamp) and escape into
the sunlight - or moonlight, as the case may be. After a few
minutes, the lamp runs out of oil, and things become perilous.
* 70% more # symbols than the average entry.
If you manage to escape, you score 50 points for your hide, 50
points per item, and bonus points for speed.
* Where are all the messages? The game is downright chatty for
only having two string literals ("%d \n" and "Y\n : ! ,.?>").
Why I think this program is obfuscated:
* There is exactly one loop in the program, a for loop, and it is
clearly the product of a deranged mind. Running the
preprocessor only makes it worse.
* 70% more # symbols than the average entry.
* Microsoft Visual C++ won't even compile this program, even
though it is plain ANSI C (*innocent look*) and limits itself to
the most standard and portable of the standard library
facilities.
* Where are all the messages? The game is downright chatty for
only having two string literals ("%d \n" and "Y\n : ! ,.?>").
* Most of the whitespace is significant, so attempts to
beautify it can easily lead to segmentation faults.
* There is exactly one loop in the program, a for loop, and it is
clearly the product of a deranged mind. Running the
preprocessor only makes it worse.
* Attempts to replace the one-character identifiers with longer,
more meaningful names will likewise cause problems. In fact,
simply changing all the Y's to Z's and vice versa results in
some unexpected side effects.
* Microsoft Visual C++ won't even compile this program, even
though it is plain ANSI C (*innocent look*) and limits itself to
the most standard and portable of the standard library
facilities.
When all warnings are enabled, some compilers express the desire
to see a few more parentheses. I respectfully submit that there are
plenty of parentheses in the program (370 in all.) Besides, any
more would put me over the size limit. gcc also generates a
warning about some calculations not being used. Having just spent
19 hours staring at this program, sweating over every character, I
swear gcc is wrong.
* Most of the whitespace is significant, so attempts to
beautify it can easily lead to segmentation faults.
The program is formatted as a poem, to make it more readable.
I find the plaintive chorus "B? B?" particularly poignant.
Also, smiley faces are formatted flush left. (If you don't find
the game entertaining, see if you can find
* Attempts to replace the one-character identifiers with longer,
more meaningful names will likewise cause problems. In fact,
simply changing all the Y's to Z's and vice versa results in
some unexpected side effects.
the fish scales Q)++j<
the shooting star -~- ~ -~i +
When all warnings are enabled, some compilers express the desire
to see a few more parentheses. I respectfully submit that there are
plenty of parentheses in the program (370 in all.) Besides, any
more would put me over the size limit. gcc also generates a
warning about some calculations not being used. Having just spent
19 hours staring at this program, sweating over every character, I
swear gcc is wrong.
The program is formatted as a poem, to make it more readable.
I find the plaintive chorus "B? B?" particularly poignant.
Also, smiley faces are formatted flush left. (If you don't find
the game entertaining, see if you can find
the fish scales Q)++j<
the shooting star -~- ~ -~i +
in the source code.)
in the source code.)
@@ -117,6 +125,6 @@ Selected Author's Comments:
[GAME STRATEGY SPOILER: The trick, of course, is to drop items in
empty rooms to mark them. That way you usually know if you're in a
room you've seen before. It greatly aids mapping.]
[GAME STRATEGY SPOILER: The trick, of course, is to drop items in
empty rooms to mark them. That way you usually know if you're in a
room you've seen before. It greatly aids mapping.]