diff --git a/2005/toledo/.gitignore b/2005/toledo/.gitignore new file mode 100644 index 000000000..96c3e59ab --- /dev/null +++ b/2005/toledo/.gitignore @@ -0,0 +1,3 @@ +toledo +toledo2 +toledo3 diff --git a/2005/toledo/Makefile b/2005/toledo/Makefile index 94666cc28..203f98f9e 100644 --- a/2005/toledo/Makefile +++ b/2005/toledo/Makefile @@ -1,18 +1,333 @@ +#!/usr/bin/env make +# +# IOCCC 2005 winning entry - toledo -build: toledo +################################################################################ +# +# 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-error -Wno-implicit-function-declaration \ + -Wno-parentheses -Wno-int-conversion -Wno-unsequenced + +# 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-float-conversion -Wno-format-nonliteral -Wno-implicit-int-conversion \ + -Wno-missing-variable-declarations -Wno-poison-system-directories +# +CWARN+= -Weverything +# +endif + +# Specific add-ons or replacements for gcc only +# +ifeq ($(CC),gcc) +# +#CSILENCE+= +# +#CWARN+= +# +endif + + +############################## +# Special flags for this entry +############################## +# +ENTRY= toledo +PROG= ${ENTRY} +# +OBJ= ${PROG}.o +DATA= +TARGET= ${PROG} +# +ALT_OBJ= ${PROG}2.o ${PROG}3.o +ALT_TARGET= ${PROG}2 ${PROG}3 + + +################# +# 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} + +# alternative executable +# +alt: data ${ALT_TARGET} + @${TRUE} + +${PROG}2: ${PROG}2.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +${PROG}3: ${PROG}3.c + ${CC} ${CFLAGS} $< -o $@ ${LIBS} + +# data files +# +data: ${DATA} + @${TRUE} + +# both all and alt +# +everything: all alt + + +############### +# utility rules +############### +# clean: - -clobber: - -rm toledo toledo2 + ${RM} -f ${OBJ} ${ALT_OBJ} + @-if [ -f indent.c ]; then \ + echo ${RM} -f indent.c; \ + ${RM} -f indent.c; \ + fi -toledo: toledo.c - ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ +clobber: clean + ${RM} -f ${TARGET} ${ALT_TARGET} + @-if [ -e sandwich ]; then \ + ${RM} -f sandwich; \ + echo 'ate sandwich'; \ + fi -alt: toledo2 +install: + @echo "Dr. Spock says that is not logical!" + @${TRUE} -toledo2: toledo2.c - ${CC} ${CFLAGS} ${LDFLAGS} $< -o $@ +# 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 -data: +################## +# 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 '' /\\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" diff --git a/2005/toledo/README.md b/2005/toledo/README.md index 5c2881aab..d7f30d548 100644 --- a/2005/toledo/README.md +++ b/2005/toledo/README.md @@ -1,39 +1,52 @@ # Best game -Oscar Toledo G. -Familia Toledo -Av. Santa Cruz del Monte 9-304 -Ciudad Satelite Edo de Mexico -CP 53110 -Mexico -uno@biyubi.com + Oscar Toledo G. + Familia Toledo + Av. Santa Cruz del Monte 9-304 + Ciudad Satelite Edo de Mexico + CP 53110 + Mexico + uno@biyubi.com -## Judges' comments +# To build: + +```sh +make +``` + +### To run: + +```sh +./toledo [a ...] +``` + +### Try: + +```sh +./toledo a +./toledo a b +``` + +## Alternate code: + +An alternate version of this entry, `toledo2.c` and `toledo3.c` is provided. + +To compile these alternate versions: + +```sh +make alt +``` + +Use `toledo2` or `toledo3` as you would `toledo` above. + +## Judges' comments: Challenge yourself with your ability to look 5, 6 or more moves ahead. Challenge your knowledge of C operator precedence. The following the move analysis via recursion while it executes moves. All while playing by the rules of C and Chess within a single function! -## Improved version - -Better mate searching - -### To build - - cc toledo.c -o toledo - -### To run - -For two human players - - toledo - -To play against the program - - toledo a - -## Author's comments +## Author's comments: ### What does this program @@ -41,16 +54,22 @@ This is a chess program, it can work in two modes: two-players, and one player (always white) against the machine. To get the first mode, run the program without arguments: - prog +```sh +./toledo +``` The other mode is accesible running the program with one argument (5-ply analysis): - prog a +```sh +./toledo a +``` Two arguments for 6-ply analysis: - prog a b +```sh +./toledo a b +``` And each succesive argument will analyze one ply more. There is no ply limit, but beyond 7 ply is very slow, try it at your own risk and computing time. diff --git a/2005/toledo/toledo.c b/2005/toledo/toledo.c index cf98e3cbe..1557b9af6 100644 --- a/2005/toledo/toledo.c +++ b/2005/toledo/toledo.c @@ -1,3 +1,4 @@ + typedef char ** C; #define F getchar()) #define H(z)*n++=z; #include @@ -24,8 +25,9 @@ typedef int G; char J [ 78 ], O [ ] "$#(ABT|ba`gg`ab8>GK[_`fFDZXEYR" "L\t####" "##B#A#@#G#F#E#D#K\t\3Zlv#tjm" "\3J#tjm\3Pwb" "ofnbwf\3Joofdbo\3)&`&`.&`&`" "#+&g*\t"; G y, -c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,G f, -G N,G k){ G u=99,p,q,r,j,i,x ,t, a, b,d,M=-1e9 +c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,C fa, +C Na,C ka){G f=fa; G N=Na; G k=ka; +G u=99,p,q,r,j,i,x ,t, a, b,d,M=-1e9 ; char *n; if( *l){ e=~e; Z u >21){ q= l[--u]^e; _!-- q){ _!l[p=e?u-10:u+10]){ I(p,)_ e?u>80 & !l[p -=10]:u<39&!l[p+=10])I(p,)} _ l[p=e?u-11:9+u] )I(p,) diff --git a/2005/toledo/toledo2.c b/2005/toledo/toledo2.c index f58aaa991..cf44d2c02 100644 --- a/2005/toledo/toledo2.c +++ b/2005/toledo/toledo2.c @@ -1,3 +1,4 @@ + typedef char ** C; #define F getchar()) #define H(z)*n++=z; #include @@ -24,8 +25,9 @@ typedef int G; char J [ 78 ], O [ ] "$#(ABT|ba`gg`ab8>GK[_`fFDZXEYR" "L\t####" "##B#A#@#G#F#E#D#K\t\3Zlv#tjm" "\3J#tjm\3Pwb" "ofnbwf\3Joofdbo\3)&`&`.&`&`" "#+&g*\t"; G y, -c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,G f, -G N,G k){ G u=99,p,q,r,j,i,x ,t,a,b=S,d,M=-1e9 +c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,C fa, +C Na,C ka){ G f=fa; G N=Na; G k=ka; +G u=99,p,q,r,j,i,x ,t,a,b=S,d,M=-1e9 ; char *n; if( *l){ e=~e; Z u >21){ q= l[--u]^e; _!-- q){ _!l[p=e?u-10:u+10]){ I(p,)_ e?u>80 & !l[p -=10]:u<39&!l[p+=10])I(p,)} _ l[p=e?u-11:9+u] )I(p,) diff --git a/2005/toledo/toledo3.c b/2005/toledo/toledo3.c index b60e295f7..72e2d7a76 100644 --- a/2005/toledo/toledo3.c +++ b/2005/toledo/toledo3.c @@ -1,3 +1,4 @@ + typedef char ** C; #define F getchar()) #define H(z)*n++=z; #include @@ -24,8 +25,9 @@ typedef int G; char J [ 78 ], O [ ] "$#(ABT|ba`gg`ab8>GK[_`fFDZXEYR" "L\t####" "##B#A#@#G#F#E#D#K\t\3Zlv#tjm" "\3J#tjm\3Pwb" "ofnbwf\3Joofdbo\3)&`&`.&`&`" "#+&g*\t"; G y, -c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,G f, -G N,G k){ G u=99,p,q,r,j,i,x ,t,a,b=S,d,M=-1e9 +c,h,e,S,*s,l[149]; jmp_buf z ; G main(G L,C fa, +C Na,C ka){ G f=fa; G N=Na; G k=ka; +G u=99,p,q,r,j,i,x ,t,a,b=S,d,M=-1e9 ; char *n; if( *l){ e=~e; Z u >21){ q= l[--u]^e; _!-- q){ _!l[p=e?u-10:u+10]){ I(p,)_ e?u>80 & !l[p -=10]:u<39&!l[p+=10])I(p,)} _ l[p=e?u-11:9+u] )I(p,)