+ /* 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
+ * score 0, then we can remove that as well. */
+ if (bin->num_items == 0 ||
+ (bin->score == 0 && mnemon->to_introduce == 0))
+ {
+ mnemon_remove_bin (mnemon, bin);
+ }
+
+ if (correct &&
+ (time_limit == 0.0 || response_time < time_limit))
+ {
+ item->score++;
+ mnemon->to_master--;
+ /* We reserve an item score of 0 for an item that has
+ * never been asked. */
+ if (item->score == 0) {
+ item->score = 1;
+ mnemon->unlearned--;
+ mnemon->to_master--;
+ printf ("You got it!");
+ } else if (item->score < 0) {
+ printf ("Yes---just give me %d more.",
+ - item->score);
+ } else if (item->score == 1) {
+ printf ("On your first try, no less!");
+ } else {
+ printf ("Masterful (%dx).", item->score);
+ }
+ } else {
+ if (! correct)
+ printf (" %s is the correct answer.",
+ item->response);
+ else
+ printf ("Correct, but not quite quick enough (%0.2f seconds---needed %0.2f seconds)\n",
+ response_time, time_limit);
+ /* Penalize an incorrect response by forcing the score
+ * negative. */
+ if (item->score >= 0) {
+ if (item->score > 0)
+ printf (" Oops, you knew that, right? (%dx)\n ",
+ item->score);
+ mnemon->unlearned++;
+ /* We add three here, (rather than just 2 to track the
+ * change in the item's score below), as an extra
+ * penalty. If the user is forgetting stuff learned
+ * previously, then more time should be spent on mastering
+ * than learning new items. */
+ mnemon->to_master += item->score + 3;
+ /* We go to -2 to force a little extra reinforcement
+ * when re-learning an item, (otherwise, it will often
+ * get asked again immediately where it is easy to get
+ * a correct response without any learning). */
+ item->score = -2;