#include #include #include #include "skomb.h" #define VERSION "1.1" #define ERROR_MSG(msg) fprintf(stderr, "error: "msg"\n") #define HELPMSG printf("skomb is a program that returns the possible combinations for a given number and cells it spans in a sudoku killer board\nthis current version only supports numbers in the same column or line, or in the same 9x9, although this may change in future versions\nusage: skomb\n skomb [-h|--help] shows this message\n skomb [-v|--version] shows version number\n") int main(int argc, char **argv){ if (argc >= 2 && (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0)){ printf(VERSION"\n"); return 0; } if (argc >= 2 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)){ HELPMSG; return 0; } while (1){ printf("Insert number to solve for > "); /* number can only be two digits at most + space for null character */ char *numberc = malloc(sizeof(char) * 3); readline(numberc, 3); if (numberc[0] == '\0'){ free(numberc); break; } int number = atoi(numberc); free(numberc); /* cells can only be one digit at most + space for null character */ printf("Insert cells it takes up > "); char *cellsc = malloc(sizeof(char) * 2); readline(cellsc, 2); int cells = atoi(cellsc); free(cellsc); printf("Insert numbers that can't be in the group separated by spaces > "); char *not_allowedc = malloc(sizeof(char) * 20); readline(not_allowedc, 20); int *not_allowed = malloc(sizeof(int) * 9); int *not_allowed_len = malloc(sizeof(int)*1); *not_allowed_len = splitc_toi(not_allowedc, ' ', not_allowed); free(not_allowedc); switch (cells){ case 2: if (number >= 3 && number <= 17){ pair *pairs = malloc(sizeof(pair) * 4); int len = perm2(number, not_allowed, not_allowed_len, pairs); printf("%d:\n", number); for (int i = 0; i < len; i++){ printf("\t%d + %d\n", pairs[i].x, pairs[i].y); } free(pairs); break; } ERROR_MSG("number too small or big for ammount of cells"); free(not_allowed); free(not_allowed_len); return 3; case 3: if (number >= 6 && number <= 24){ trio *trios = malloc(sizeof(trio) * 9); int len = perm3(number, not_allowed, not_allowed_len, trios); printf("%d:\n", number); for (int i = 0; i < len; i++){ printf("\t%d + %d + %d\n", trios[i].x, trios[i].y, trios[i].z); } free(trios); break; } ERROR_MSG("number too small or big for ammount of cells"); free(not_allowed); free(not_allowed_len); return 3; case 4: if (number >= 10 && number <= 30){ quartet *quartets = malloc(sizeof(quartet) * 12); int len = perm4(number, not_allowed, not_allowed_len, quartets); printf("%d:\n", number); for (int i = 0; i < len; i++){ printf("\t%d + %d + %d + %d\n", quartets[i].x, quartets[i].y, quartets[i].z, quartets[i].w); } free(quartets); break; } ERROR_MSG("number too small or big for ammount of cells"); free(not_allowed); free(not_allowed_len); return 3; case 5: if (number >= 15 && number <= 35){ quintet *quintets = malloc(sizeof(quintet) * 12); int len = perm5(number, not_allowed, not_allowed_len, quintets); printf("%d:\n", number); for (int i = 0; i < len; i++){ printf("\t%d + %d + %d + %d + %d\n", quintets[i].x, quintets[i].y, quintets[i].z, quintets[i].w, quintets[i].v); } free(quintets); break; } ERROR_MSG("number too small or big for ammount of cells"); free(not_allowed); free(not_allowed_len); return 3; default: ERROR_MSG("invalid ammount of cells"); free(not_allowed); free(not_allowed_len); HELPMSG; return 4; } free(not_allowed); free(not_allowed_len); } return 0; }