#include "stdio.h"
#include "stdbool.h"
#define CIRCLES_COUNT 4
#define CIRCLE_CAPACITY 12
static inline void rotate_right(int c[CIRCLE_CAPACITY]) {
int last = c[CIRCLE_CAPACITY-1];
for (int i = CIRCLE_CAPACITY-1; i > 0; i--)
c[i] = c[i-1];
c[0] = last;
}
void print_circle(const int c[CIRCLE_CAPACITY]) {
for (int i = 0; i < CIRCLE_CAPACITY; i++)
}
void print_circles(const int cc[CIRCLES_COUNT][CIRCLE_CAPACITY]) {
for (int row = 0; row < CIRCLES_COUNT; row++) {
print_circle(cc[row]);
}
}
bool all_equal(const int cc[CIRCLES_COUNT][CIRCLE_CAPACITY]) {
bool first_column = true;
int prev_sum;
for (int col = 0; col < CIRCLE_CAPACITY; col++) {
int sum = 0;
for (int i = 0; i < CIRCLES_COUNT; i++) {
sum += cc[i][col];
}
if (!first_column && sum != prev_sum)
return false;
prev_sum = sum;
first_column = false;
}
return true;
}
void main() {
int circles[CIRCLES_COUNT][CIRCLE_CAPACITY] = {
{3, 9, 6, 4, 3, 7, 5, 2, 4, 8, 3, 6},
{8, 4, 7, 5, 8, 2, 9, 5, 5, 8, 4, 6},
{6, 5, 8, 1, 6, 6, 7, 1, 3, 7, 1, 9},
{9, 2, 4, 6, 8, 4, 3, 8, 5, 2, 3, 7}
};
int max_rotations = CIRCLE_CAPACITY;
for (int i = 1; i < CIRCLES_COUNT; i++)
max_rotations *= CIRCLE_CAPACITY;
for (int rot = 0; ; rot++) {
if (rot == max_rotations) {
break;
}
if (!(all_equal(circles))) {
rotate_right(circles[(rot / CIRCLE_CAPACITY) % CIRCLES_COUNT]);
continue;
}
print_circles(circles);
break;
}
}
I2luY2x1ZGUgInN0ZGlvLmgiCiNpbmNsdWRlICJzdGRib29sLmgiCgojZGVmaW5lIENJUkNMRVNfQ09VTlQgNAojZGVmaW5lIENJUkNMRV9DQVBBQ0lUWSAxMgoKc3RhdGljIGlubGluZSB2b2lkIHJvdGF0ZV9yaWdodChpbnQgY1tDSVJDTEVfQ0FQQUNJVFldKSB7CglpbnQgbGFzdCA9IGNbQ0lSQ0xFX0NBUEFDSVRZLTFdOwoJZm9yIChpbnQgaSA9IENJUkNMRV9DQVBBQ0lUWS0xOyBpID4gMDsgaS0tKQoJCWNbaV0gPSBjW2ktMV07CgljWzBdID0gbGFzdDsKfQoKdm9pZCBwcmludF9jaXJjbGUoY29uc3QgaW50IGNbQ0lSQ0xFX0NBUEFDSVRZXSkgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBDSVJDTEVfQ0FQQUNJVFk7IGkrKykKCQlwcmludGYoIiVkICIsIGNbaV0pOwoJcHJpbnRmKCJcbiIpOwp9Cgp2b2lkIHByaW50X2NpcmNsZXMoY29uc3QgaW50IGNjW0NJUkNMRVNfQ09VTlRdW0NJUkNMRV9DQVBBQ0lUWV0pIHsKCWZvciAoaW50IHJvdyA9IDA7IHJvdyA8IENJUkNMRVNfQ09VTlQ7IHJvdysrKSB7CgkJcHJpbnRfY2lyY2xlKGNjW3Jvd10pOwoJfQp9Cgpib29sIGFsbF9lcXVhbChjb25zdCBpbnQgY2NbQ0lSQ0xFU19DT1VOVF1bQ0lSQ0xFX0NBUEFDSVRZXSkgewoJYm9vbCBmaXJzdF9jb2x1bW4gPSB0cnVlOwoJaW50IHByZXZfc3VtOwoJZm9yIChpbnQgY29sID0gMDsgY29sIDwgQ0lSQ0xFX0NBUEFDSVRZOyBjb2wrKykgewoJCWludCBzdW0gPSAwOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgQ0lSQ0xFU19DT1VOVDsgaSsrKSB7CgkJCXN1bSArPSBjY1tpXVtjb2xdOwoJCX0KCgkJaWYgKCFmaXJzdF9jb2x1bW4gJiYgc3VtICE9IHByZXZfc3VtKQoJCQkJcmV0dXJuIGZhbHNlOwoJCXByZXZfc3VtID0gc3VtOwoKCQlmaXJzdF9jb2x1bW4gPSBmYWxzZTsKCX0KCXJldHVybiB0cnVlOwp9Cgp2b2lkIG1haW4oKSB7CglpbnQgY2lyY2xlc1tDSVJDTEVTX0NPVU5UXVtDSVJDTEVfQ0FQQUNJVFldID0gewoJCXszLCA5LCA2LCA0LCAzLCA3LCA1LCAyLCA0LCA4LCAzLCA2fSwKCQl7OCwgNCwgNywgNSwgOCwgMiwgOSwgNSwgNSwgOCwgNCwgNn0sCgkJezYsIDUsIDgsIDEsIDYsIDYsIDcsIDEsIDMsIDcsIDEsIDl9LAoJCXs5LCAyLCA0LCA2LCA4LCA0LCAzLCA4LCA1LCAyLCAzLCA3fQoJfTsKCglpbnQgbWF4X3JvdGF0aW9ucyA9IENJUkNMRV9DQVBBQ0lUWTsKCWZvciAoaW50IGkgPSAxOyBpIDwgQ0lSQ0xFU19DT1VOVDsgaSsrKQoJCW1heF9yb3RhdGlvbnMgKj0gQ0lSQ0xFX0NBUEFDSVRZOwoKCWZvciAoaW50IHJvdCA9IDA7IDsgcm90KyspIHsKCQlpZiAocm90ID09IG1heF9yb3RhdGlvbnMpIHsKCQkJcHJpbnRmKCJObyBzb2x1dGlvbnNcbiIpOwoJCQlicmVhazsKCQl9CgoJCWlmICghKGFsbF9lcXVhbChjaXJjbGVzKSkpIHsKCQkJcm90YXRlX3JpZ2h0KGNpcmNsZXNbKHJvdCAvIENJUkNMRV9DQVBBQ0lUWSkgJSBDSVJDTEVTX0NPVU5UXSk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJcHJpbnRfY2lyY2xlcyhjaXJjbGVzKTsKCQlicmVhazsKCX0KfQ==