From 459fff8859f28e3aa70a1b8ccb61ad13b748b2cf Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Thu, 2 Nov 2023 09:47:47 -0700 Subject: [PATCH] Improve fixes to 1998/schnitzi The author stated that there was no 'if's and I have made it that way now. The author stated that the number should be > 0 && < 27 so I added the range check (was previously != 0). Too high value could segfault and < 0 was problematic too. 27 itself was code that could not compile. Since the program is so beautiful it had been decided to fix the problems which is why these changes were added too. The above was done like: ((V[1]&&((atoi(V[1])>0&&atoi(V[1])<27)||(exit(1),1)))); The try.sh script has been added to the entry to try out a lot of commands instead of copy pasting it from the judges' remarks. Removed duplicate INABIAF information from README.md (which is why the other updates). Updated bugs.md with more information to the features like how output can end up being gigabytes in length depending on the number specified to the program. Removed from the bugs.md details about warnings to ignore as the compiler -Wno- options take care of that now. Extra parentheses were added to the above to prevent another warning (I was not sure if all compilers and versions had the -Wno- so I decided to fix it in the code itself). The try section has a question to ponder as well. The detail is also in the bugs.md file. --- 1998/schnitzi/Makefile | 2 +- 1998/schnitzi/README.md | 41 ++++++++++++------------ 1998/schnitzi/schnitzi.c | 6 ++-- 1998/schnitzi/try.sh | 67 ++++++++++++++++++++++++++++++++++++++++ bugs.md | 36 ++++++--------------- thanks-for-fixes.md | 16 ++++++++++ 6 files changed, 120 insertions(+), 48 deletions(-) create mode 100755 1998/schnitzi/try.sh diff --git a/1998/schnitzi/Makefile b/1998/schnitzi/Makefile index d1a7def53..5b0c6ea06 100644 --- a/1998/schnitzi/Makefile +++ b/1998/schnitzi/Makefile @@ -40,7 +40,7 @@ include ../../var.mk # CSILENCE= -Wno-error -Wno-implicit-function-declaration -Wno-format-security \ -Wno-int-to-pointer-cast -Wno-int-conversion -Wno-unused-parameter \ - -Wno-incompatible-pointer-types + -Wno-incompatible-pointer-types -Wno-implicit-int -Wno-unused-value # Common C compiler warning flags # diff --git a/1998/schnitzi/README.md b/1998/schnitzi/README.md index ae5f27acb..fc908cf1f 100644 --- a/1998/schnitzi/README.md +++ b/1998/schnitzi/README.md @@ -1,9 +1,6 @@ # Best Flow Control Mark Schnitzius -ISX Corporation -1280 West Peachtree St. Apt. 1507 -Atlanta, GA 30309 US @@ -29,29 +26,35 @@ For more detailed information see [1998 schnitzi in bugs.md](/bugs.md#1998-schni ## To use: ```sh -./schnitzi 5 > sort.c +./schnitzi n > sort.c make sort +./sort +# enter three numbers, space separated + +echo x y z | ./sort ``` +where `n` and `x`, `y` and `z` are numbers. + ## Try: ```sh -./schnitzi 3 > sort.c -make sort -echo 123 > data -echo 234 >> data -echo 413 >> data -echo 134 >> data -echo 324 >> data -./sort < data +./try.sh ``` -### INABIAF - it's not a bug it's a feature :-) +What happens if at the command line you don't specify `n` numbers that the +program expects? For instance try: -NOTE: the larger the number given to the program the longer the output becomes -and quite substantially so. Doing `./schnitzi 9` will actually print 771999 -lines! +```sh +./schnitzi 5 > sort.c +make sort + +# try running the next command four or five times: +echo 2 5 3 1 | ./sort +``` + +Why does this happen? ## Judges' remarks: @@ -81,9 +84,9 @@ the letter 'e'. The IOCCC has been no stranger to this concept. Several winning entries from years past have accomplished interesting feats while completely avoiding the use -of certain C constructs thought to be essential (e.g. 1988's -[robison.c](//1988/robison/robison.c)). If you have to ask why they would do it -this way, then this contest just isn't for you. +of certain C constructs thought to be essential (e.g. +[1988/robison.c](/1988/robison/robison.c)). If you have to ask why they would +do it this way, then this contest just isn't for you. In continuing with this fine tradition, this program suggests to the ANSI committee some new practical simplifications for the C language. For instance, diff --git a/1998/schnitzi/schnitzi.c b/1998/schnitzi/schnitzi.c index 02be0399f..3ecc7bc1f 100644 --- a/1998/schnitzi/schnitzi.c +++ b/1998/schnitzi/schnitzi.c @@ -52,6 +52,8 @@ void x_(){ O=g; *r=y[k-2]; _=r; j=o_; } void d (){ O=g; *r=y[k]; _=r; k=k+1; m=k0&&atoi(V[1])<27)||(exit(1),1)))); q=0; O=r_; _d=V; - x: (O)(); goto x; }}} + x: (O)(); goto x; } + diff --git a/1998/schnitzi/try.sh b/1998/schnitzi/try.sh new file mode 100755 index 000000000..4d42ee199 --- /dev/null +++ b/1998/schnitzi/try.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +make all || exit 1 + +echo "$ ./schnitzi 3 > sort.c" 1>&2 +./schnitzi 3 > sort.c + +echo "Compiling sort.c:" 1>&2 +make sort >/dev/null || exit 1 + +echo "...built sort." 1>&2 + +echo "Creating data:" 1>&2 + +echo "$ echo 234 > data" 1>&2 +echo 234 > data + +echo "$ echo 413 >> data" 1>&2 +echo 413 >> data + +echo "$ echo 123 >> data" 1>&2 +echo 123 >> data + +echo "Sorting data:" 1>&2 +echo "$ ./sort < data" 1>&2 +./sort < data + +echo 1>&2 + +echo "Using stdin/stdout:" 1>&2 +echo "$ echo 10 7 9 | ./sort" 1>&2 +echo "10 7 9" | ./sort + +echo "$ ./schnitzi 5 > sort.c" 1>&2 +./schnitzi 5 > sort.c + +echo "Compiling sort.c:" 1>&2 +make sort >/dev/null || exit 1 + +echo "...built sort." 1>&2 + +echo "Creating data:" 1>&2 + +echo "$ echo 124 > data" 1>&2 +echo 124 > data + +echo "$ echo 422 >> data" 1>&2 +echo 422 >> data + +echo "$ echo 120 >> data" 1>&2 +echo 120 >> data + +echo "$ echo 100 >> data" 1>&2 +echo 100 >> data + +echo "$ echo 777 >> data" 1>&2 +echo 777 >> data + +echo "Sorting data:" 1>&2 +echo "$ ./sort < data" 1>&2 +./sort < data + +echo 1>&2 + +echo "Using stdin/stdout:" 1>&2 +echo "$ echo 5 10 7 9 1 | ./sort" 1>&2 +echo "5 10 7 9 1" | ./sort diff --git a/bugs.md b/bugs.md index c49279d2a..6f93f469e 100644 --- a/bugs.md +++ b/bugs.md @@ -1138,38 +1138,22 @@ See above entry [1998/dlowe](1998/dlowe/dlowe.c). ### Source code: [1998/schnitzi/schnitzi.c](1998/schnitzi/schnitzi.c) ### Information: [1998/schnitzi/README.md](1998/schnitzi/README.md) -[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed this to work for -modern systems but he notes a couple compile warnings to ignore. - -First if you get the warning: - - warning: incompatible implicit declaration of built-in function 'printf' [-Wbuiltin-declaration-mismatch] - 11 | void g(){ O=j; printf(_); } - | ^~~~~~ - - -please do NOT change it! Doing so will break the generated output. - -Another warning that was introduced but should be ignored (it's required) is: - - - warning: assignment to 'char *' from incompatible pointer type 'char **' [-Wincompatible-pointer-types] - 55 | main(int v,char **c){ O=r_; _d=c; - | ^ - -Please DO NOT change this either. - -If there are any other warnings triggered by your compiler please DO NOT fix -those either! - -Another important note is that as the number passed into the program gets bigger -the number of lines of output gets substantially larger. For instance: +A point worth considering is that as the number passed into the program gets +bigger the number of lines of output gets substantially larger. For instance: ```sh $ ./schnitzi 9|wc -l 771999 ``` +The larger the number the bigger the file can become too, even becoming +gigabytes in size. The range is checked for `>0 && <27` as not having this can +be a problem including a segfault. + +If you use the generated program and do not give enough numbers in input +something funny will happen, very possibly with different results per run. This +is in the README.md file as something to try and ponder. + # 1999 diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index 0247cb6dd..684be7eb0 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -1571,6 +1571,22 @@ linux and further changes for macOS. He also fixed a segfault (after printing garbage) when the arg specified evaluated to 0. It was decided that these segfault fixes should be made because the program is so beautiful. +Later on Cody improved the fixes by checking that the arg is a number `>0 && +<27` as that was noted by the author as a requirement and again since it's such +a beautiful program it is worth it, especially as the larger the number the +larger the resulting program becomes. It can be gigabytes in length if it +doesn't crash. At this point since the author stated it has no `while`, +`do...while`, `for`, `if/else`, `switch`, `?:` Cody removed the if statement by +doing: + +```c +((V[1]&&((atoi(V[1])>0&&atoi(V[1])<27)||(exit(1),1)))); +``` + +Cody also added the [try.sh](1998/schnitzi/try.sh) script to help users try the +commands (as well as some added by him) we recommended. + + ## [1998/schweikh1](1998/schweikh1/schweikh1.c) ([README.md](1998/schweikh1/README.md])) Cody fixed this for modern systems (it did not work at all) and added an