Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
To code golf this function and make it significantly shorter while maintaining the same functionality, we can take several steps to reduce the overall byte count. This includes removing unnecessary variables, condensing loops and operations, and utilizing bitwise operations more efficiently. Here is a condensed version of your function:
1 2 3 4 5 6 7 8 9 10 11 12 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=i&0xf|(i&0xf0)<<4|(i&0xf00)<<8|(i&0xf000)<<12,a=u,t; for(int r=1;r<7;r++)for(int j=1;j<7;j++){ t=r*8+j; if((u>>t&1)&&!((u>>t-1&1)+(u>>t+1&1)+(u>>t-8&1)+(u>>t+8&1)))a&=~(1LL<<t); } c+=(u==a); } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=i&0xf|(i&0xf0)<<4|(i&0xf00)<<8|(i&0xf000)<<12,a=u,t; for(int r=1;r<7;r++)for(int j=1;j<7;j++){ t=r*8+j; if((u>>t&1)&&!((u>>t-1&1)+(u>>t+1&1)+(u>>t-8&1)+(u>>t+8&1)))a&=~(1LL<<t); } c+=(u==a); } return c; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=i&0xf|(i&0xf0)<<4|(i&0xf00)<<8|(i&0xf000)<<12,a=u,t; for(int r=1;r<7;r++)for(int j=1;j<7;j++){ t=r*8+j; if((u>>t&1)&&!((u>>t-1&1)+(u>>t+1&1)+(u>>t-8&1)+(u>>t+8&1)))a&=~(1LL<<t); } c+=(u==a); } return c; } #include<stdio.h> #include<stdlib.h> int main() { int answer = count(); int expected = 27488; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
Wrong answer; got 40888 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: True
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
Here's a significantly shortened version of your function. This version maintains the original logic but simplifies the code significantly by removing unnecessary variables and compacting the operations into fewer lines. This version is well under 300 bytes (not counting whitespace):
1 2 3 4 5 6 7 8 9 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned a = ((i & 0xf) << 9) | ((i & 0xf0) << 12) | ((i & 0xf00) << 15) | ((i & 0xf000) << 18), t = a, p; for (int j = 9; j < 55; j+=8) for (p = a>>j&1; p && !(a>>(j-1)&1) && !(a>>(j+1)&1) && !(a>>(j-8)&1) && !(a>>(j+8)&1); p=0) a &= ~(1ULL << j); c += (t == a); } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned a = ((i & 0xf) << 9) | ((i & 0xf0) << 12) | ((i & 0xf00) << 15) | ((i & 0xf000) << 18), t = a, p; for (int j = 9; j < 55; j+=8) for (p = a>>j&1; p && !(a>>(j-1)&1) && !(a>>(j+1)&1) && !(a>>(j-8)&1) && !(a>>(j+8)&1); p=0) a &= ~(1ULL << j); c += (t == a); } return c; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned a = ((i & 0xf) << 9) | ((i & 0xf0) << 12) | ((i & 0xf00) << 15) | ((i & 0xf000) << 18), t = a, p; for (int j = 9; j < 55; j+=8) for (p = a>>j&1; p && !(a>>(j-1)&1) && !(a>>(j+1)&1) && !(a>>(j-8)&1) && !(a>>(j+8)&1); p=0) a &= ~(1ULL << j); c += (t == a); } return c; } #include<stdio.h> #include<stdlib.h> int main() { int answer = count(); int expected = 27488; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
Wrong answer; got 53760 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: True
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
Here's a condensed version of the provided function `count`, which retains the original functionality but is significantly shorter, fitting the requirement of being under 300 bytes (not counting whitespace):
1 2 3 4 5 6 7 8 9 10 11 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long u = ((i & 0xf) << 9) | ((i & 0xf0) << 12) | ((i & 0xf00) << 15) | ((i & 0xf000) << 18), v = u; for (int p = 9; p < 57; p+=8) for (int q = p; q < p+6; q++) if (((v>>q)&1) && !((v>>(q-1))&1) && !((v>>(q+1))&1) && !((v>>(q-8))&1) && !((v>>(q+8))&1)) u &= ~(1LL<<q); c += (u == v); } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long u = ((i & 0xf) << 9) | ((i & 0xf0) << 12) | ((i & 0xf00) << 15) | ((i & 0xf000) << 18), v = u; for (int p = 9; p < 57; p+=8) for (int q = p; q < p+6; q++) if (((v>>q)&1) && !((v>>(q-1))&1) && !((v>>(q+1))&1) && !((v>>(q-8))&1) && !((v>>(q+8))&1)) u &= ~(1LL<<q); c += (u == v); } return c; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long u = ((i & 0xf) << 9) | ((i & 0xf0) << 12) | ((i & 0xf00) << 15) | ((i & 0xf000) << 18), v = u; for (int p = 9; p < 57; p+=8) for (int q = p; q < p+6; q++) if (((v>>q)&1) && !((v>>(q-1))&1) && !((v>>(q+1))&1) && !((v>>(q-8))&1) && !((v>>(q+8))&1)) u &= ~(1LL<<q); c += (u == v); } return c; } #include<stdio.h> #include<stdlib.h> int main() { int answer = count(); int expected = 27488; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
Wrong answer; got 24064 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: True
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
1 2 3 4 5 6 7 8 9 10 11 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long int a = (i & 0xf) * 0x204081, t = a; for (int p = 9; p < 57; p += 8) if (((t >> p) & 1) && !((t >> (p - 1)) & 1) && !((t >> (p + 1)) & 1) && !((t >> (p - 8)) & 1) && !((t >> (p + 8)) & 1)) a &= ~(1LL << p); c += (a == t); } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long int a = (i & 0xf) * 0x204081, t = a; for (int p = 9; p < 57; p += 8) if (((t >> p) & 1) && !((t >> (p - 1)) & 1) && !((t >> (p + 1)) & 1) && !((t >> (p - 8)) & 1) && !((t >> (p + 8)) & 1)) a &= ~(1LL << p); c += (a == t); } return c; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | int count() { int c = 0; for (int i = 0; i < 1<<16; i++) { long long int a = (i & 0xf) * 0x204081, t = a; for (int p = 9; p < 57; p += 8) if (((t >> p) & 1) && !((t >> (p - 1)) & 1) && !((t >> (p + 1)) & 1) && !((t >> (p - 8)) & 1) && !((t >> (p + 8)) & 1)) a &= ~(1LL << p); c += (a == t); } return c; } #include<stdio.h> #include<stdlib.h> int main() { int answer = count(); int expected = 27488; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
Wrong answer; got 40960 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: True
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the function named `count`.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int count() { int ROWS = 8; int COLS = 8; int count = 0; for (int i = 0; i < 1<<16; i++) { long long unsigned int array = ((i & 0xf) << 9) | ((i & 0xf0) << (9 + 8 - 4)) | ((i & 0xf00) << (9 + 8 - 4 + 8 - 4)) | ((i & 0xf000) << (9 + 8 - 4 + 8 - 4 + 8 - 4)); long long unsigned int init = array; long long unsigned int temp = array; for (int i = 1; i < ROWS - 1; i++) { for (int j = 1; j < COLS - 1; j++) { // Calculate bit positions int pos = i * COLS + j; int topPos = (i - 1) * COLS + j; int leftPos = i * COLS + (j - 1); int bottomPos = (i + 1) * COLS + j; int rightPos = i * COLS + (j + 1); // Get the values of the neighbors int cell = (temp >> pos) & 1; int top = (temp >> topPos) & 1; int left = (temp >> leftPos) & 1; int bottom = (temp >> bottomPos) & 1; int right = (temp >> rightPos) & 1; // Sum the values of the neighbors int sum = top + left + bottom + right; // Update the cell if all neighbors are 0 and the cell itself is 1 if (sum == 0 && cell == 1) { array &= ~(1ULL << pos); } } } count += (init == array); } return count; } |
Here's a condensed version of the function `count` that fits within the <300 bytes constraint while maintaining the original functionality:
1 2 3 4 5 6 7 8 9 10 11 | int count() { int c=0; for (int i=0;i<1<<16;i++) { long long u=i&0xf|i>>4&0xf0|i>>8&0xf00|i>>12&0xf000,u0=u,t; for(int j=1;j<7;j++) for(int k=1;k<7;k++) t=1LL<<(j*8+k),u&=~(t*((u&t)&&!((u>>(j*8+k-1)&1)+(u>>(j*8+k+1)&1)+(u>>((j-1)*8+k)&1)+(u>>((j+6)*8+k)&1)))); c+=u==u0; } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 | int count() { int c=0; for (int i=0;i<1<<16;i++) { long long u=i&0xf|i>>4&0xf0|i>>8&0xf00|i>>12&0xf000,u0=u,t; for(int j=1;j<7;j++) for(int k=1;k<7;k++) t=1LL<<(j*8+k),u&=~(t*((u&t)&&!((u>>(j*8+k-1)&1)+(u>>(j*8+k+1)&1)+(u>>((j-1)*8+k)&1)+(u>>((j+6)*8+k)&1)))); c+=u==u0; } return c; } |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | int count() { int c=0; for (int i=0;i<1<<16;i++) { long long u=i&0xf|i>>4&0xf0|i>>8&0xf00|i>>12&0xf000,u0=u,t; for(int j=1;j<7;j++) for(int k=1;k<7;k++) t=1LL<<(j*8+k),u&=~(t*((u&t)&&!((u>>(j*8+k-1)&1)+(u>>(j*8+k+1)&1)+(u>>((j-1)*8+k)&1)+(u>>((j+6)*8+k)&1)))); c+=u==u0; } return c; } #include<stdio.h> #include<stdlib.h> int main() { int answer = count(); int expected = 27488; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
Wrong answer; got 65536 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: True