Fix infinite loop in 1989/ovdluhe
As Landon said it is a bug (after I asked about it) I have fixed it. Without this fix the program printed the same thing over and over again in some cases. The problem was a for() loop that didn't always have the pointer incremented. It looks like I could have got away with just updating the increment part of the loop but I didn't do that as I didn't see it at first. The optimiser was disabled. That might not be strictly necessary but I had it disabled for a time so I have kept it disabled. Also I removed my name in the README.md: this was missed when the much better idea of a general thanks file was come up with. When testing the fix I came across part of my name which made me check. I have not yet typo/format checked this file or any of 1989 so that was not done. That might or might not happen in part or in whole later today but either way it'll be started soon.
This commit is contained in:
1 parent
0262590956
commit
f882ea84dd
5 files changed
+15
-7
No files matched your search
@@ -68,7 +68,7 @@ CINCLUDE=
|
||||
|
||||
# Optimization
|
||||
#
|
||||
OPT= -O3
|
||||
OPT=
|
||||
|
||||
# Default flags for ANSI C compilation
|
||||
#
|
||||
|
||||
@@ -38,8 +38,7 @@ by chance or is killed.
|
||||
### Alternate code:
|
||||
|
||||
The author suggested that one varies the definition of `P` from 2 through 10. As
|
||||
it's a `#define` it's easy to set up which [Cody Boone
|
||||
Ferguson](/winners.html#Cody_Boone_Ferguson) did for us. To use try:
|
||||
it's a `#define` it's easy to set up. To use try:
|
||||
|
||||
```sh
|
||||
make CFLAGS="-DP=9" clobber alt
|
||||
@@ -47,6 +46,7 @@ make CFLAGS="-DP=9" clobber alt
|
||||
|
||||
Use `ovdluhe.alt` as you would `ovdluhe`.
|
||||
|
||||
|
||||
## Judges' remarks:
|
||||
|
||||
Run this program using your favorite text file as input. Files
|
||||
|
||||
@@ -20,7 +20,7 @@ main(){ape pe,*ep=a;srand((EP)time((long)E));
|
||||
while(((*(ep++)=getchar())!=-A)&&((ep-a)<PE));
|
||||
*(ae= --ep)=E;for(ap=E;ap<=P;){APE;if(pe=PA())
|
||||
{putchar(pe);if(ap<P){p[ap]=pe;ap++;}else{
|
||||
ep=p+A;while(*ep) *(ep-A)= *(ep++); *(ep-A)=pe;}}else break;}}
|
||||
ep=p+A;while(*ep) *(ep-A)= *(ep++); *(ep-A)=pe;++ap;}}else break;}}
|
||||
PA(){EA ape pe,*ep=a,pa,Ap=E;for(ep=a;ep<ae-P;ep++)
|
||||
if(!strncmp(ep,p,ap)){e[*(ep+ap)]++;Ap++;}if(!Ap)return(Ap);
|
||||
pa=rand()%Ap+A;pe=~E,Ap=!Ap;while((Ap+=e[++pe])<pa);return(pe);}
|
||||
@@ -14,7 +14,7 @@ main(){ape pe,*ep=a;srand((EP)time((long)E));
|
||||
while(((*(ep++)=getchar())!=-A)&&((ep-a)<PE));
|
||||
*(ae= --ep)=E;for(ap=E;ap<=P;){APE;if(pe=PA())
|
||||
{putchar(pe);if(ap<P){p[ap]=pe;ap++;}else{
|
||||
ep=p+A;while(*ep) *(ep-A)= *(ep++); *(ep-A)=pe;}}else break;}}
|
||||
ep=p+A;while(*ep) *(ep-A)= *(ep++); *(ep-A)=pe;++ap;}}else break;}}
|
||||
PA(){EA ape pe,*ep=a,pa,Ap=E;for(ep=a;ep<ae-P;ep++)
|
||||
if(!strncmp(ep,p,ap)){e[*(ep+ap)]++;Ap++;}if(!Ap)return(Ap);
|
||||
pa=rand()%Ap+A;pe=~E,Ap=!Ap;while((Ap+=e[++pe])<pa);return(pe);}
|
||||
+10
-2
@@ -494,8 +494,16 @@ you know how?
|
||||
|
||||
## [1989/ovdluhe](1989/ovdluhe/ovdluhe.c) ([README.md](1989/ovdluhe/README.md]))
|
||||
|
||||
Cody provided an [alternate version](1989/ovdluhe/ovdluhe.alt.c) based on the
|
||||
author's remarks. See the README.md for details.
|
||||
Cody fixed an infinite loop where the program would print the same thing over
|
||||
and over again, flooding the screen. The problem is that there was a `for` loop
|
||||
that by necessity had to not have an increment stage but only in the `if` path
|
||||
(in the loop itself) did the pointer get updated. Looking at the code it might
|
||||
be that it can work just as well by adding the increment in the loop itself but
|
||||
this was not done.
|
||||
|
||||
Cody also provided an [alternate version](1989/ovdluhe/ovdluhe.alt.c) based on the
|
||||
author's remarks. See the README.md for details. The fix described above was
|
||||
fixed in this version too, after it was discovered and fixed.
|
||||
|
||||
|
||||
## [1989/paul](1989/paul/paul.c) ([README.md](1989/paul/README.md]))
|
||||
|
||||
Reference in new issue
Block a user