X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=grid.c;h=cce4ab768da43dcd7f8105a7cf0f38ac9328f206;hb=fa2eccd25e634f0d2c4de088dc4a881de9cbbb50;hp=44ffa9d23f7487b90a8c0c71f542ae267d364c62;hpb=dd4b319cdb6e2883ae76317036b57b670344160a;p=wordgame diff --git a/grid.c b/grid.c index 44ffa9d..cce4ab7 100644 --- a/grid.c +++ b/grid.c @@ -28,6 +28,9 @@ #include "dict.h" +/* Remember that dict reserves the 0th bit for IS_WORD */ +#define GRID_WORD_SEEN (1<<1) + char *cube_faces[16] = { "aaeeng", "abbjoo", "achops", "affkps", "aoottw", "cimotu", "deilrx", "delrvy", @@ -100,7 +103,7 @@ board_enumerate (board_t *board, int x, int y, int16_t seen, - string_t *word, + char *word, dict_cursor_t dict_cursor) { char c; @@ -119,42 +122,52 @@ board_enumerate (board_t *board, seen |= SEEN_BIT (x, y); c = board->letters[y][x]; - string_append_char (word, c); + word[strlen (word)] = c; dict_cursor = dict_cursor_next (dict_cursor, c); if (c == 'q') { - string_append_char (word, 'u'); + word[strlen (word)] = 'u'; dict_cursor = dict_cursor_next (dict_cursor, 'u'); } if (DICT_ENTRY_IS_WORD (dict_cursor_resolve (dict_cursor))) - dict_add_word (board->results, word->s); + dict_add_word (board->results, word); for (dy = -1; dy <= 1; dy++) for (dx = -1; dx <= 1; dx++) board_enumerate (board, x + dx, y + dy, seen, word, dict_cursor); if (c == 'q') - string_chop (word); - string_chop (word); + word [strlen (word) - 1] = '\0'; + word [strlen (word) - 1] = '\0'; } -void +static void board_solve (board_t *board, dict_t *dict, dict_t *solution) { int x, y; int16_t seen = 0; - string_t word; + char word[17]; board->results = solution; - string_init (&word); + memset (word, '\0', 17); for (y = 0; y < 4; y++) for (x = 0; x < 4; x++) - board_enumerate (board, x, y, seen, &word, dict_root (dict)); + board_enumerate (board, x, y, seen, word, dict_root (dict)); +} + +static bool_t +seen_predicate (dict_entry_t entry) +{ + return entry & GRID_WORD_SEEN; +} - string_fini (&word); +static bool_t +unseen_predicate (dict_entry_t entry) +{ + return ! seen_predicate (entry); } #define GAME_LENGTH (3 * 60) @@ -167,7 +180,6 @@ main (void) int remaining, minutes, seconds; int found, missed; char prompt[7], *response; - string_t word; gettimeofday (&tv, NULL); srand (tv.tv_sec ^ tv.tv_usec); @@ -198,10 +210,10 @@ main (void) dict_entry_t *entry; entry = dict_lookup (&solution, response); if (DICT_ENTRY_IS_WORD (entry)) { - if (*entry & TRIE_FLAGS_SEEN) + if (*entry & GRID_WORD_SEEN) printf ("(repeat)\n"); else - *entry |= TRIE_FLAGS_SEEN; + *entry |= GRID_WORD_SEEN; } else { entry = dict_lookup (&dict, response); if (DICT_ENTRY_IS_WORD (entry)) @@ -217,18 +229,13 @@ main (void) } while (remaining > 0); printf ("\nWords you found:\n"); - string_init (&word); - found = trie_print_seen (&solution, &word); - string_fini (&word); - printf ("\n"); + found = dict_print_by_length_if (&solution, seen_predicate); printf ("\nWords you missed:\n"); - string_init (&word); - missed = trie_print_unseen (&solution, &word); - string_fini (&word); + missed = dict_print_by_length_if (&solution, unseen_predicate); printf ("\n"); - printf ("\nYou found %d of %d words (%.2f%%)\n", + printf ("You found %d of %d words (%.2f%%)\n", found, found + missed, 100 * (double) found / (found + missed));