Merge pull request #1301 from xexyl/1991-fine-80

This commit is contained in:
Landon Curt Noll authored and GitHub committed 2023-11-06 11:08:07 -07:00
commit 5a566b5031
13 files changed
+186 -30

No files matched your search

+1
View File
@@ -1,4 +1,5 @@
ant
ant.alt
ant.orig
hill
mole
+2 -2
View File
@@ -116,8 +116,8 @@ OBJ= ${PROG}.o
DATA= README.md
TARGET= ${PROG} hill mole
#
ALT_OBJ=
ALT_TARGET=
ALT_OBJ= ${PROG}.alt.o
ALT_TARGET= ${PROG}.alt
#################
+43 -10
View File
@@ -4,6 +4,9 @@
make all
```
There is an [alternate version](#alternate-code) that might feel a bit more
familiar to vi(m) users.
## To use:
@@ -28,6 +31,33 @@ make mole
```
## Alternate code:
This version changes the commands slightly so that to go to the first column you
should enter `0`, to go to the last column you should enter `$`, to quit you
should enter `q`, to go back a word you should enter `b` and to go forwards a
word you should enter `w`. Also, and perhaps most useful, rather than having to
hit ctrl-L (form-feed, `\f`) to get back to command mode you can use the usual
ESC (`\x1b`).
These will make it slightly less unwieldy for those familiar with vi(m); the
rest was unchanged.
### Alternate build:
```sh
make alt
```
### Alternate use:
Use `ant.alt` as you would `ant` above with the changes in the input keys. See
the author's remarks for the remaining keys.
## Judges' remarks:
The author was kind enough to supply a list of references below,
@@ -38,7 +68,7 @@ of characters you can put a user unfamiliar with vi(m) in a vi(m) session (in
insert mode) and ask them to exit. Well in this case you're likely to have this
problem if you ARE a vi(m) user! :-) ... especially if you don't read the
information below. This means if you're reading this in vi(m) you'll have to
exit this like in normal vi(m) and then exit `./ant` differently.
exit this like in normal vi(m) and then try the same with `./ant` only to fail. :-)
NOTE: to enter form feed you should be able to hit `ctrl-L`. This will allow you
to exit insert mode rather than ESC like in normal vi(m). See the author's
@@ -55,6 +85,7 @@ Carriage return is mapped to newline on input and ignored on output. Tab stops
are every eight columns. Non-printable characters may have unpredictable
results depending on the implementation of `curses`.
### Commands
- h j k l left, down, up, right cursor movement
@@ -67,6 +98,7 @@ results depending on the implementation of `curses`.
- R refresh the screen
- Q quit
### Exit status
- 0 success
@@ -75,26 +107,26 @@ results depending on the implementation of `curses`.
### About this entry
The BUF size should be set at compile time to 32767. This value was used
The `BUF` size should be set at compile time to 32767. This value was used
because the Sozobon C compiler for the Atari ST has 16 bit ints and a limit on
the size of arrays & structures of 32k. Also the WatCom C compiler for the PC
also has 16 bits ints. On machines that have 32 bit ints (most unix boxes), a
larger value for BUF could be used.
larger value for `BUF` could be used.
It is recommend that compact memory model be used on PC class machines. Small
memory model may work too provided BUF is not too large.
memory model may work too provided `BUF` is not too large.
The character constants `'\b'`, `'\f'`, `'\n'`, `'\r'`, `'\t'` are used in order
to provide more portable code, since the compiler should handle the translation
of them into the native character set. Note that `'\f'` (form-feed) was used to
exit insert mode because K&R C had no escape constant for the escape-key.
My goals for this project were to learn and experiment with the
Buffer Gap Scheme [Fin80][net90], write a useful and *portable*
program, and meet the requirements of the IOCCC. I initially
planned to have a mini `curses` built-in like the IOCCC Tetris entry
from a previous year, however this was not as portable as using a
`curses` library with `TERMINFO`/`TERMCAP` support.
My goals for this project were to learn and experiment with the Buffer Gap
Scheme [Fin80][net90], write a useful and *portable* program, and meet the
requirements of the IOCCC. I initially planned to have a mini `curses` built-in
like the [IOCCC Tetris entry from a previous year](/1989/tromp/README.md),
however this was not as portable as using a `curses` library with
`TERMINFO`/`TERMCAP` support.
I plan to post follow-ups such as unobfuscated versions and bugs fixes to
comp.editors. Reposts of the editor.101, gap.doc, and editor.102 can be found
@@ -103,6 +135,7 @@ in the same group every so often.
This entry will display a file with long lines, but has trouble scrolling the
screen with long lines. Paging up and down should work correctly, however.
### References:
[Fin80] Craig A. Finseth, "Theory and Practice of Text Editors or\
+1
View File
@@ -1,3 +1,4 @@
buzzard
buzzard.alt
buzzard.orig
prog.orig
+2 -2
View File
@@ -116,8 +116,8 @@ OBJ= ${PROG}.o
DATA=
TARGET= ${PROG}
#
ALT_OBJ=
ALT_TARGET=
ALT_OBJ= ${PROG}.alt.o
ALT_TARGET= ${PROG}.alt
#################
+47 -8
View File
@@ -4,6 +4,21 @@
make all
```
There is an [alternate version](#alternate-code) which might feel more at home
for vi(m) users in navigation.
### Bugs and (Mis)features:
The current status of this entry is:
```
STATUS: INABIAF - please **DO NOT** fix
```
For more detailed information see [1991 buzzard in
bugs.md](/bugs.md#1991-buzzard).
## To use:
@@ -11,6 +26,26 @@ make all
./buzzard
```
## Alternate code:
This version changes the keys `f` for forward, `l` for left and `r` for right to
`k` for forward, `l` for right and `h` for left, which is more natural for those
who use vi(m). Also one can just hit `q` followed by enter to quit the maze.
### Alternate build:
```sh
make alt
```
### Alternate use:
```sh
./buzzard.alt
```
## Judges' remarks:
@@ -21,13 +56,13 @@ You are invited to try to cheat, ... if you can figure out how! :-)
## Author's remarks:
### How to play
When the game starts, you are at the far end of the maze from the
exit, looking down a corridor. To move forward, type `f` and press
return. To turn 90 degrees right, type `r`; left, `l`. You can
put multiple commands on one line, and the new view will be drawn
after all the moves.
When the game starts, you are at the far end of the maze from the exit, looking
down a corridor. To move forward, type `f` and press return. To turn 90
degrees right, type `r`; and for left, `l`. You can put multiple commands on
one line, and the new view will be drawn after all the moves.
The game ends if you get out the exit (you'll know it when you see
it) or when you type `^D` (EOF).
@@ -51,10 +86,14 @@ separate physical rows in the maze; a space indicates a corridor,
and any other character is a wall. Tabs are also considered walls,
so make sure to convert tabs to spaces before using it.
Usage: buzzard [filename [escape-char [start-x start-yNNN
Usage:
```sh
./buzzard [filename [escape-char [start-x start-yNNN
```
Filename is the name of the file containing the maze. This
defaults to 'buzzard.c'.
defaults to `buzzard.c` or rather `__FILE__`.
Escape-char is the character in the maze that represents the exit.
You can put more than one exit in the maze (for example, you could
@@ -67,7 +106,7 @@ from 0. The default is start-x = 4, start-y = 5, which is needed
for the buzzard.c, but would probably be inappropriate for other
mazes.
BUGS:
### BUGS:
You can't change that at start you're facing down ("south").
+31
View File
@@ -0,0 +1,31 @@
#include <stdio.h>
#define X(s) (!(s&3)-((s&3)==2))
#define W while
char Z[82][82],A,B,f,g=26;z(q)char**q;{return atoi(q);}m(d,l){return
Z[ B + X ( f +
3) * d+l *X(f+ 2 )][ A+X ( f ) * d +
l* X ( f + 3 ) ] ;}int
h= 0;D(p,s)char*s; {W(h>>3<p>> 3 ) {putchar('\t'
); h = ( h +8
)&~7 ;}W(h < p ){putchar(' ');++h; }(void)printf(
"%s" , s ) ;h+=strlen(s);}main(x,a)char **a; {
# define P(x) (x?(5-(x))*(6-(x ))/2:11)
int b; { char b[256],i, j=0; FILE*F;F=fopen(x-1?a[1]:__FILE__,"r");W(
fgets( b ,256 ,F)){for(i=0;b[ i];++ i)
Z[j][i ] =( b [ i ] ==' '?1:2*(b[i]==(x>2?*a[2]:'\\')));++j;}fclose
(F);}A =4 ; B = 3 ; f = 1;x >3? A=z(a[3]),B=z(a[4]):0;b='\n';do{if(b=='\n'
){int y , s , d , p , q ,i;for
(y=-11; y<= 11;++ y){ for(s = 1 ,d=0;s+3;s-=2){for
(;d!=2 + 3 * s ; d+=s){
if(m(d,0) !=1 ){p=P (d) ;if (abs( y )
<p&& ! m ( d , 0 )||abs(y)>p)break;for
(i =-p;i<p;++i)D(g+i*2,"--");D(0,"\-");break;}if(d==5)continue;
p=P(d+1);q=P(d);if
(abs(y) >q)continue;if
(abs(y) <p)D(g-s*(2*p+1),"|");else if(m(d,s)){if
(abs(y) <=p)for(i=(s==1?-q:p);i!=(s==1?-p:q);
(abs(y) ),++i)D(g+2*i+(s==-1),"--");}else if
(abs(y) ==p)D(g-s*(2*p+1),"|");else D(g-
(abs(y) *s*2),(s==1)^(y>0)?"\\":"/");}d-=s;}puts(
"");h=0;}}f+=(b=='l')-(b=='h');f&=3;if(b=='q')return 0;if(b=='k'){if(!m(1,0))continue;
A+=X(f);B+=X(f-1);}}W((b=getchar())!=-1&&m(0,0)==1);return 0;}
+2 -2
View File
@@ -1,7 +1,7 @@
#include <stdio.h>
#define X(s) (!(s&3)-((s&3)==2))
#define W while
char Z[82][82],A,B,f,g=26;z(q){return atoi(q);}m(d,l){return
char Z[82][82],A,B,f,g=26;z(q)char**q;{return atoi(q);}m(d,l){return
Z[ B + X ( f +
3) * d+l *X(f+ 2 )][ A+X ( f ) * d +
l* X ( f + 3 ) ] ;}int
@@ -10,7 +10,7 @@ h= 0;D(p,s)char*s; {W(h>>3<p>> 3 ) {putchar('\t'
)&~7 ;}W(h < p ){putchar(' ');++h; }(void)printf(
"%s" , s ) ;h+=strlen(s);}main(x,a)char **a; {
# define P(x) (x?(5-(x))*(6-(x ))/2:11)
int b; { char b[256],i, j=0; FILE*F;F=fopen(x-1?a[1]:"buzzard.c","r");W(
int b; { char b[256],i, j=0; FILE*F;F=fopen(x-1?a[1]:__FILE__,"r");W(
fgets( b ,256 ,F)){for(i=0;b[ i];++ i)
Z[j][i ] =( b [ i ] ==' '?1:2*(b[i]==(x>2?*a[2]:'\\')));++j;}fclose
(F);}A =4 ; B = 3 ; f = 1;x >3? A=z(a[3]),B=z(a[4]):0;b='\n';do{if(b=='\n'
+1 -1
View File
@@ -59,7 +59,7 @@ ARCH=
# Defines that are needed to compile
#
CDEFINE= -D'main(a,b)'='int main(a,b)char**b;'
CDEFINE= -D'main(a,b)'='int main(a,b)char**b;' -DB='(int)b'
# Include files that are needed to compile
#
+2 -2
View File
@@ -33,8 +33,8 @@ This filter, 80 chars plus a newline, fits into a single line on most
terminals (unless your terminal has a line wrap mis-feature :-)).
Note in 2023: fixing this entry to work with modern systems increased the size,
originally to 106 characters but dropped down to 85 with clever use of the
Makefile and removal of a cast that was not strictly necessary.
originally to 106 characters but it was dropped back down to 80 with clever use
of the Makefile.
This entry is likely one of the smallest C implementations of this
filter, excluding programs that resort to command line or include
+1 -1
View File
@@ -1 +1 @@
main(a,b){while((a=getchar())+1)putchar((b=64^a&223)&&b<27?a&96|((int)b+12)%26+1:a);}
main(a,b){while((a=getchar())+1)putchar((b=64^a&223)&&B<27?a&96|(B+12)%26+1:a);}
+12
View File
@@ -677,6 +677,18 @@ where this occurred was fixed but this one should not be fixed. Thank you.
# 1991
## 1991 buzzard
### STATUS: INABIAF - please **DO NOT** fix
### Source code: [1991/buzzard/buzzard.c](1991/buzzard/buzzard.c)
### Information: [1991/buzzard/README.md](1991/buzzard/README.md)
If the maze file cannot be opened, either because the path specified does not
exist or because the default (whatever the source file was at compilation time)
file does not exist in the directory, this program will very likely crash.
This is a feature, not a bug.
## 1991 westley
+41 -2
View File
@@ -1084,6 +1084,21 @@ The alt code did NOT have arg checks added as it is actually a copy of the
original code.
## [1991/ant](1991/ant/ant.c) ([README.md](1991/ant/README.md]))
Cody added [alt code](1991/ant/ant.alt.c) that will be a bit easier to use for
those familiar with vim in the following ways:
- Use `0` to go to first column.
- Use `$` to go to last column.
- Hit ESC to go back to command mode (instead of form-feed, ctrl-L).
- Use `w` to go forwards one word.
- Use `b` to go backwards one word.
- Use `q` to exit.
The other keys were left unchanged.
## [1991/brnstnd](1991/brnstnd/brnstnd.c) ([README.md](1991/brnstnd/README.md]))
Cody fixed this for modern systems. There were two invalid operands to binary
@@ -1097,6 +1112,23 @@ Later on, Cody added back the macro `#define D define` to make it look ever so
slightly more like the original, even though it's unused.
## [1991/buzzard](1991/buzzard/buzzard.c) ([README.md](1991/buzzard/README.md]))
Cody fixed this so that the coordinates being specified would not crash the
program. This happened because the function that calls `atoi(3)` took an arg
without any type specified and as an implicit int it was not a `char *` which
crashed the program in modern systems.
Cody also made the file name in the code (which is the default maze file) not
hard-coded but instead be `__FILE__`.
Finally Cody added the [alternate
version](1991/buzzard/README.md#alternate-code) which will possibly feel more at
home with those familiar with vi(m) (it certainly does feel more at home with
him): `k` for forward, `h` for left and `l` for right. This version also has a
more useful way to exit, just entering `q` followed by enter.
## [1991/dds](1991/dds/dds.c) ([README.md](1991/dds/README.md]))
Cody fixed a segfault that prevented this entry from working in any condition
@@ -1201,12 +1233,19 @@ entry was fixed. It has not been done in all.
## [1991/fine](1991/fine/fine.c) ([README.md](1991/fine/README.md))
Cody made it look much more like the original entry even after the fix that
increased the count in characters from 80 to 106, getting it back down to just 85.
increased the count in characters from 80 to 106, getting it back down to just
85 (and later back down to 80, see below).
This was done by redefining `main` at the compiler line so that it looks like
the original where one didn't have to worry about the type of args of main() and
there were other fewer restrictions and also by removing a cast that was
not strictly necessary (this does create a new warning: `ordered comparison
between pointer and integer ('char **' and 'int')` but it works just fine).
between pointer and integer ('char **' and 'int')` but it works just `fine`).
That was `fine` as well but Cody decided to drop it back down to its original 80
which also resolved the warning described above. This was by more clever use of
the Makefile which now has a `-DB=(int)b` so that `B` can be used in place where
`(int)b` used to be necessary.
Cody also added the [try.sh](1991/fine/try.sh) script which feeds the program
some fun input for fun but mostly different output. He added a great string from