diff --git a/1998/schnitzi/.gitignore b/1998/schnitzi/.gitignore index be8b7cc80..f646104a4 100644 --- a/1998/schnitzi/.gitignore +++ b/1998/schnitzi/.gitignore @@ -1,2 +1,4 @@ data schnitzi +sort +sort.c diff --git a/1998/schnitzi/Makefile b/1998/schnitzi/Makefile index cea72b4b8..a1b750e9f 100644 --- a/1998/schnitzi/Makefile +++ b/1998/schnitzi/Makefile @@ -97,7 +97,7 @@ CDEFINE= # Include files that are needed to compile # -CINCLUDE= +CINCLUDE= -include stdlib.h #CINCLUDE= -include stdlib.h #CINCLUDE= -include stdio.h #CINCLUDE= -include stdlib.h -include stdio.h diff --git a/1998/schnitzi/README.md b/1998/schnitzi/README.md index 2a2e5afe2..686df6d19 100644 --- a/1998/schnitzi/README.md +++ b/1998/schnitzi/README.md @@ -16,6 +16,11 @@ ./schnitzi 5 > sort.c make sort + +## Try: + + ./schnitzi 3 > sort.c + make sort echo 123 > data echo 234 >> data echo 413 >> data @@ -23,68 +28,78 @@ echo 324 >> data ./sort < data +[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed a segfault in +this entry. The problem was invalid data types. Thank you Cody for your +assistance! + ## Judges' comments - This is a beautiful program. How can a program with no conditional - behavior at all have output which depends on anything? +This is a beautiful program. How can a program with no conditional +behavior at all have output which depends on anything? + +For hints on deciphering this, see below past the Author's Comments; +they're a nice summary, but they leave the mystery intact. + +BTW: the author notes an incredible lipogram story called +[Gadsby](https://www.gutenberg.org/cache/epub/47342/pg47342.txt) which has no +letter E in the story. He did not note this but it has over 50000 (50 thousand) +(!!) words without the letter E which is one of the most common letters! - For hints on deciphering this, see below past the Author's Comments; - they're a nice summary, but they leave the mystery intact. ## Author's comments - In literary circles, there is a poetic form called a "lipogram", - which is a poem in which a specific letter has been distinctly - avoided. This principle can be applied in other ways. For - instance, in this paragraph, the vowel which immediately follows - 't' in the alphabet is nowhere to be seen. There is even an - entire novel (E. V. Wright's "Gadsby") in which no word contains - the letter 'e'. +In literary circles, there is a poetic form called a "lipogram", +which is a poem in which a specific letter has been distinctly +avoided. This principle can be applied in other ways. For +instance, in this paragraph, the vowel which immediately follows +'t' in the alphabet is nowhere to be seen. There is even an +entire novel (E. V. Wright's "Gadsby") in which no word contains +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). If you have to ask why they - would do it this way, then this contest just isn't for you. +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). 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, it appears that CONDITIONAL BRANCHING isn't - really necessary. So, we can do away with while, do...while, for, - if/else, switch, ?:, or anything else that might cause any kind of - nondeterministic jump in the code. There's too much uncertainty - in the world anyway. +In continuing with this fine tradition, this program suggests to +the ANSI committee some new practical simplifications for the C +language. For instance, it appears that CONDITIONAL BRANCHING isn't +really necessary. So, we can do away with while, do...while, for, +if/else, switch, ?:, or anything else that might cause any kind of +nondeterministic jump in the code. There's too much uncertainty +in the world anyway. - Function parameters and return types just confuse people anyway, so - get rid of them. Same with local variables. In fact, all you really - need are assignment statements, and maybe one printf() and one goto. +Function parameters and return types just confuse people anyway, so +get rid of them. Same with local variables. In fact, all you really +need are assignment statements, and maybe one printf() and one goto. - This style of programming is also ideal for systems with limited - memory capacity, since the function call stack never goes beyond - a depth of one. +This style of programming is also ideal for systems with limited +memory capacity, since the function call stack never goes beyond +a depth of one. - So what does it do? Give it an integer (1 < n < 27) on the command - line, such as +So what does it do? Give it an integer (1 < n < 27) on the command +line, such as - schnitzi 5 + ./schnitzi 5 - The output will itself be a lipographic program, one which inputs - (in this case) five numbers and prints them out sorted. It sorts - them, however, using only "if/else" statements, without arrays or - looping. To see the resulting program run, redirect the output from - "schnitzi" into another file, like this +The output will itself be a lipographic program, one which inputs +(in this case) five numbers and prints them out sorted. It sorts +them, however, using only "if/else" statements, without arrays or +looping. To see the resulting program run, redirect the output from +"schnitzi" into another file, like this schnitzi 4 > sort.c - and then compile it. +and then compile it. -Spoilers And Hints: +### Spoilers And Hints: - The big key to this program is figuring out what the names of the - functions ought to be; a bit of research may allow you to guess at - a few crucial ones. +The big key to this program is figuring out what the names of the +functions ought to be; a bit of research may allow you to guess at +a few crucial ones. - The only function ever called is "O", but "O" is just set to point to - other functions all the time. Or, almost all the time. +The only function ever called is "O", but "O" is just set to point to +other functions all the time. Or, almost all the time. - So how does 'h' get set, and what to? +So how does 'h' get set, and what to? diff --git a/1998/schnitzi/schnitzi.c b/1998/schnitzi/schnitzi.c index 4a1eab007..1104eeb63 100644 --- a/1998/schnitzi/schnitzi.c +++ b/1998/schnitzi/schnitzi.c @@ -1,8 +1,8 @@ typedef void e(); -e *w,*l,*u,*_o,*j,*t,*O,exit,b,c_,b_,a_,c,a,z_,x_,d,y_,_m; -int q,m,_d,z,k,h,f[99]; -char y[26],_p[40][26],_q,r[2],*_,**s,*i, +e *w,*l,*u,*_o,*j,*t,*O,b,c_,b_,a_,c,a,z_,x_,d,y_,_m,n,*h; +int q,m,z,k,f[99]; +char y[26],_p[40][26],_q,r[2],*_,**s,*i,*_d, *x[]= { "\n", ")", "if (", "}\n", ");\n\n", " ", ",&", "\"", ",", " %%d", ";\n\n scanf(\"%%d", "%%d ", "else ", ",", "<", @@ -52,5 +52,5 @@ void x_(){ O=g; *r=y[k-2]; _=r; j=o_; } void d (){ O=g; *r=y[k]; _=r; k=k+1; m=k