diff options
Diffstat (limited to 'usr.bin/learn/lib/editor/L44.1g')
-rw-r--r-- | usr.bin/learn/lib/editor/L44.1g | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/usr.bin/learn/lib/editor/L44.1g b/usr.bin/learn/lib/editor/L44.1g new file mode 100644 index 00000000000..b0eb263675f --- /dev/null +++ b/usr.bin/learn/lib/editor/L44.1g @@ -0,0 +1,121 @@ +#print +Of course, you can also search for lines that +contain backslashes; again, it's simply a matter +of doubling the backslash in the search pattern. +That is, + /\\/ +finds the next line with a backslash. + +Find the second occurrence of "\n\n" in the file +"prog.c", and type "answer N", where N is its +line number. +#create prog.c + +int nsave = 0; + +selunit() +{ + char fnam[20], s[50]; + static char dobuff[50]; + char posslev[20][20]; + int diff[20], i, k, m, n, best, alts, statb[20]; + FILE *f; + char zb[200]; + static char saved[20]; + + while (ask) { + printf("What lesson? "); + fflush(stdout); + gets(dobuff); + if (strcmp(dobuff, "bye") == 0) + wrapup(0); + level = todo = dobuff; + sprintf(s, "../L%s", dobuff); + if (access(s, 04) == 0) + return; + printf("no such lesson\n"); + } + alts = 0; +retry: + f=scrin; + if (f==NULL) { + sprintf(fnam, "../L%s", level); + f = fopen(fnam, "r"); + if (f==NULL) { + fprintf(stderr, "No script for lesson %s.\n", level); + wrapup(1); + } + while (fgets(zb, 200, f)) { + trim(zb); + if (strcmp(zb, "#next")==0) + break; + } + } + if (feof(f)) { + printf("Congratulations\n\n.You have finished this sequence.\n"); + fflush(stdout); + todo = 0; + return; + } + for(i=0; fgets(s, 50, f); i++) { + sscanf(s, "%s %d", &posslev[i], &diff[i]); + } + best = -1; + /* cycle through lessons from random start */ + /* first try the current place, failing that back up to + last place there are untried alternatives (but only one backup) */ + n = grand()%i; + for(k=0; k<i; k++) { + m = (n+k)%i; + if (already(posslev[m])) continue; + if (best<0) best=m; + /* real alternatives */ + alts++; + if (abs(diff[m]-speed) < abs(diff[best]-speed)) + best=m; + } + if (best < 0 && nsave) { + nsave--; + strcpy(level, saved); + goto retry; + } + if (best <0) { + /* lessons exhausted or missing */ + printf("Sorry, there are no alternative lessons at this stage.\n"); + printf("See someone for help.\n\n"); + fflush(stdout); + todo = 0; + return; + } + strcpy (dobuff, posslev[best]); + if (alts>1) { + nsave=1; + strcpy (saved, level); + } + todo = dobuff; + fclose(f); +} + +abs(x) +{ + return(x>=0? x: -x); +} + +grand() +{ + static int garbage; + int a[2], b; + + time(a); + b = a[1]+10*garbage++; + return(b&077777); +} +#copyin +#user +#uncopyin +#match 73 +#bad 43 +The second______ one. +#log +#next +44.1h 10 |