fix Makefile and README.md for 2006/sykes1

This commit is contained in:
Landon Curt Noll committed 2023-03-23 18:39:45 -07:00
1 parent 8df52c7509
commit 72d6d0954d
2 files changed
+355 -42

No files matched your search

+316 -19
View File
@@ -1,39 +1,336 @@
# 2006 makefile #!/usr/bin/env make
# #
# Copyright (C) 2006-2009, Landon Curt Noll, Simon Cooper, Peter Seebach # IOCCC 2006sykes1 winning entry - sykes1
# and Leonid A. Broukhis. All Rights Reserved. Permission for personal,
# educational or non-profit use is granted provided this copyright and
# notice are included in its entirety and remains unaltered. All other
# uses must receive prior permission from the contest judges.
################################################################################
#
# Regarding individual entries:
#
# IOCCC winning entry code may not work on your system. Even with standards,
# conditions and build environments change, especially when it comes to more
# extreme code such you might find in an IOCCC winner. Moreover, what was
# allowed and liked in one IOCCC contest may no longer be liked/allowed in
# later IOCCC years.
#
# Corrections on winning author and fixing typos in remarks are VERY WELCOME.
#
# GitHub pull requests are welcome:
#
# If you have a patch that might make running an entry work in modern Unix-like
# environments, please create a GitHub pull request for the IOCCC judges to
# consider.
#
# Suggestions and corrections regarding Makefiles, winning author information,
# fixing typos in remarks, and code patches are welcome via opening a GitHub
# issue or better yet, by creating a GitHub pull request for the IOCCC judges
# to consider. To form a GitHub issue or GitHub pull, please visit:
#
# https://github.com/ioccc-src/winner
#
################################################################################
# This work by Landon Curt Noll and Leonid A. Broukhis is licensed under:
#
# Creative Commons Attribution-ShareAlike 3.0 Unported License.
#
# See: http://creativecommons.org/licenses/by-sa/3.0/
#############################
# shell used by this Makefile
#############################
#
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-bitwise-op-parentheses -Wno-shift-op-parentheses
# 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= -O1
#OPT= -O2
OPT= -O3
# Default flags for ANSI C compilation
#
CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
# Libraries needed to build
#
LIBS=
#LIBS= -lm
#LIBS= -L ${X11_LIBDIR} -lX11
#LIBS= `${SDL2_CONFIG} --libs`
# C compiler to use
#
CC= cc
#CC=clang
#CC=gcc
# Compiler add-ons or replacements for clang only
#
ifeq ($(CC),clang)
#
CSILENCE+= -Wno-conditional-uninitialized -Wno-missing-variable-declarations \
-Wno-poison-system-directories -Wno-sign-conversion
#
CWARN+= -Weverything
#
endif
# Specific add-ons or replacements for gcc only
#
ifeq ($(CC),gcc)
#
#CSILENCE+=
#
#CWARN+=
#
endif
##############################
# Special flags for this entry # Special flags for this entry
##############################
# #
LOCAL_FLAGS= -Wall -W -ansi -O3 --unroll-loops ENTRY= sykes1
PROG= ${ENTRY}
# data files for this entry
# #
OBJ= ${PROG}.o
DATA= DATA=
TARGET= ${PROG} ${PROG}.html
#
ALT_OBJ=
ALT_TARGET=
build: ${ENTRY} ${ENTRY}.html # This entry wants to use -funroll-loops
#
CFLAGS+= -funroll-loops
#################
# build the entry
#################
#
all: data ${TARGET}
@${TRUE}
.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}
${PROG}.html: ${PROG}.c
${RM} ${PROG}.html
cp ${PROG}.c ${PROG}.html
# alternative executable
#
alt: data ${ALT_TARGET}
@${TRUE}
# data files
#
data: ${DATA}
@${TRUE}
# both all and alt
#
everything: all alt
###############
# utility rules
###############
#
clean: clean:
-${RM} ${ENTRY} ${ENTRY}.html ${RM} -f ${OBJ} ${ALT_OBJ}
@-if [ -f indent.c ]; then \
echo ${RM} -f indent.c; \
${RM} -f indent.c; \
fi
clobber: clean clobber: clean
${RM} -f ${TARGET} ${ALT_TARGET}
${RM} -f ${PROG}.html
@-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
alt: ##################
# 133t hacker rulz
##################
#
love:
@echo 'not war?'
@${TRUE}
haste:
$(MAKE) waste
@${TRUE}
data: waste:
@echo 'haste'
@${TRUE}
maker:
@echo 'Participate in a maker faire'
@${TRUE}
${ENTRY}: ${ENTRY}.c ${DATA} easter_egg:
${CC} ${CFLAGS} ${LOCAL_FLAGS} ${ENTRY}.c -o ${ENTRY} @echo "you expected to often misunderstand this $${RANDOM} magic"
@echo "chongo '<was here>' /\\oo/\\"
@echo "Eggy"
${ENTRY}.html: ${ENTRY}.c sandwich: easter_egg
${RM} ${ENTRY}.html @if [ `id -u` -eq 0 ]; then \
cp ${ENTRY}.c ${ENTRY}.html 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"
+39 -23
View File
@@ -1,36 +1,42 @@
# Best Assembler # Best Assembler
Stephen Sykes Stephen Sykes
Itäinen koulupolku Itäinen koulupolku
Kauniainen Kauniainen
Finland Finland
<http://www.stephensykes.com> <http://www.stephensykes.com>
## Judges' Comments: # To build:
### To build: ```sh
make
make sykes1 ```
### To run: ### To run:
./sykes1 ```sh
./sykes1
```
next point your browser to the file: Next point your browser to the file: `sykes1.html`.
sykes1.html ### Try:
in the same directory. Next try: ```sh
./sykes1 10
```
./sykes1 10 Refresh your browser.
and refresh your browser. Now read the sykes1.html page source. ## Judges' comments:
Read the sykes1.html page source.
Now then read the C source. Confused? :-) Now then read the C source. Confused? :-)
For extra credit, understand what happens when you give this entry For extra credit, understand what happens when you give this entry
an negative number argument, and why. an negative number argument, and why.
## Selected Author's Comments: ## Author's comments:
This cube shaped program solves the fiendishly difficult "Bedlam Cube" This cube shaped program solves the fiendishly difficult "Bedlam Cube"
@@ -54,7 +60,9 @@ need to be very lucky indeed to stumble across a solution.
Compile the program, then test that it works: Compile the program, then test that it works:
./sykes1 ```sh
./sykes1
```
Shortly you should see the first solution pop out on your screen. It Shortly you should see the first solution pop out on your screen. It
shows you how to build the cube piece by piece, rendered in glorious shows you how to build the cube piece by piece, rendered in glorious
@@ -68,7 +76,9 @@ build the cube. Rendered in glorious 3d color.
Want to see another solution? Try: Want to see another solution? Try:
./sykes1 some_number ```sh
./sykes1 some_number
```
The program will discard solutions up to the number, and output numbered The program will discard solutions up to the number, and output numbered
solution. Refresh your browser window to see the new solution. solution. Refresh your browser window to see the new solution.
@@ -77,7 +87,9 @@ Try some more - there are exactly 19186 solutions to choose from.
If you have a fast machine you might try the last solution: If you have a fast machine you might try the last solution:
./sykes1 19186 ```sh
./sykes1 19186
```
On my machine this takes about half an hour to run. On my machine this takes about half an hour to run.
@@ -87,9 +99,11 @@ The implementation is an optimized recursive algorithm that tries to fit
the pieces into the cube one by one. The cube pieces are defined near the pieces into the cube one by one. The cube pieces are defined near
the start of the program: the start of the program:
int s[ ] = { 186, 94, 1426, 3098 ```c
,1047 , 122 , 1082 , 3083 , 1039 int s[ ] = { 186, 94, 1426, 3098
, 569 , 527 , 1054 , 531 } ; ,1047 , 122 , 1082 , 3083 , 1039
, 569 , 527 , 1054 , 531 } ;
```
Each piece is a bitmap, and represents a 3x3x3 cube. Each piece is a bitmap, and represents a 3x3x3 cube.
@@ -131,7 +145,9 @@ the pieces, and provided that a solution is possible, it will be found.
For example, if you modify line 13 of the source like this, the program For example, if you modify line 13 of the source like this, the program
will solve for a different piece set: will solve for a different piece set:
int s[ ] = { 187, 94, 402, 3098 ```c
int s[ ] = { 187, 94, 402, 3098
```
And of course you can make your own. And of course you can make your own.