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 the function:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21); long long unsigned int b=a; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(r-1)*8+s,l=r*8+s-1, m=(r+1)*8+s,n=r*8+s+1; c+=((b>>p&1)&&!(b>>t&1)&&!(b>>l&1)&&!(b>>m&1)&&!(b>>n&1)&&(a==b)); } } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21); long long unsigned int b=a; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(r-1)*8+s,l=r*8+s-1, m=(r+1)*8+s,n=r*8+s+1; c+=((b>>p&1)&&!(b>>t&1)&&!(b>>l&1)&&!(b>>m&1)&&!(b>>n&1)&&(a==b)); } } 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 30 31 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21); long long unsigned int b=a; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(r-1)*8+s,l=r*8+s-1, m=(r+1)*8+s,n=r*8+s+1; c+=((b>>p&1)&&!(b>>t&1)&&!(b>>l&1)&&!(b>>m&1)&&!(b>>n&1)&&(a==b)); } } 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 61440 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: False
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 the function:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),t=u; for(int r=1;r<7;r++) for(int l=1;l<7;l++){ int p=r*8+l,s=((t>>(r-1)*8+l)&1)+((t>>(r-1)*8+l-1)&1)+ ((t>>(r+1)*8+l)&1)+((t>>(r)*8+l+1)&1); if(s==0&&((t>>p)&1))u&=~(1ULL<<p); } c+=(u==t); } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),t=u; for(int r=1;r<7;r++) for(int l=1;l<7;l++){ int p=r*8+l,s=((t>>(r-1)*8+l)&1)+((t>>(r-1)*8+l-1)&1)+ ((t>>(r+1)*8+l)&1)+((t>>(r)*8+l+1)&1); if(s==0&&((t>>p)&1))u&=~(1ULL<<p); } c+=(u==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 29 30 31 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),t=u; for(int r=1;r<7;r++) for(int l=1;l<7;l++){ int p=r*8+l,s=((t>>(r-1)*8+l)&1)+((t>>(r-1)*8+l-1)&1)+ ((t>>(r+1)*8+l)&1)+((t>>(r)*8+l+1)&1); if(s==0&&((t>>p)&1))u&=~(1ULL<<p); } c+=(u==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 18736 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: False
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 shorter version of the function:
1 2 3 4 5 6 7 8 9 10 11 12 13 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),b=a; for(int r=1;r<7;r++) for(int l=1;l<7;l++){ int p=r*8+l,s=(b>>((r-1)*8+l))&1+(b>>(r*8+l-1))&1+(b>>((r+1)*8+l))&1+(b>>(r*8+l+1))&1; if(s==0 && (b>>p)&1)a&=~(1ULL<<p); } c+=(a==b); } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),b=a; for(int r=1;r<7;r++) for(int l=1;l<7;l++){ int p=r*8+l,s=(b>>((r-1)*8+l))&1+(b>>(r*8+l-1))&1+(b>>((r+1)*8+l))&1+(b>>(r*8+l+1))&1; if(s==0 && (b>>p)&1)a&=~(1ULL<<p); } c+=(a==b); } 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 30 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),b=a; for(int r=1;r<7;r++) for(int l=1;l<7;l++){ int p=r*8+l,s=(b>>((r-1)*8+l))&1+(b>>(r*8+l-1))&1+(b>>((r+1)*8+l))&1+(b>>(r*8+l+1))&1; if(s==0 && (b>>p)&1)a&=~(1ULL<<p); } c+=(a==b); } 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 16 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: False
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),v=u; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(v>>(r-1)*8+s)&1,l=(v>>r*8+s-1)&1, b=(v>>(r+1)*8+s)&1,m=(v>>r*8+s+1)&1,n=t+l+b+m; u&=~((n==0&&((v>>p)&1))*((1ULL<<p))); } c+=(u==v); } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),v=u; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(v>>(r-1)*8+s)&1,l=(v>>r*8+s-1)&1, b=(v>>(r+1)*8+s)&1,m=(v>>r*8+s+1)&1,n=t+l+b+m; u&=~((n==0&&((v>>p)&1))*((1ULL<<p))); } 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 29 30 31 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long u=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),v=u; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(v>>(r-1)*8+s)&1,l=(v>>r*8+s-1)&1, b=(v>>(r+1)*8+s)&1,m=(v>>r*8+s+1)&1,n=t+l+b+m; u&=~((n==0&&((v>>p)&1))*((1ULL<<p))); } 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"); } |
All tests passed
Testing if the previous output contains the string All tests passed
: True
Resulting in output: False
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 golf'd version of the function that tries to minimize the byte count:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),b=a; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(r-1)*8+s,l=r*8+s-1, m=(r+1)*8+s,n=r*8+s+1; if(!((b>>t&1)+(b>>l&1)+(b>>m&1)+(b>>n&1))&&(b>>p&1)) a&=~(1ULL<<p); } c+=(a==b); } return c; } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),b=a; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(r-1)*8+s,l=r*8+s-1, m=(r+1)*8+s,n=r*8+s+1; if(!((b>>t&1)+(b>>l&1)+(b>>m&1)+(b>>n&1))&&(b>>p&1)) a&=~(1ULL<<p); } c+=(a==b); } 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 30 31 32 | int count(){ int c=0; for(int i=0;i<1<<16;i++){ long long unsigned int a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),b=a; for(int r=1;r<7;r++) for(int s=1;s<7;s++){ int p=r*8+s,t=(r-1)*8+s,l=r*8+s-1, m=(r+1)*8+s,n=r*8+s+1; if(!((b>>t&1)+(b>>l&1)+(b>>m&1)+(b>>n&1))&&(b>>p&1)) a&=~(1ULL<<p); } c+=(a==b); } 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"); } |
All tests passed
Testing if the previous output contains the string All tests passed
: True
Resulting in output: False