Scrabble


The aim of this puzzle is to find the best word possible (in a given dictionnary) with a given set of letters. By best, understand the word that earn the most points when playing Scrabble. Once developped a function which determine if it is possible to write a word with a set of letters, and another function which computes the number of points earned by a word, a simple linear search allows to find the result. If not easier, this puzzle is as difficult as the easy puzzles involving string manipulation and linear search.

C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// Returns 1 if 'word' is writeable with letters contains in 'letters', 0 else
int writeable(char* word, char* letters) {
    char copy[strlen(letters)];
    strcpy(copy, letters);
    
    /* For each letter in word, looks for the letter in copy and replaces it
       by a space. If the letter can't be found, then word is not writeable with
       letters */
    for (int i = 0; word[i] != '\0'; i++) {
        int j = 0;
        while (copy[j] != '\0' && copy[j] != word[i])
            j++;
        if (copy[j] == word[i])
            copy[j] = ' ';
        else
            return 0;
    }
    return 1;
}

// array of 26 integers corresponding to the weight of each letter of the alphabet
int WEIGHTS[] = {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};

// Returns the number of points 'word' earns
int pointCount (char *word, int WEIGHTS[26]) {
    int res = 0;
    for (int i = 0; word[i] != '\0'; i++)
        res += WEIGHTS[word[i]-'a'];
    return res;
}

int main(int argc, char **argv)
{
    // Reading input : the N words of the dictionary, and letters available
    int N;
    scanf("%d\n", &N);
    char dictionary[N][30];
    for (int i = 0; i < N; i++)
        gets(dictionary[i]);
    char letters[8];
    fgets(letters,8,stdin);
    
    // Searches max pointCount amongst writeable words
    int max = 0;
    int count;
    char *res = NULL;
    for (int i = 0; i < N; i++)
        if (writeable(dictionary[i], letters) && (count = pointCount(dictionary[i], WEIGHTS)) > max) {
            max = count;
            res = dictionary[i];
        }

    printf("%s\n", res);
    return EXIT_SUCCESS;
}