Code:
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#define BUFFER_SIZE 256
// returns an array of strings (char[])
// last entry is a NULL pointer
char **getListOfWords(char filename[])
{
FILE *fp;
char buffer[BUFFER_SIZE];
char **words;
int M, nLines = 0, nAlloc = 1;
// initialize array of char pointers (for strings)
words = (char **)malloc(nAlloc*sizeof(char *));
fp = fopen(filename, "r");
while(!feof(fp))
{
fscanf(fp, "%s", buffer);
M = strlen(buffer);
words[nLines] = (char *)malloc((M+1)*sizeof(char));
strcpy(words[nLines], buffer);
nLines++;
if(nLines >= nAlloc)
{
nAlloc *= 2;
words = (char **)realloc(words, nAlloc*sizeof(char *));
}
}
words[nLines] = NULL;
words = (char **)realloc(words, (nLines + 1)*sizeof(char *));
fclose(fp);
return words;
}
void freeWords(char **words)
{
int i;
for(i=0; words[i] != NULL; i++)
{
free(words[i]);
}
free(words);
}
int canWeMakeIt(char word[], char letters[])
{
int n = strlen(letters) + 1;
int i;
char temp[n];
strcpy(temp,letters);
int found;
for(i=0;i<strlen(word);i=i+1) //for each char in word, search temp
{
found = 0;
for(n=0;n<strlen(temp);n=n+1)
{
if(word[i] == temp[n])
{
temp[n] = '-';
found = 1;
break;
}
}
// if i not in temp
if(found==0)
{
return 0;
}
}
return 1;
}
// the code below does not work: Tue Nov 12, 2:16 PM
char **getScrabbleWords(char **allWords, char letters[])
{
int nAlloc;
int i;
nAlloc = 1;
char ** myWords = (char **) malloc(nAlloc*sizeof(char *));
for(i=0;i<=(sizeof(allWords));i++)
{
if(canWeMakeIt(allWords[i],letters)==1) //it can be made
{
myWords[nAlloc-1] = allWords[i];
nAlloc = nAlloc +1;
myWords = (char **) realloc(myWords,(nAlloc*sizeof(char *)));
}
}
myWords[nAlloc-1] = NULL;
return myWords;
}
int getWordPoints(char word[])
{
int letterPoints[] = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10,1, 1, 1, 1, 4, 4, 8, 4, 10};
int position;
int points;
int i;
for(i=0;i<=(sizeof(word));i=i+1)
{
////'z' - letter
position = word[i] - 'a';
points = points + letterPoints[position];
}
return points;
}
void sortStringsByReversePoints(char **myWords)
{
int i, j, length;
char *swap = (char *)malloc(1*sizeof(char *));
for(i = 0; i <sizeof(myWords); i++)
{
for(j = 1; j < sizeof(myWords); j++)
{
if (strlen(myWords[i]>= strlen(myWords[j])))
length = strlen(myWords[i]);
else
length = myWords[i];
swap = (char *) realloc(myWords,(length*sizeof(char *)));
if(getWordPoints(myWords[i])< getWordPoints(myWords[j]))
{
*swap = myWords[i];
myWords[i] = myWords[j];
myWords[j] = *swap;
}
}
}
}
int main(int argc, char *argv[])
{
char **allWords, **myWords;
int i, j, M;
allWords = getListOfWords("wordlist.txt");
myWords = getScrabbleWords(allWords, argv[1]);
/*sortStringsByReversePoints(myWords);
for(i=0; myWords[i] != NULL; i++)
{
printf("%d %s\n", getWordPoints(myWords[i]), myWords[i]);
}
for(i=0; allWords[i] != NULL; i++)
{
printf("Word %d: %s\n", i, allWords[i]);
}
//Test cases for canWeMakeIt - un-comment when testing - remove before submitting
printf("canWeMakeIt(\"abba\", \"ab\") = %d\n", canWeMakeIt("abba", "ab"));
printf("canWeMakeIt(\"ab\", \"aba\") = %d\n", canWeMakeIt("ab", "aba"));
*/
freeWords(allWords);
free(myWords);
return 0;
}