Skip to content

Instantly share code, notes, and snippets.

Created July 21, 2016 07:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/7737943c9db500b4a041439f63bf42d8 to your computer and use it in GitHub Desktop.
Save anonymous/7737943c9db500b4a041439f63bf42d8 to your computer and use it in GitHub Desktop.
dailyprogrammer 261 easy
#include <stdio.h>
#include <stdlib.h>
int verify(int *square, int side) {
int i, j, sum, target;
// diagonals
target = 0;
for (i = 0; i < side; i++)
target += square[i*side + i];
sum = 0;
for (i = 0; i < side; i++)
sum += square[i*side + side-i-1];
if (sum != target)
return 0;
// horizontals
for (i = 0; i < side; i++) {
sum = 0;
for (j = 0; j < side; j++)
sum += square[i*side + j];
if (sum != target)
return 0;
}
// verticals
for (i = 0; i < side; i++) {
sum = 0;
for (j = 0; j < side; j++)
sum += square[j*side + i];
if (sum != target)
return 0;
}
return 1;
}
int can_complete(int *rect, int side) {
int i, j, sum, target;
// horizontal on row 0
target = 0;
for (i = 0; i < side; i++)
target += rect[i];
// horizontals from rows 1 upto side-1 (excluding)
for (i = 0; i < side-1; i++) {
sum = 0;
for (j = 0; j < side; j++)
sum += rect[i*side + j];
if (sum != target)
return 0;
}
int *last_row = malloc(side * sizeof(int));
int last_row_sum = 0;
for (i = 0; i < side; i++) {
sum = 0;
for (j = 0; j < side-1; j++)
sum += rect[j*side + i];
if (target < sum)
return 0;
last_row[i] = target - sum;
last_row_sum += last_row[i];
}
if (last_row_sum != target)
return 1;
// finally, check both diagonals
sum = 0;
for (i = 0; i < side-1; i++)
sum += rect[i*side + side-i-1];
if (sum + last_row[0] != target)
return 0;
sum = 0;
for (i = 0; i < side-1; i++)
sum += rect[i*side + i];
return target == (sum + last_row[side-1]);
}
int main() {
int verify_tests[4][9] = {{8, 1, 6, 3, 5, 7, 4, 9, 2},
{2, 7, 6, 9, 5, 1, 4, 3, 8},
{3, 5, 7, 8, 1, 6, 4, 9, 2},
{8, 1, 6, 7, 5, 3, 4, 9, 2}};
int i;
for (i = 0; i < 4; i++)
printf("%d ", verify(verify_tests[i], 3));
int cc_tests[2][6] = {{8, 1, 6, 3, 5, 7},
{3, 5, 7, 8, 1, 6}};
for (i = 0; i < 2; i++)
printf("%d ", can_complete(cc_tests[i], 3));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment