From 2027d6b61eb1e11c9a47bfb97bec54b23b876e3a Mon Sep 17 00:00:00 2001 From: Matthew Slowe Date: Tue, 3 Jan 2017 19:13:13 +0000 Subject: [PATCH] initial C import --- src/dir.c | 39 ++++++++++++++++++++++++ src/dir.h | 19 ++++++++++++ src/grid.c | 69 +++++++++++++++++++++++++++++++++++++++++++ src/grid.h | 18 +++++++++++ src/rnd.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/rnd.h | 7 +++++ 6 files changed, 239 insertions(+) create mode 100644 src/dir.c create mode 100644 src/dir.h create mode 100644 src/grid.c create mode 100644 src/grid.h create mode 100644 src/rnd.c create mode 100644 src/rnd.h diff --git a/src/dir.c b/src/dir.c new file mode 100644 index 0000000..17ae908 --- /dev/null +++ b/src/dir.c @@ -0,0 +1,39 @@ +#include "dir.h" +#include "rnd.h" + + +int directions[] = { + DIRECTION_N, + DIRECTION_NE, + DIRECTION_E, + DIRECTION_SE, + DIRECTION_S, + DIRECTION_SW, + DIRECTION_W, + DIRECTION_NW +}; + + +int get_direction(int simple) { + if(simple) { + if(random_number(0, 1) == 0) { + return DIRECTION_E; + } else { + return DIRECTION_S; + } + } else { + return directions[random_number(0, NUM_DIRECTIONS)]; + } +} + +#ifdef DEBUG_DIR_MAIN +#include + +int main() { + int n = 32; + while(--n > 0) { + printf("%d\n", get_direction(1)); + } + return 0; +} +#endif \ No newline at end of file diff --git a/src/dir.h b/src/dir.h new file mode 100644 index 0000000..092ccbb --- /dev/null +++ b/src/dir.h @@ -0,0 +1,19 @@ +#ifndef WORDSEARCH_DIR +#define WORDSEARCH_DIR + +enum direction { + DIRECTION_N, + DIRECTION_NE, + DIRECTION_E, + DIRECTION_SE, + DIRECTION_S, + DIRECTION_SW, + DIRECTION_W, + DIRECTION_NW +}; + +#define NUM_DIRECTIONS 8 + +int get_direction(int simple); + +#endif \ No newline at end of file diff --git a/src/grid.c b/src/grid.c new file mode 100644 index 0000000..42246cd --- /dev/null +++ b/src/grid.c @@ -0,0 +1,69 @@ +#include + +#include "rnd.h" +#include "dir.h" +#include "grid.h" + +bounds *get_bounds(int height, int width, enum direction direction, int length) { + if(length > height || length > width) { + return NULL; + } + + bounds *b = (bounds *) malloc (sizeof(bounds)); + + b->min_x = 0; + b->max_x = width; + b->min_y = 0; + b->max_y = height; + if( + direction == DIRECTION_N || + direction == DIRECTION_NE || + direction == DIRECTION_NW + ) { + b->min_y = length; + } + + if( + direction == DIRECTION_W || + direction == DIRECTION_NW || + direction == DIRECTION_SW + ) { + b->min_x = length; + } + + if( + direction == DIRECTION_E || + direction == DIRECTION_NE || + direction == DIRECTION_SE + ) { + b->max_x = width - length; + } + + if( + direction == DIRECTION_S || + direction == DIRECTION_SW || + direction == DIRECTION_SE + ) { + b->max_y = height - length; + } + + return b; +} + +char** makegrid (char** words, int height, int width, int simple) { + return NULL; +} + +#ifdef DEBUG_GRID_MAIN +#include +int main() { + int dir = get_direction(0); + bounds* bounds = get_bounds(10, 10, dir, 8); + printf("DIR=%d => %d < height < %d & %d < width < %d\n", + dir, + bounds->min_y, bounds->max_y, + bounds->min_x, bounds->max_x + ); + free(bounds); +} +#endif \ No newline at end of file diff --git a/src/grid.h b/src/grid.h new file mode 100644 index 0000000..e6dfbae --- /dev/null +++ b/src/grid.h @@ -0,0 +1,18 @@ +#ifndef WORDSEARCH_GRID +#define WORDSEARCH_GRID + +#define WORDSEARCH_MAXTRIES 500 + +char** makegrid (char** words, int height, int width, int simple); + +typedef struct bounds { + int min_y; + int max_y; + int min_x; + int max_x; +} bounds; + +/* returns NULL if cannot fit word; caller needs to free() the response */ +bounds* get_bounds(int height, int width, enum direction direction, int length); + +#endif \ No newline at end of file diff --git a/src/rnd.c b/src/rnd.c new file mode 100644 index 0000000..9efa720 --- /dev/null +++ b/src/rnd.c @@ -0,0 +1,87 @@ +#include +#include +#include + +#include "rnd.h" + + /* https://www.math.cornell.edu/~mec/2003-2004/cryptography/subs/frequencies.html */ + +#define ALPHABET_SIZE 26 +#define RND_MAXINT 10000 + +struct letter_frequency { + int p; /* pegged to 10000 rather than 1 */ + char c; +} letter_frequencies[] = { + {7, 'Z'}, + {10, 'J'}, + {11, 'Q'}, + {17, 'X'}, + {69, 'K'}, + {111, 'V'}, + {149, 'B'}, + {182, 'P'}, + {203, 'G'}, + {209, 'W'}, + {211, 'Y'}, + {230, 'F'}, + {261, 'M'}, + {271, 'C'}, + {288, 'U'}, + {398, 'L'}, + {432, 'D'}, + {592, 'H'}, + {602, 'R'}, + {628, 'S'}, + {695, 'N'}, + {731, 'I'}, + {768, 'O'}, + {812, 'A'}, + {910, 'T'}, + {1202, 'E'}, +}; + +/* from http://stackoverflow.com/questions/822323/how-to-generate-a-random-number-in-c */ +int random_number(int min_num, int max_num) { + static int initialised = 0; + int result = 0; + int low_num = 0; + int hi_num = 0; + if(min_num < max_num) { + low_num = min_num; + hi_num = max_num + 1; // this is done to include max_num in output. + } else { + low_num = max_num + 1;// this is done to include max_num in output. + hi_num = min_num; + } + if(!initialised) { + srand(time(NULL)); + initialised = 1; + } + result = ( rand() % (hi_num - low_num) ) + low_num; + return result; +} + +char get_random_letter() { + int rnd = random_number(0, RND_MAXINT); + for(int i=0; i < ALPHABET_SIZE; i++) { + if(rnd < letter_frequencies[i].p) { + return letter_frequencies[i].c; + } + rnd -= letter_frequencies[i].p; + } + return '\0'; +} + +#ifdef DEBUG_RND_MAIN +#include + +int main() { + int n = 32; + while(--n > 0) { + printf("%c", get_random_letter()); + } + return 0; +} + +#endif \ No newline at end of file diff --git a/src/rnd.h b/src/rnd.h new file mode 100644 index 0000000..680022f --- /dev/null +++ b/src/rnd.h @@ -0,0 +1,7 @@ +#ifndef WORDSEARCH_RND +#define WORDSEARCH_RND + +char get_random_letter(); +int random_number(int min_num, int max_num); + +#endif \ No newline at end of file