From 1c21b4d0725d9e28dd6e8e5f98e27a77a2639b27 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Tue, 11 Apr 2023 05:32:53 -0700 Subject: [PATCH] Fix crash in 1991/westley stopping it from working The problem was that the read only char*z[] was being written to. This caused a crash which prevented the delightful program from working. The fix was to change it to 'char z[][100]'. But why not a smaller number when the longest string is < 100? Because a smaller number caused strange output and it was easier to do than find the right value: 100 is that big and it works well so why bother finding the smallest value? No other reason behind it. Fixed the shell script too so that it actually works okay (related to '.' not being in the path in modern systems). Updated README.md: moved the ttt.sh related things to new try section and gave an example run (a losing example, challenging users to cause a draw or better yet win as well as asking them to test something about the game). Added a fun parody to the README.md too. Check it out! Removed this entry from bugs.md. --- 1991/westley/README.md | 76 ++++++++++++++++++++++++++++++++++++++++-- 1991/westley/ttt.sh | 24 ++++++------- 1991/westley/westley.c | 2 +- bugs.md | 6 ---- 4 files changed, 87 insertions(+), 21 deletions(-) diff --git a/1991/westley/README.md b/1991/westley/README.md index 883151bda..b53c127f9 100644 --- a/1991/westley/README.md +++ b/1991/westley/README.md @@ -13,6 +13,14 @@ USA make all ``` +[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed a segfault in +this program which prevented it from working. The problem was the read-only +char array `char *z[]` was being written to. The fix was to change it to `char +z[][100]` in two spots (see if you can determine why two places, not one!). Why +100 when the longest string is < 100? Because a shorter value caused strange +output and it's easier to just choose a larger value that works without having +to find the correct value. Thank you Cody for your assistance! + ## To run: Make and run as follows: @@ -37,13 +45,13 @@ make nextmove ./nextmove move_location | tee nextmove.c ``` -## Judges' remarks: +## Try: We have provided the shell script, [ttt](ttt.sh), to make it easier to play the game: ```sh make ttt -./ttt [first_move] <- omit first arg to have it move first +./ttt [first_move] # <- omit first arg to have it move first ./ttt next_move ``` @@ -57,6 +65,70 @@ has two other modes: ./ttt clobber # remove all game files, revert to original source ``` +For example here is a potentially losing game: + +```sh +./ttt 1 +./ttt 4 +./ttt 6 +``` + +The final might look like: + + +```c + a(X){/*/X=- a(X){/*/X=- + X -1;F;X=- -1;F;X=- + -1;F;}/*/ -1;F;}/*/ +char z[][100]={"char z[][100]={","a(X){/*/X=-","-1;F;X=-","-1;F;}/*/","1999999999 :-) ", +"int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(*", +"z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z", +"[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P(", +"9);}y(A){for(j=8;j;)~A&w[--j]||(q=0);}e(W,Z){for(i-=i*q;i<9&&q;)y(W|(1<4&&N", +";s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i<13;)s(i++),N;L(2);}",0}; + b(X){/*/X=- b(X){/*/X=- + X -1;F;X=- -1;F;X=- X + -1;F;}/*/ -1;F;}/*/ +int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(* +z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z +[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P( +9);}y(A){for(j=8;j;)~A&w[--j]||(q=0);}e(W,Z){for(i-=i*q;i<9&&q;)y(W|(1<4&&N +;s(q=12);P(48);P('}');P(59);N;q=0;L(1);for(i=5;i<13;)s(i++),N;L(2);} + c(X){/*/X=- c(X){/*/X=- + 0 -1;F;X=- 0 -1;F;X=- 0 + -1;F;}/*/ -1;F;}/*/ + +ttt: I win! +``` + + +## Judges' remarks: + +Can you figure out why the board looks different than the +[westley.c](westley.c)? + +What happens if you make a move already made? + +Now go try and draw or better yet win! +Why is win better than draw? Because everyone knows how to draw: + +> Professor Falken: Did you ever play tic-tac-toe? +> Jennifer Mack: Yeah. Of course. +> Falken: But you don't any more. +> Jennifer: No. +> Falken: Why? +> Jennifer: Because it's a boring game. It's always a tie. +> Falken: Exactly. There's no way to win. The game itself is pointless. But back +at the [International Obfuscated C Code Contest judges' +room](https://www.ioccc.org/https://www.ioccc.org/judges.html) they believe that +you can win tic-tac-toe, that there can be acceptable draws. + Try not to cheat, the computer has not learned how to catch you doing it. ## Author's remarks: diff --git a/1991/westley/ttt.sh b/1991/westley/ttt.sh index 203f519a8..438156f17 100755 --- a/1991/westley/ttt.sh +++ b/1991/westley/ttt.sh @@ -5,9 +5,9 @@ # parse args # if [ $# -gt 1 ]; then - echo "usage: ttt [move_digit]" 1>&2 - echo " ttt quitgame" 1>&2 - echo " ttt clobber" 1>&2 + echo "usage: ./ttt [move_digit]" 1>&2 + echo " ./ttt quitgame" 1>&2 + echo " ./ttt clobber" 1>&2 exit 1 elif [ $# -eq 1 ]; then move="$1" @@ -41,9 +41,9 @@ if [ $# -eq 1 ]; then case "$move" in 1|2|3|4|5|6|7|8|9) ;; *) echo "ttt: bad argument" 1>&2 - echo "usage: ttt [move_digit]" 1>&2 - echo " ttt quitgame" 1>&2 - echo " ttt clobber" 1>&2 + echo "usage: ./ttt [move_digit]" 1>&2 + echo " ./ttt quitgame" 1>&2 + echo " ./ttt clobber" 1>&2 exit 2 ;; esac fi @@ -74,7 +74,7 @@ if [ ! -f merlyn ]; then status=$? if [ "$status" -ne 0 ]; then echo "ttt: something is wrong, fix merlyn.c and build it yourself!" 1>&2 - echo " or maybe type: ttt clobber" 1>&2 + echo " or maybe type: ./ttt clobber" 1>&2 exit 5 fi rm -f ttt_game.c @@ -100,13 +100,13 @@ else status=$? if [ "$status" -ne 0 ]; then echo "ttt: something is wrong, fix ttt_game.c and build it yourself!" 1>&2 - echo " or maybe type: ttt quitgame" 1>&2 + echo " or maybe type: ./ttt quitgame" 1>&2 exit 6 fi if [ -z "$move" ]; then - ttt_game | tee ttt_new.c + ./ttt_game | tee ttt_new.c else - ttt_game "$move" | tee ttt_new.c + ./ttt_game "$move" | tee ttt_new.c fi chmod +w ttt_new.c if [ -s ttt_new.c ]; then @@ -143,8 +143,8 @@ else else echo "ttt: something is wrong, maybe ttt_old.c will help" 1>&2 - echo " or maybe type: ttt quitgame" 1>&2 - echo " or maybe type: ttt clobber" 1>&2 + echo " or maybe type: ./ttt quitgame" 1>&2 + echo " or maybe type: ./ttt clobber" 1>&2 exit 7 fi fi diff --git a/1991/westley/westley.c b/1991/westley/westley.c index abd056803..f5fe0db31 100644 --- a/1991/westley/westley.c +++ b/1991/westley/westley.c @@ -1,7 +1,7 @@ a(X){/*/X=- a(X){/*/X=- -1;F;X=- -1;F;X=- -1;F;}/*/ -1;F;}/*/ -char*z[]={"char*z[]={","a(X){/*/X=-","-1;F;X=-","-1;F;}/*/","9999999999 :-| ", +char z[][100]={"char z[][100]={","a(X){/*/X=-","-1;F;X=-","-1;F;}/*/","9999999999 :-| ", "int q,i,j,k,X,O=0,H;S(x)int*x;{X+=X;O+=O;*x+1?*x+2||X++:O++;*x=1;}L(n){for(*", "z[i=1]=n+97;i<4;i++)M(256),s(i),M(128),s(i),M(64),N;X*=8;O*=8;}s(R){char*r=z", "[R];for(q&&Q;*r;)P(*r++);q&&(Q,P(44));}M(m){P(9);i-2||P(X&m?88:O&m?48:32);P(", diff --git a/bugs.md b/bugs.md index ea8993329..58ef1ad07 100644 --- a/bugs.md +++ b/bugs.md @@ -542,12 +542,6 @@ will be fixed in time but it's noted here for now. # 1991 -## [1991/westley](1991/westley/westley.c) ([README.md](1991/westley/README.md)) -## STATUS: compiled executable crashes - please help us fix - -This program crashes. This will be worked on in the near future. - - # 1992 ## [1992/buzzard.1](1992/buzzard.1/buzzard.1.c) ([README.md](1992/buzzard.1/README.md))