diff --git a/1989/westley/.gitignore b/1989/westley/.gitignore index 25ce9886f..7a551420e 100644 --- a/1989/westley/.gitignore +++ b/1989/westley/.gitignore @@ -1,11 +1,20 @@ +alt.ver0 +alt.ver0.c ver0 ver0.c +alt.ver1 +alt.ver1.c ver1 ver1.c +alt.ver2 +alt.ver2.c ver2 ver2.c +alt.ver3 +alt.ver3.c ver3 ver3.c westley +westley.alt westley.orig prog.orig diff --git a/1989/westley/Makefile b/1989/westley/Makefile index fe541f499..6ccfe5be7 100644 --- a/1989/westley/Makefile +++ b/1989/westley/Makefile @@ -140,6 +140,9 @@ ${PROG}: ${PROG}.c alt: data ${ALT_TARGET} @${TRUE} +${ALT_TARGET}: ${PROG}.alt.c + ${CC} ${CFLAGS} -Dznva=main $< -o $@ ${LDFLAGS} + ver0: ${PROG} -./${PROG} < westley.c > ver0.c -${CC} ${CFLAGS} ver0.c -o $@ ${LDFLAGS} @@ -159,6 +162,25 @@ ver3: ${PROG} @echo "** NOTE: this version will not compile with clang **" -${CC} ${CFLAGS} ver3.c -o $@ ${LDFLAGS} +alt.ver0: ${PROG}.alt + -./${PROG}.alt < westley.alt.c > alt.ver0.c + -${CC} ${CFLAGS} -Dznva=main alt.ver0.c -o $@ ${LDFLAGS} + +alt.ver1: ${PROG}.alt + -./${PROG}.alt 1 < westley.alt.c > alt.ver1.c + -${CC} ${CFLAGS} -Dznva=main alt.ver1.c -o $@ ${LDFLAGS} + +alt.ver2: ${PROG}.alt + -./${PROG}.alt 1 2 < westley.alt.c > alt.ver2.c + @echo "** NOTE: this alt version will not currently compile **" + -${CC} ${CFLAGS} -Dznva=main alt.ver2.c -o $@ ${LDFLAGS} + +alt.ver3: ${PROG}.alt + -./${PROG}.alt 1 2 3 < westley.alt.c > alt.ver3.c + @echo "** NOTE: this alt version will not currently compile **" + -${CC} ${CFLAGS} -Dznva=main alt.ver3.c -o $@ ${LDFLAGS} + + # data files # data: ${DATA} diff --git a/1989/westley/README.md b/1989/westley/README.md index 444c18cbe..e6ef8cfa3 100644 --- a/1989/westley/README.md +++ b/1989/westley/README.md @@ -30,17 +30,6 @@ Try compiling and running the 4 resulting programs like: ./compile.sh ``` -This will remove the programs and then run: - -``` -./westley < westley.c > ver0.c -./westley 1 < westley.c > ver1.c -./westley 1 2 < westley.c > ver2.c -./westley 1 2 3 < westley.c > ver3.c -``` - -followed by compiling each version. - If you need to specify an alternate compiler path, say because your default compiler is clang (or in the case of macOS gcc is clang) you can do so like: @@ -60,39 +49,35 @@ Finally try: ./westley # input some lines of text, sending EOF (usually ctrl-d) to end -echo IOCCC | ./westley -echo IOCCC | ./westley 1 -echo IOCCC | ./westley 1 2 -echo IOCCC | ./westley 1 2 3 - -echo IOCCC | ./ver0 -echo Version 1 | ./ver1 -echo Version 2 | ./ver2 -echo Version 3 | ./ver3 +./try.sh # demo of some input ``` ## Alternate code: The alternate code allows SOME of the features to work with clang but some of -the code it generates (see [compile.sh](compile.sh), which does not use this -version) is not compilable even in gcc let alone clang. Nevertheless the main -feature should work for clang. +the code it generates (see [compile.alt.sh](compile.alt.sh) is not compilable +even in gcc let alone clang. Nevertheless the main feature should work and the +same goes for the `alt.ver0` and `alt.ver1`; currently `alt.ver2` and `alt.ver3` +will not compile even with gcc but it is nonetheless generated for when it is +(hopefully) fixed. -### To build: +### Alternate build: ```sh make alt ``` -### Try: +### Alternate try: ```sh -echo IOCCC | ./westley.alt -echo IOCCC | ./westley.alt 1 -echo IOCCC | ./westley.alt 1 2 -echo IOCCC | ./westley.alt 1 2 3 -``` +./westley.alt +# input some text +# generate alt code versions: +./compile.alt.sh + +./try.alt.sh # demo of some input +``` ## Judges' remarks: diff --git a/1989/westley/compile.alt.sh b/1989/westley/compile.alt.sh new file mode 100755 index 000000000..35a6b4f4c --- /dev/null +++ b/1989/westley/compile.alt.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# +# compile.sh - compile westley.alt.c, generate the alt versions and then attempt to +# compile them. +# +# To change what compiler is used you can do something like: +# +# CC=/path/to/cc ./compile.sh +# +# The following example was run on a MacBook Pro with the M1 Max which which +# could not normally compile everything because macOS's compiler, even when run +# as gcc, is actually clang: +# +# CC=/opt/local/bin/gcc-mp-12 ./compile.sh +# +# We sleep (by default) for approximately 1 second after each command so that +# the you can read what is being done. If this is too fast you can change it in +# a similar way to the above but using the variable DELAY like so: +# +# DELAY=2 ./compile.sh +# +# You can of course use both variables in the same command line like: +# +# CC=/opt/local/bin/gcc-mp-12 DELAY=2 ./compile.sh +# DELAY=2 CC=/opt/local/bin/gcc-mp-12 ./compile.sh +# +# ...and so on. + +# get the compiler using default cc if not specified in the command line +# +# we cannot use the form '${CC:=cc}' because at least in some versions of bash +# it tries to invoke the command which would be an error by itself. Thus we just +# check if it's empty before we set it. +if [[ -z "$CC" ]]; then + CC="cc" +fi + +# get sleep duration +# we cannot use the form '${DELAY:=5}' because at least in some versions of bash +# it tries to invoke the command and obviously that won't work. Thus we check if +# it's empty before setting the default. +if [[ -z "$DELAY" ]]; then + DELAY=0 +fi + +# make clobber to make the directory clean and then compile westley.alt which we +# need to run everything else. Exit if make westley.alt fails as there would be +# nothing further that could be done in that case: +echo "$ make clobber westley.alt" +sleep "$DELAY" +make CC="$CC" clobber westley.alt || exit 1 +sleep "$DELAY" + +# run commands previously in the try section of the README.md, showing what the +# commands are as we go: + +# now generate and compile the files +# +echo "Generating and compiling alt versions ..." 1>&2 +sleep "$DELAY" +echo "$ make CC=$CC alt.ver0 alt.ver1 alt.ver2 alt.ver3" 1>&2 +make CC="$CC" alt.ver0 alt.ver1 alt.ver2 alt.ver3 diff --git a/1989/westley/compile.sh b/1989/westley/compile.sh index 1366968e9..f02219748 100755 --- a/1989/westley/compile.sh +++ b/1989/westley/compile.sh @@ -13,7 +13,9 @@ # # CC=/opt/local/bin/gcc-mp-12 ./compile.sh # -# If you wish to slow down the script you can use the DELAY variable like: +# We sleep (by default) for approximately 1 second after each command so that +# the you can read what is being done. If this is too fast you can change it in +# a similar way to the above but using the variable DELAY like so: # # DELAY=2 ./compile.sh # @@ -34,7 +36,7 @@ if [[ -z "$CC" ]]; then fi # get sleep duration -# we cannot use the form '${DELAY:=0}' because at least in some versions of bash +# we cannot use the form '${DELAY:=5}' because at least in some versions of bash # it tries to invoke the command and obviously that won't work. Thus we check if # it's empty before setting the default. if [[ -z "$DELAY" ]]; then @@ -68,8 +70,8 @@ sleep "$DELAY" # now compile the files by running make alt # -echo "Compiling alt versions ..." 1>&2 +echo "Compiling generated versions ..." 1>&2 sleep "$DELAY" -echo "$ make CC=$CC alt" 1>&2 +echo "$ make CC=$CC ver0 ver1 ver2 ver3" 1>&2 sleep "$DELAY" -make CC="$CC" alt +make CC="$CC" ver0 ver1 ver2 ver3 diff --git a/1989/westley/try.alt.sh b/1989/westley/try.alt.sh new file mode 100755 index 000000000..7ff1eef7c --- /dev/null +++ b/1989/westley/try.alt.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +make alt || exit 1 + + +echo "$ echo IOCCC | ./westley.alt" +echo IOCCC | ./westley.alt +echo + +echo "$ echo IOCCC | ./westley.alt 1" +echo IOCCC | ./westley.alt 1 +echo + +echo "$ echo IOCCC | ./westley.alt 1 2" +echo IOCCC | ./westley.alt 1 2 +echo + +echo "$ echo IOCCC | ./westley.alt 1 2 3" +echo IOCCC | ./westley.alt 1 2 3 +echo + +echo "$ echo IOCCC | ./alt.ver0" +echo IOCCC | ./alt.ver0 +echo + +echo "$ echo Version 1 | ./alt.ver1" +echo Version 1 | ./alt.ver1 +echo + +echo "$ echo Version 1 | ./alt.ver1 1" +echo Version 1 | ./alt.ver1 1 +echo + +echo "$ echo Version 1 | ./alt.ver1 1 2" +echo Version 1 | ./alt.ver1 1 2 +echo + +echo "$ echo Version 1 | ./alt.ver1 1 2 3" +echo Version 1 | ./alt.ver1 1 2 3 diff --git a/1989/westley/try.sh b/1989/westley/try.sh new file mode 100755 index 000000000..359b47730 --- /dev/null +++ b/1989/westley/try.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +make all || exit 1 + +echo "$ echo IOCCC | ./westley" +echo IOCCC | ./westley +echo + +echo "$ echo IOCCC | ./westley 1" +echo IOCCC | ./westley 1 +echo + +echo "$ echo IOCCC | ./westley 1 2" +echo IOCCC | ./westley 1 2 +echo + +echo "$ echo IOCCC | ./westley 1 2 3" +echo IOCCC | ./westley 1 2 3 +echo + +echo "$ echo IOCCC | ./ver0" +echo IOCCC | ./ver0 +echo + +echo "$ echo Version 1 | ./ver1" +echo Version 1 | ./ver1 +echo + +echo "$ echo Version 1 | ./ver1 1" +echo Version 1 | ./ver1 1 +echo + +echo "$ echo Version 1 | ./ver1 1 2" +echo Version 1 | ./ver1 1 2 +echo + +echo "$ echo Version 1 | ./ver1 1 2 3" +echo Version 1 | ./ver1 1 2 3 +echo + +echo "$ echo Version 2 | ./ver2" +echo Version 2 | ./ver2 +echo + +echo "$ echo Version 2 | ./ver2 1" +echo Version 2 | ./ver2 1 +echo + +echo "$ echo Version 2 | ./ver2 1 2" +echo Version 2 | ./ver2 1 2 +echo + +echo "$ echo Version 2 | ./ver2 1 2 3" +echo Version 2 | ./ver2 1 2 3 +echo + +echo "$ echo Version 3 | ./ver3" +echo Version 3 | ./ver3 +echo + +echo "$ echo Version 3 | ./ver3 1" +echo Version 3 | ./ver3 1 +echo + +echo "$ echo Version 3 | ./ver3 1 2" +echo Version 3 | ./ver3 1 2 +echo + +echo "$ echo Version 3 | ./ver3 1 2 3" +echo Version 3 | ./ver3 1 2 3 diff --git a/1989/westley/westley.alt.c b/1989/westley/westley.alt.c index 92cff6cd2..c5002fad7 100644 --- a/1989/westley/westley.alt.c +++ b/1989/westley/westley.alt.c @@ -1,13 +1,12 @@ -/**//*/};)/**/main(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnz;)0-0,tang,raeN -,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN)char -**gnat, **noon, **raeN;{int gn = gnat, ra = raeN, no = noon; (!tang&& -no!=-1&&(gn&2)&&((raeN&&( getchar(no+0)))||(1-ra&&(trgpune(no -)))))||tang&&znva(/*//**/tang ,tang,tang/**|**//*/((||)))0(enupgrt=raeN +/**//*/;)/**/pain(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnc-0,tang,raeN +,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN){(!tang&& +noon!=-1&&(gnat&2)&&((raeN&&( getchar(noon+0)))||(1-raeN&&(trgpune(noon +)))))||tang&&cnva(/*//**/tang ,tang/**|**//*/((||)))0(enupgrt=raeN (&&tang!(||)))0(rahcteg=raeN( &&1==tang((&&1-^)gnat=raeN(;;;)tang,gnat -,ABBA,0(avnz;)gnat:46+]552&)191+gnat([kri?0>]652%)191+gnat([kri=gnat +,ABBA,0(avnc;)gnat:46+]552&)191+gnat([kri?0>]652%)191+gnat([kri=gnat (&&)1-^gnat(&&)1& ABBA(!;)raeN,tang,gnat,ABBA(avnz&&0>ABBA{)raeN -,/**/);}znva(/*//**/tang,gnat,ABBA/**//*/(niam;}1-,78-,611-,321 +,/**/);}cnva(/*//**/tang,gnat,ABBA/**//*/(niam;}1-,78-,611-,321 -,321-,001-,64-,43-,801-,001-,301-,321-,511-,53-,54,44,34,24 ,14,04,93,83,73,63,53,43,33,85,75,65,55,45,35,25,15,05,94,84 ,74,64,0,0,0,0,0,0,/**/){ABBA='N'==65;(ABBA&&(gnat=trgpune @@ -15,11 +14,12 @@ no!=-1&&(gn&2)&&((raeN&&( getchar(no+0)))||(1-ra&&(trgpune(no gnat&&gnat<='z'||'a'<=gnat&&gnat<='m'||'N'<=gnat&&gnat<='Z' ||'A'<=gnat&&gnat<='M'?(((gnat&/*//**/31/**//*/,21,11,01,9,8 ,7,6,5,4,3,2,1,62,52,42,/**/)+12)%26)+(gnat&/*//**/32/**//*/, -22,12,02,91,81,71,61,51,41{=]652[kri};)/*pry*/)+65:gnat);main +22,12,02,91,81,71,61,51,41{=]652[kri};)/*pry*/)+65:gnat);pain (/*//**\**/tang^tang/**//*/,/* */,~/*//*-*/tang,gnat,ABBA- 0/**//*/(niam&&ABBA||))))tang( rahcteg&&1-1=