From: Carl Worth Date: Tue, 17 Apr 2007 21:53:01 +0000 (-0700) Subject: Remove the bin with count 0 once we're done introducing new items X-Git-Url: https://git.cworth.org/git?p=mnemon;a=commitdiff_plain;h=abd2230ad0fc47109cbc97a767b87e70f459b053 Remove the bin with count 0 once we're done introducing new items --- diff --git a/mnemon.c b/mnemon.c index 2ae2bf4..737298e 100644 --- a/mnemon.c +++ b/mnemon.c @@ -385,6 +385,8 @@ mnemon_remove_bin (mnemon_t *mnemon, { int i = bin - mnemon->bins; + bin_fini (bin); + memmove (bin, bin + 1, (mnemon->num_bins - i) * sizeof (bin_t)); mnemon->num_bins--; } @@ -657,9 +659,7 @@ mnemon_do_challenges (mnemon_t *mnemon, printf ("\n"); do { - do { - mnemon_select_item (mnemon, &bin, &item_index); - } while (bin->count == 0 && to_introduce == 0); + mnemon_select_item (mnemon, &bin, &item_index); if (bin->count == 0) to_introduce--; @@ -677,8 +677,15 @@ mnemon_do_challenges (mnemon_t *mnemon, correct = (strcmp (response, item->response) == 0); bin_remove_item (bin, item_index); - if (bin->num_items == 0) + + /* If the bin is now empty, we must remove it. Also if we just + * picked the last word we'll ever pick from the bin with + * count 0, then we can remove that as well. */ + if (bin->num_items == 0 || + (bin->count == 0 && to_introduce == 0)) + { mnemon_remove_bin (mnemon, bin); + } if (correct) { item->count++; @@ -691,25 +698,30 @@ mnemon_do_challenges (mnemon_t *mnemon, } else if (item->count < 0) { printf ("Yes---just give me %d more.", - item->count); + } else if (item->count == 1) { + printf ("On your first try, no less!"); } else { printf ("Masterful."); } } else { printf (" %s is the correct answer.", item->response); + if (item->count >= 0) + unlearned++; item->count--; /* Penalize an incorrect response by forcing the count * negative. */ if (item->count >= 0) { item->count = -1; - unlearned++; printf ( " Oops, you knew that, right?\n "); } } printf (" ("); if (to_introduce) - printf ("%d to come. ", to_introduce); + printf ("%d to come.", to_introduce); + if (to_introduce && unlearned) + printf (" "); if (unlearned) printf ("%d still unlearned.", unlearned); if (to_introduce == 0 && unlearned == 0)