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 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <stdint.h> // Include for uint64_t (assume free for golf scoring) #define U uint64_t // Macro for shorter type name int count() { int c = 0; // Counter for stable configurations // M is a mask for the inner 6x6 grid cells (rows 1-6, cols 1-6). // 0x7e = 01111110 in binary. The mask covers bits 8 to 55 where col is 1-6. U M = 0x7e7e7e7e7e7e00ULL; // Loop through all 2^16 = 65536 initial configurations represented by 'i' for (int i = 0; i < 1 << 16; i++) { // Use 1<<16 (5 chars) instead of 65536 (5 chars) - same length U a = 0; // Build the initial 8x8 grid state 'a' from 16 bits of 'i' // The 16 bits of 'i' map to the 4x4 subgrid (1,1) to (4,4) for (int k = 0; k < 4; k++) // Loop over 4 blocks of 4 bits // Extract 4 bits (mask 0xf) from i at offset k*4, shift them to position (9 + k*4) in 'a' a |= ((i >> (k * 4)) & 0xf) << (9 + k * 4); // Calculate the union of all neighbors for all cells simultaneously using bit shifts. // N will have bit 'p' set if any neighbor (top, left, bottom, right) of cell 'p' in grid 'a' is set. U N = (a >> 8) | (a >> 1) | (a << 8) | (a << 1); // Check for stability: // a & ~N : identifies isolated '1's (cell 'p' is 1 AND neighbors N at 'p' are 0) // (a & ~N) & M : selects only those isolated '1's that fall within the inner 6x6 grid mask M // If this result is 0, it means no '1' cell within the inner 6x6 grid is isolated, so the configuration 'a' is stable. if (!((a & ~N) & M)) c++; // Increment count if stable } return c; // Return the total count of stable configurations } |
1 2 3 | #include <stdint.h> #define U uint64_t int count(){int c=0;U M=0x7e7e7e7e7e7e00ULL;for(int i=0;i<1<<16;i++){U a=0;for(int k=0;k<4;k++)a|=((i>>(k*4))&0xf)<<(9+k*4);U N=(a>>8)|(a>>1)|(a<<8)|(a<<1);if(!((a&~N)&M))c++;}return c;} |
I extracted the following code from that output:
1 2 3 | #include <stdint.h> #define U uint64_t int count(){int c=0;U M=0x7e7e7e7e7e7e00ULL;for(int i=0;i<1<<16;i++){U a=0;for(int k=0;k<4;k++)a|=((i>>(k*4))&0xf)<<(9+k*4);U N=(a>>8)|(a>>1)|(a<<8)|(a<<1);if(!((a&~N)&M))c++;}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 | #include <stdint.h> #define U uint64_t int count(){int c=0;U M=0x7e7e7e7e7e7e00ULL;for(int i=0;i<1<<16;i++){U a=0;for(int k=0;k<4;k++)a|=((i>>(k*4))&0xf)<<(9+k*4);U N=(a>>8)|(a>>1)|(a<<8)|(a<<1);if(!((a&~N)&M))c++;}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 31376 instead of 27488.
Testing if the previous output contains the string All tests passed
: False
Resulting in output: True