#include #include #include #include #include struct Result { char word[256]; int value; } *stack; int stack_index = 0; const char *map[] = {"qz", "qz", "abc", "def", "ghi", "jkl", "mno", "prs", "tuv", "wxy"}; const char *revmap = "2223334445556667_77888999_"; void add_word(char *word) { strcpy(stack[stack_index].word, word); while(*(word+1)) { stack[stack_index].value += get_digram_value(*word, *++word); } stack_index++; } void map_numbers(char *numbers, char *word, int length) { const char *t; int i; if (length < 0) { add_word(word); } else { t = map[(int)(numbers[length] - '0')]; if (t[0] != t[1] && t[0] != t[2]) { for(i = 0; i < strlen(t); i++) { word[length] = t[i]; map_numbers(numbers, word, length-1); } } else { map_numbers(numbers, word, length-1); } } } int compare(const void *a, const void *b) { return ((struct Result *)a)->value - ((struct Result *)b)->value; } int main(int argc, char **argv) { int i=0; char numbers[256]; char word[256]; char *tmp; long length; if (argc > 1) { strcpy(numbers, *(argv+1)); strcpy(word, *(argv+1)); if (isdigit(word[0])) { for(i = 0; word[i]; i++) { if (!isdigit(word[i])) { fprintf(stderr, "%s: Input number must contain only the digits 0-9\n", *argv); exit(0); } } } else if (isalpha(word[0])) { for(i = 0; word[i]; i++) { if (!isalpha(word[i])) { fprintf(stderr, "%s: Input word must not contain any digits\n", *argv); exit(0); } word[i] |= ' '; numbers[i] |= ' '; } } } else { fprintf(stderr, "%s: Please specify the numbers to sort on the command line\n", *argv); exit(0); } length = pow(3, strlen(word)); stack_index = 0; stack = (struct Result *)malloc(sizeof(struct Result)*length); if (isdigit(numbers[0])) { map_numbers(numbers, word, strlen(word)-1); fprintf(stderr, "Word listing (%d):\n", stack_index); qsort((void *)stack, (size_t)stack_index, sizeof(struct Result), compare); while(stack_index-- > 0) { fprintf(stdout, "%s\n", stack[stack_index].word); } } else { tmp = numbers; while(*tmp) { *tmp = revmap[(int)(*tmp - 'a')]; tmp++; } fprintf(stdout, "Word %s ==> %s\n", word, numbers); } exit(1); }