X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=mnemon.c;h=ac7c7652d5fd07c6c0dc8c32669eeede5a52947f;hb=cb853e60989f34c4608ac3c521bf90a01d0387d9;hp=dfcc60e78fe3a931c60f0d8b9d1a8d82ca798e0d;hpb=776dfc7b017ad307113ed9634de3adedcf61c28f;p=mnemon diff --git a/mnemon.c b/mnemon.c index dfcc60e..ac7c765 100644 --- a/mnemon.c +++ b/mnemon.c @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -730,6 +731,7 @@ mnemon_save (mnemon_t *mnemon) category_print (category, file); + fsync (fileno (file)); fclose (file); err = rename (lock_filename, filename); @@ -863,9 +865,20 @@ mnemon_select_item (mnemon_t *mnemon, category_t *category; bin_index = rand_within_exponential (mnemon->num_bins); - bin = &mnemon->bins[bin_index]; + /* The most intuitive understanding of the to_introduce counter is + * that it's tracking never-before-learned items as they are + * pulled from the bin with score 0. But that bin can become + * empty. So the refined rule is that we decrement to_introduce + * whenever we pull from the lowest-indexed bin with a + * non-negative score. */ + if (mnemon->to_introduce && bin->score >=0 && + (bin_index == 0 || mnemon->bins[bin_index-1].score < 0)) + { + mnemon->to_introduce--; + } + item_index = rand_within (bin->num_items); item = bin->items[item_index]; @@ -1146,9 +1159,6 @@ mnemon_do_challenges (mnemon_t *mnemon) mnemon_select_item (mnemon, &bin, &item_index, &category); item = bin->items[item_index]; - if (bin->score == 0) - mnemon->to_introduce--; - while (1) { if (category->time_limit > 0.0) { response = readline ("The next one is timed. Press enter when ready:"); @@ -1184,14 +1194,13 @@ mnemon_do_challenges (mnemon_t *mnemon) } while (mnemon->to_introduce || mnemon->unlearned || mnemon->to_master > 0); - - printf ("Great job.\n"); } int main (int argc, char *argv[]) { mnemon_t mnemon; + char *response; srand (time (NULL)); @@ -1205,5 +1214,15 @@ main (int argc, char *argv[]) mnemon_fini (&mnemon); + mnemon_init (&mnemon); + mnemon_load (&mnemon); + + printf ("Great job.\nHere are your current results:\n"); + mnemon_print_histogram (&mnemon, NULL, 0); + response = readline ("Press enter to quit.\n"); + free (response); + + mnemon_fini (&mnemon); + return 0; }