diff --git a/2018/yang/Makefile b/2018/yang/Makefile index 284d4722d..47cd95b6b 100644 --- a/2018/yang/Makefile +++ b/2018/yang/Makefile @@ -1,41 +1,52 @@ #!/usr/bin/env make # -# 2018 makefile +# IOCCC 2018 winning entry - yang + +################################################################################ # -# This work by Landon Curt Noll, Simon Cooper, and Leonid A. Broukhis -# is licensed under: +# 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/ -################ -# tool locations -################ +############################# +# shell used by this Makefile +############################# # SHELL= bash -CP= cp -CPP= cpp -GUNZIP= gunzip -BUNZIP2= bunzip2 -GZIP_PROG= gzip -BZIP2= bzip2 -CURL= curl -DD= dd -LD= ld -MAKE= make -RM= rm -SED= sed -TAR= tar -TRUE= true -MKDIR= mkdir -MV= mv -TR= tr -GREP= grep -SORT= sort -UNIQ= uniq -STRIP= strip + +####################### +# common tool locations +####################### +# +include ../../var.mk # Set X11_LIBDIR to the directory where the X11 library resides # @@ -49,28 +60,25 @@ X11_LIBDIR= /opt/X11/lib #X11_INCDIR= /usr/X11/include X11_INCDIR= /opt/X11/include -# Compiler warnings -# -#CWARN= -#CWARN= -Wall -#CWARN= -Wall -Wextra -CWARN= -Wall -Wextra -pedantic ${CSILENCE} -#CWARN= -Wall -Wextra -Weverything -#CWARN= -Wall -Wextra -Weverything -pedantic -#CWARN= -Wall -Wextra -Weverything -pedantic ${CSILENCE} - -# Silence warnings that ${CWARN} would normally complain about +# Common C compiler warnings to silence # CSILENCE= #CSILENCE= -Wno-implicit-int -# compiler standard +# 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=c11 +CSTD= -std=gnu17 -# compiler bit architecture +# Compiler bit architecture # # Some entries require 32-bitness: # ARCH= -m32 @@ -82,20 +90,21 @@ CSTD= -std=c11 # ARCH= -# defines that are needed to compile +# Defines that are needed to compile # CDEFINE= -#CDEFINE= -DIOCCC=25 +#CDEFINE= -DIOCCC -# include files that are needed to compile +# 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} +#CINCLUDE= -I ${X11_INCDIR} -I ${X11_INCDIR}/X11 +#CINCLUDE= `${SDL2_CONFIG} --cflags` -# optimization +# 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 @@ -108,37 +117,55 @@ CINCLUDE= #OPT= -O2 OPT= -O3 -# default flags for ANSI C compilation +# Default flags for ANSI C compilation # CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT} # Libraries needed to build # LIBS= -#LIBS= -L ${X11_LIBDIR} +#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 #CC=clang -MAY_NEED_GCC= gcc +#CC=gcc + +# Compiler add-ons or replacements for clang only +# +ifeq ($(CC),clang) +# +CSILENCE+= -Wno-comma -Wno-implicit-int-conversion -Wno-missing-variable-declarations \ + -Wno-poison-system-directories -Wno-sign-conversion -Wno-unused-macros +# +CWARN+= -Weverything +# +endif + +# Specific add-ons or replacements for gcc only +# +ifeq ($(CC),gcc) +# +#CSILENCE+= +# +#CWARN+= +# +endif ############################## # Special flags for this entry ############################## # -OBJ= prog.o -DATA= +ENTRY= yang +PROG= prog +# +OBJ= ${PROG}.o +CSRC= ${PROG}.o +DATA= spoiler.html TARGET= left right shift msg0 msg1 msg2 # ALT_OBJ= @@ -149,10 +176,14 @@ ALT_TARGET= # build the entry ################# # -all: ${TARGET} ${DATA} +all: data ${TARGET} @${TRUE} -left: prog.c +.PHONY: all alt data everything clean clobber install \ + love haste waste maker easter_egg sandwich \ + supernova deep_magic magic charon pluto + +left: ${PROG}.c ${CC} ${CFLAGS} $< -o $@ ${LIBS} right: generated1.c @@ -170,23 +201,23 @@ msg1: generated4.c msg2: generated5.c ${CC} ${CFLAGS} $< -o $@ ${LIBS} -generated1.c: prog.c left +generated1.c: ${PROG}.c left @${RM} -f $@ ./left < $< > $@ -generated2.c: prog.c right +generated2.c: ${PROG}.c right @${RM} -f $@ ./right < $< > $@ -generated3.c: prog.c left +generated3.c: ${PROG}.c left @${RM} -f $@ ./left < $< | ./left > $@ -generated4.c: prog.c left shift +generated4.c: ${PROG}.c left shift @${RM} -f $@ ./shift < $< | ./left > $@ -generated5.c: prog.c right shift +generated5.c: ${PROG}.c right shift @${RM} -f $@ ./shift < $< | ./right > $@ @@ -223,11 +254,11 @@ msg8: generated11.c msg9: generated12.c $(CC) $(CFLAGS) $< -o $@ -generated6.c: prog.c right left shift +generated6.c: ${PROG}.c right left shift @${RM} -f $@ ./right < $< | ./shift | ./left > $@ -generated7.c: prog.c right shift +generated7.c: ${PROG}.c right shift @${RM} -f $@ ./shift < $< | ./right | ./shift | ./right > $@ @@ -259,9 +290,9 @@ spoiler_for_the_truly_impatient: i_just_want_to_see_the_final_message i_just_want_to_see_the_final_message: msg11.txt @cat $< -msg11.txt: msg11 prog.c +msg11.txt: msg11 ${PROG}.c @${RM} -f $@ - ./$< < prog.c > $@ + ./$< < ${PROG}.c > $@ msg10: generated13.c $(CC) $(CFLAGS) $< -o $@ @@ -269,15 +300,15 @@ msg10: generated13.c msg11: generated14.c $(CC) $(CFLAGS) $< -o $@ -generated13.c: prog.c left shift +generated13.c: ${PROG}.c left shift ./left < $< | ./left | ./left | ./shift | ./left | ./shift | ./left | ./shift | ./left > $@ -generated14.c: prog.c msg10 +generated14.c: ${PROG}.c msg10 ./msg10 < $< > $@ # alternative executable # -alt: ${ALT_TARGET} +alt: data ${ALT_TARGET} @${TRUE} # data files @@ -285,15 +316,21 @@ alt: ${ALT_TARGET} data: ${DATA} @${TRUE} +# both all and alt +# +everything: all alt + ############### # utility rules ############### # -everything: all alt - 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} @@ -303,20 +340,28 @@ clobber: clean echo 'ate sandwich'; \ fi -nuke: clobber - @${TRUE} - -dist_clean: nuke - @${TRUE} - install: - @echo "Surely you are performing, Dr. May!" + @echo "Dr. Spock says that is not logical!" @${TRUE} -# backwards compatibility +# you may be able to misunderstand the source by reading indent.c # -build: all - @${TRUE} +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 ################## @@ -335,22 +380,19 @@ waste: @echo 'haste' @${TRUE} -make: - @echo 'Attend a maker faire' +maker: + @echo 'Participate in a maker faire' @${TRUE} easter_egg: - @echo you expected to often mis-understand this $${RANDOM} magic - @echo chongo '' "/\\oo/\\" - @echo Eggy + @echo "you expected to often misunderstand this $${RANDOM} magic" + @echo "chongo '' /\\oo/\\" + @echo "Eggy" -fabricate fashion form frame manufacture produce: make - @${TRUE} - -sandwich: +sandwich: easter_egg @if [ `id -u` -eq 0 ]; then \ echo 'Okay.'; \ - echo $${RANDOM}`date +%s`$${RANDOM} > $@; \ + echo "$${RANDOM}`date +%s`$${RANDOM}" > $@; \ else \ echo 'What? Make it yourself.'; \ exit 1; \ @@ -360,18 +402,19 @@ sandwich: # as well as the West Coast Computer Faire and # you might be confused different. :-) # -supernova: nuke +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 + @echo "A $@ helps ${MAKE} the elements that help form planets" @${TRUE} -deep_magic: +deep_magic: supernova @-if [ -r .code_anal ]; then \ - ccode_analysis --deep_magic 3a3fabb90892eeb2f610ae0f74a35a970060665a063ab702bd686c17c4ae07f6 --FNV1a_hash_256_bit "prog"; \ + ccode_analysis --deep_magic 7889066cdbdf09b0408021754586e895be641cc9be29e7eafd3ca65359541f17 \ + --FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \ else \ echo "Wrong! Do it again!"; \ sleep 2; \ @@ -383,7 +426,7 @@ deep_magic: magic: deep_magic @-if [ -r .code_anal ]; then \ - ccode_analysis --mode 216091 --level 216193 --FNV1a_hash_256_bit "prog"; \ + 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?!"; \ @@ -392,14 +435,14 @@ magic: deep_magic # The IOCCC resident astronomer states # -charon: supernova - @echo $@ is a dwarf planet - @echo dwarf is a type of planet - @echo $@ is a planet +charon: magic + @echo "$@ is a dwarf planet" + @echo "dwarf is a type of planet" + @echo "therefore IAU, $@ is a planet" -pluto: supernova +pluto: charon ${MAKE} charon - @echo $@ is a dwarf planet - @echo dwarf is a type of planet - @echo $@ is a planet - @echo get used to having lots of planets becasue supernovae can ${MAKE} a lot of them + @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/2018/yang/README.md b/2018/yang/README.md index 05753815b..7693dd509 100644 --- a/2018/yang/README.md +++ b/2018/yang/README.md @@ -1,31 +1,37 @@ # Most shifty -Don Yang - + Don Yang + +# To build: -## Judges' comments: -### To use: +```sh +make +``` - make - more generated1.c - more generated2.c - more generated3.c +### To run: + +```sh +more generated1.c +more generated2.c +more generated3.c +``` ### Try: - make - ./left < prog.c - ./right < prog.c - ./left < prog.c | ./left +```sh +./left < prog.c +./right < prog.c +./left < prog.c | ./left - ./shift < prog.c +./shift < prog.c - ./msg0 - ./msg1 - ./msg2 +./msg0 +./msg1 +./msg2 +``` -### Selected Judges Remarks: +## Judges' comments: Code should be readable in any direction! This tool will help you rotate your code so you don't have to stare at it sideways or even upside down. Rotating @@ -45,27 +51,34 @@ programs. The final message can be revealed using - ./msg9 < prog.c +```sh +./msg9 < prog.c +``` But what combinations will generate ./msg3, ./msg4, ./msg5, ./msg6, ./msg7, ./msg8 and finally ./msg9? ## Author's comments: -# Tools usage + +### Tools usage Nuko is a text rotator: given some text in stdin, Nuko will write the same text to stdout, but rotated 90 degrees counterclockwise. - gcc prog.c -o left - ./left < input.txt > rotated_counterclockwise.txt +```sh +cc prog.c -o left +./left < input.txt > rotated_counterclockwise.txt +``` Due to static memory allocation, only the first 1K columns by 1K rows are rotated, the rest are silently ignored. But fear not, a separate tool with dynamic memory allocation is included: - ./left < prog.c > r1.c - gcc r1.c -o right - ./right < input.txt > rotated_clockwise.txt +```sh +./left < prog.c > r1.c +cc r1.c -o right +./right < input.txt > rotated_clockwise.txt +``` For variety, this second tool rotates clockwise instead of counterclockwise. Also, it can handle files larger than 1024x1024, @@ -76,22 +89,26 @@ rotate counterclockwise once more, we get another program. This program outputs a single message to stdout, which is the name of the series that Nuko came from. - ./left < prog.c | ./left > r2.c - gcc r2.c -o msg0 - ./msg0 +```sh +./left < prog.c | ./left > r2.c +cc r2.c -o msg0 +./msg0 +``` There is one final rotation, which produces a tool that removes leading whitespaces: - ./left < prog.c | ./left | ./left > r3.c - gcc r3.c -o shift - ./shift < input.txt > no_leading_space.txt +```sh +./left < prog.c | ./left | ./left > r3.c +cc r3.c -o shift +./shift < input.txt > no_leading_space.txt +``` Where this might be useful, besides ruining the formatting of certain files, is that it completes the set of tools needed to solve the puzzle that is embedded in prog.c -# Puzzle box +### Puzzle box Notice how the edges of prog.c contain two notches. By rotating prog.c and removing leading space, the code would be shifted one space @@ -100,8 +117,10 @@ side). This shifted code behaves slightly different from the original program. For example, here are two more messages that can be produced: - ./shift < prog.c | ./right > msg1.c && gcc msg1.c -o msg1 && ./msg1 - ./shift < prog.c | ./left > msg2.c && gcc msg2.c -o msg2 && ./msg2 +```sh +./shift < prog.c | ./right > msg1.c && gcc msg1.c -o msg1 && ./msg1 +./shift < prog.c | ./left > msg2.c && gcc msg2.c -o msg2 && ./msg2 +``` In total, there are 9 embedded strings that can be produced via a sequence of rotates and shifts, one of which can be used to extract @@ -114,7 +133,7 @@ lazy, just read the Makefile). Source code for all the tools needed to solve this puzzle are embedded in prog.c, all you need is a C compiler. -# Features +### Features - Code compiles when rotated 4 ways. This required a bit of patience to achieve. Code still compiles even with one column of @@ -129,7 +148,7 @@ in prog.c, all you need is a C compiler. - Process for writing prog.c is available in spoiler.html -# Compatibility +### Compatibility Nuko and the rotated tools accepts only ASCII files where each character maps to exactly one byte. Also, end-of-line sequence is @@ -152,11 +171,10 @@ Nuko has been verified to work with these compiler / OS combinations: Nuko compiles without warnings with all compilers above, even with "-Wall -Wextra -pedantic" for gcc and clang. --------------------------------------------------------------------------------- -