116 lines
4.1 KiB
C
116 lines
4.1 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#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;
|
|
}
|