fix Makefile and README.md for 2001/cheong

This commit is contained in:
Landon Curt Noll committed 2023-03-17 14:51:55 -07:00
1 parent b006b7a79c
commit 38d4092abe
2 files changed
+322 -227

No files matched your search

+259 -169
View File
@@ -1,18 +1,9 @@
#!/usr/bin/env make #!/usr/bin/env make
# #
# IOCCC 2001 entry Makefile # IOCCC 2001 winning entry - cheong
################################################################################ ################################################################################
# #
# 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: # Regarding individual entries:
# #
# IOCCC winning entry code may not work on your system. Even with standards, # IOCCC winning entry code may not work on your system. Even with standards,
@@ -45,192 +36,291 @@
# See: http://creativecommons.org/licenses/by-sa/3.0/ # See: http://creativecommons.org/licenses/by-sa/3.0/
SHELL= /bin/sh #############################
CAT= cat # shell used by this Makefile
RM= rm #############################
SED= sed
TRUE= true
#CINCLUDE= -I ${HOMEBREW_PREFIX}/include/SDL2
# optimization
# #
# Most compiles will safely use -O2. Some can use only -O. SHELL= bash
# A few compilers have broken optimizers and thus you may
# not want anything. #######################
# 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-implicit-int
# 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=
#OPT= -O #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, CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
# 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}
# NOTE: On some systems, the library path does not include the location # Libraries needed to build
# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir
# in order to compile with these libs.
# #
X11CCFLAGS= -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/usr/include/X11 LIBS=
#X11CCFLAGS= #LIBS= -lm
X11LDFLAGS= -L/usr/X11R6/lib -Wl,-R/usr/X11R6/lib #LIBS= -L ${X11_LIBDIR} -lX11
#X11LDFLAGS= #LIBS= `${SDL2_CONFIG} --libs`
# ANSI compiler # C compiler to use
#
# 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.
# #
CC= cc 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 \ ifeq ($(CC),clang)
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
# #
anonymous: anonymous.c CSILENCE+= -Wno-implicit-int-conversion -Wno-missing-variable-declarations \
magic='${MAY_NEED_GCC} -O1'; \ -Wno-poison-system-directories
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
# #
bellard: bellard.c CWARN+= -Weverything
${CC} -rdynamic ${CFLAGS} bellard.c -o bellard -ldl
bellard_files: bellard.otccex.c
# Best short program
# #
cheong: cheong.c endif
${CC} ${CFLAGS} cheong.c -o cheong
# Most obfuscated sound # Specific add-ons or replacements for gcc only
# #
coupard: coupard.c ifeq ($(CC),gcc)
${CC} ${CFLAGS} -o coupard coupard.c
# Worst Driver
# #
ctk: ctk.c #CSILENCE+=
${CC} ${CFLAGS} -o ctk ctk.c
# Worst AI
# #
dgbeards: dgbeards.c #CWARN+=
${CC} ${CFLAGS} -DE=break -DF=char -DK=case -DP=int -DR=return \
-DI=0xFFFF dgbeards.c -o dgbeards
# Best abuse of the C preprocessor
# #
herrmann1: herrmann1.c herrmann1.sh endif
@echo "NOTE: $@ must be built/run using the script $@.sh"
${SHELL} ./herrmann1.sh
herrmann1_files: herrmann1.gcd herrmann1.sh herrmann1.times2
# Most eye-crossing ##############################
# Special flags for this entry
##############################
# #
# This entry requires the GCC -include feature. ENTRY= cheong
PROG= ${ENTRY}
# #
herrmann2: herrmann2.c OBJ= ${PROG}.o
${MAY_NEED_GCC} ${CFLAGS} herrmann2.c -o herrmann2 \ DATA=
-include /usr/include/stdlib.h -include /usr/include/stdio.h \ TARGET= ${PROG}
-include /usr/include/time.h -include /usr/include/unistd.h
herrmann2_files: herrmann2.cup herrmann2.ioccc
# Best Of Show
# #
jason: jason.c ALT_OBJ=
${CC} ${CFLAGS} -o jason jason.c ALT_TARGET=
# Best Curses Game
#################
# build the entry
#################
# #
kev: kev.c all: data ${TARGET}
${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
@${TRUE} @${TRUE}
install: all .PHONY: all alt data everything clean clobber install \
${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null 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"
+63 -58
View File
@@ -1,4 +1,4 @@
Best short program: # Best short program:
Raymond Cheong Raymond Cheong
Johns Hopkins University Johns Hopkins University
@@ -6,81 +6,86 @@ Best short program:
http://www.bme.jhu.edu/~rcheong/ http://www.bme.jhu.edu/~rcheong/
# To build:
Judges' Comments: ```sh
make
```
To build: ### To run:
make cheong ```sh
./cheong digits
```
Try: ### Try:
./cheong 1024 ```sh
./cheong 12345678901234567890 ./cheong 1024
./cheong 05305265226926441255040573044986873789 ./cheong 12345678901234567890
./cheong 05305265226926441255040573044986873789
```
Be sure to give an even number of digits in the argument. Add a Be sure to give an even number of digits in the argument. Add a
leading 0 if needed. leading 0 if needed.
The source code is nice, compact, and self documenting The source code is nice, compact, and self documenting
as all good programs should be! :-) as all good programs should be! :-)
## Author's comments:
Selected Author's Comments: ### Operation
Operation Compile normally and run with one argument, an integer with 2n digits.
========= Program will return the integer part of its square root (n-digits).
Compile normally and run with one argument, an integer with 2n digits. For example,
Program will return the integer part of its square root (n-digits).
For example,
> gcc -o cheong cheong.c ```sh
> cheong 1234567890 $ cc -o cheong cheong.c
35136 $ cheong 1234567890
> cheong 0200000000000000000000000000 35136
14142135623730 $ cheong 0200000000000000000000000000
> 14142135623730
```
Deviation from these instructions will cause undefined results. :-) Deviation from these instructions will cause undefined results. :-)
### Portability
Portability This program runs normally on any ANSI C compiler and is ASCII dependent.
===========
This program runs normally on any ANSI C compiler and is ASCII dependent.
Strict compiling gives just one unavoidable warning Strict compiling gives just one unavoidable warning:
> gcc -ansi -Wall cheong.c
cheong.c:3: warning: third argument of `main' should probably be `char **'
> gcc -ansi -Wall cheong.c
cheong.c:3: warning: third argument of `main' should probably be `char **'
Obfuscation ### Obfuscation
===========
The main obfuscation is the algorithm used to calculate square roots,
sometimes known as the longhand method. The basic algorithm is itself
obfuscated in that it only uses subtraction to calculate square roots.
(For a detailed explanation, check Google or see Jack Crenshaw's article
at http://www.embedded.com/98/9802fe2.htm) This program uses an even
more obscured version which includes the following:
- A single string is used to store two numbers of different lengths
- Operations are done in a weird hybrid of base 10 and base 20
- Subtraction is done addition style, i.e. 4 minus 8 equals 6 carry a -1
- Recursive calls to main()
Minor obfuscations: The main obfuscation is the algorithm used to calculate square roots,
- Self documenting whitespace in rectangular code block, for fun and sometimes known as the longhand method. The basic algorithm is itself
glory (view with fixed-width font) obfuscated in that it only uses subtraction to calculate square roots.
- Integer constants adjusted to less meaningful values, just for added (For a detailed explanation, check Google or see Jack Crenshaw's article
confusion at http://www.embedded.com/98/9802fe2.htm) This program uses an even
- Hard-to-read, meaningless variable names to spite the reader more obscured version which includes the following:
- A single string is used to store two numbers of different lengths
- Operations are done in a weird hybrid of base 10 and base 20
- Subtraction is done addition style, i.e. 4 minus 8 equals 6 carry a -1
- Recursive calls to main()
Challenges for the masses: Minor obfuscations:
- What are the meanings [sic, plural] of the variable o? - Self documenting whitespace in rectangular code block, for fun and
- Why is (c+999)%10-(D[I]+92)%10 not equivalent to (c-D[I]+7)%10? glory (view with fixed-width font)
- How does the program terminate? - Integer constants adjusted to less meaningful values, just for added
- Is the programmer sane? ;-) confusion
- Hard-to-read, meaningless variable names to spite the reader
Challenges for the masses:
- What are the meanings [sic, plural] of the variable o?
- Why is (c+999)%10-(D[I]+92)%10 not equivalent to (c-D[I]+7)%10?
- How does the program terminate?
- Is the programmer sane? ;-)
Appreciation ### Appreciation
============
Thanks goes out to Bobby Rohde for numerous suggestions on how to shorten Thanks goes out to Bobby Rohde for numerous suggestions on how to shorten
the program. the program.