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 solve this problem, we need to count the number of 16-bit patterns that remain unchanged after applying a specific transformation and processing. The transformation involves placing the 16-bit pattern into specific positions of an 8x8 grid, and the processing involves modifying the grid based on the values of neighboring cells. ### Approach 1. **Grid Transformation**: Convert the 16-bit integer into an 8x8 grid. The 16 bits are split into four 4-bit groups, each placed in specific rows and columns of the grid. 2. **Processing the Grid**: For each cell in the inner 6x6 grid (excluding the outermost rows and columns), check if all four neighbors (top, left, bottom, right) are zero. If so, and the cell itself is 1, set the cell to 0. 3. **Counting Unchanged Patterns**: After processing, check if the grid remains unchanged from the initial configuration. If it does, increment the count. ### Solution Code
1 | int count(){int c=0;unsigned long long m=0x7E007E007E007E007E007E00ULL;for(int i=0;i<1<<16;i++){unsigned long long a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),t=a;unsigned long long n=(t<<8)|(t>>8)|(t<<1)|(t>>1);a=t&~(t&~n&m);c+=a==t;}return c;} |
I extracted the following code from that output:
1 | int count(){int c=0;unsigned long long m=0x7E007E007E007E007E007E00ULL;for(int i=0;i<1<<16;i++){unsigned long long a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),t=a;unsigned long long n=(t<<8)|(t>>8)|(t<<1)|(t>>1);a=t&~(t&~n&m);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 | int count(){int c=0;unsigned long long m=0x7E007E007E007E007E007E00ULL;for(int i=0;i<1<<16;i++){unsigned long long a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),t=a;unsigned long long n=(t<<8)|(t>>8)|(t<<1)|(t>>1);a=t&~(t&~n&m);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 31072 instead of 27488.
main.c: In function 'count':
main.c:2:42: warning: integer constant is too large for its type
2 | int count(){int c=0;unsigned long long m=0x7E007E007E007E007E007E00ULL;for(int i=0;i<1<<16;i++){unsigned long long a=((i&0xf)<<9)|((i&0xf0)<<13)|((i&0xf00)<<17)|((i&0xf000)<<21),t=a;unsigned long long n=(t<<8)|(t>>8)|(t<<1)|(t>>1);a=t&~(t&~n&m);c+=a==t;}return c;}
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Testing if the previous output contains the string All tests passed
: False
Resulting in output: True