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.
This commit is contained in:
Cody Boone Ferguson committed 2023-04-11 05:55:42 -07:00
1 parent 4f43a887e0
commit 1c21b4d072
4 files changed
+87 -21

No files matched your search

+74 -2
View File
@@ -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<<i++&",
"~Z));}R(){for(k=J[*J-48]-40;k;)e(w[k--],X|O);}main(u,v)char**v;{a(q=1);b(1);",
"c(1);*J=--u?O?*J:*v[1]:53;X|=u<<57-*v[u];y(X);K=40+q;q?e(O,X),q&&(K='|'),e(X",
",O),R(),O|=1<<--i:J[*J-48+(X=O=0)]--;L(q=0);for(s(i=0);q=i<12;)s(i++),i>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<<i++&
~Z));}R(){for(k=J[*J-48]-40;k;)e(w[k--],X|O);}main(u,v)char**v;{a(q=1);b(1);
c(1);*J=--u?O?*J:*v[1]:53;X|=u<<57-*v[u];y(X);K=40+q;q?e(O,X),q&&(K='|'),e(X
,O),R(),O|=1<<--i:J[*J-48+(X=O=0)]--;L(q=0);for(s(i=0);q=i<12;)s(i++),i>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:
+12 -12
View File
@@ -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
+1 -1
View File
@@ -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(",
-6
View File
@@ -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))