Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the name `stepper`.
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | void stepper(int xw) { int Steps = 0; for (int x = 0; x < xw; x++) { switch (Steps) { case 0: digitalWrite(1, 0); digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 1); break; case 1: digitalWrite(1, 0); digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); break; case 2: digitalWrite(1, 0); digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 0); break; case 3: digitalWrite(1, 0); digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 0); break; case 4: digitalWrite(1, 0); digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 0); break; case 5: digitalWrite(1, 1); digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 0); break; case 6: digitalWrite(1, 1); digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 0); break; case 7: digitalWrite(1, 1); digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 1); break; default: digitalWrite(1, 0); digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 0); break; } Steps = (Steps + 1) % 8; } } |
Code golf this function to be a lot shorter. You only get points if it's <300 bytes (not counting whitespace). Keep the name `stepper`.
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | void stepper(int xw) { int Steps = 0; for (int x = 0; x < xw; x++) { switch (Steps) { case 0: digitalWrite(1, 0); digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 1); break; case 1: digitalWrite(1, 0); digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 1); break; case 2: digitalWrite(1, 0); digitalWrite(2, 0); digitalWrite(3, 1); digitalWrite(4, 0); break; case 3: digitalWrite(1, 0); digitalWrite(2, 1); digitalWrite(3, 1); digitalWrite(4, 0); break; case 4: digitalWrite(1, 0); digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 0); break; case 5: digitalWrite(1, 1); digitalWrite(2, 1); digitalWrite(3, 0); digitalWrite(4, 0); break; case 6: digitalWrite(1, 1); digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 0); break; case 7: digitalWrite(1, 1); digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 1); break; default: digitalWrite(1, 0); digitalWrite(2, 0); digitalWrite(3, 0); digitalWrite(4, 0); break; } Steps = (Steps + 1) % 8; } } |
Okay, let's golf this function. **1. Create a table of pin values:** Here's the state of pins 1, 2, 3, and 4 for each step: | Steps | Pin 1 | Pin 2 | Pin 3 | Pin 4 | Pattern (Binary 4321) | Pattern (Decimal) | | :---- | :---- | :---- | :---- | :---- | :-------------------- | :---------------- | | 0 | 0 | 0 | 0 | 1 | 1000 | 8 | | 1 | 0 | 0 | 1 | 1 | 1100 | 12 | | 2 | 0 | 0 | 1 | 0 | 0100 | 4 | | 3 | 0 | 1 | 1 | 0 | 0110 | 6 | | 4 | 0 | 1 | 0 | 0 | 0010 | 2 | | 5 | 1 | 1 | 0 | 0 | 0011 | 3 | | 6 | 1 | 0 | 0 | 0 | 0001 | 1 | | 7 | 1 | 0 | 0 | 1 | 1001 | 9 | **2. Find an expression:** The sequence of decimal patterns is `8, 12, 4, 6, 2, 3, 1, 9`. This doesn't have an obvious simple mathematical formula. The best approach is to use a lookup table (array) for these patterns. We can represent the state of the 4 pins as a single integer, where bit 0 corresponds to Pin 1, bit 1 to Pin 2, bit 2 to Pin 3, and bit 3 to Pin 4. The lookup table will be: `int p[] = {8, 12, 4, 6, 2, 3, 1, 9};` Inside the loop, for a given step `s`, the pattern is `p[s]`. We can get the state for pin `i` (where `i` is 1, 2, 3, or 4) by checking the `(i-1)`-th bit of the pattern: `(p[s] >> (i - 1)) & 1`. **3. Write the function as short as possible:** We can replace the `switch` statement with the lookup table and a loop for `digitalWrite`. We can also use shorter variable names, replace the outer `for` loop with a `while` loop decrementing `xw`, and use bitwise AND (`& 7`) instead of modulo (`% 8`).
1 2 3 4 5 6 7 8 9 10 11 12 13 | // Intermediate shorter version void stepper(int xw) { int s = 0; // Step counter int p[] = {8, 12, 4, 6, 2, 3, 1, 9}; // Patterns while (xw--) { // Loop xw times int pattern = p[s]; // Get current pattern for (int i = 0; i < 4; i++) { // Loop through pins 0..3 // Write to pin i+1 the value of bit i digitalWrite(i + 1, (pattern >> i) & 1); } s = ++s & 7; // Increment step, wrap around 0-7 } } |
1 2 3 4 5 6 7 8 9 10 | // Golfed version void stepper(int xw){ int s=0,i; // Declare s and i int p[]={8,12,4,6,2,3,1,9}; // Lookup table while(xw--){ // Loop xw times for(i=0;i<4;i++) // Loop pins 0..3 digitalWrite(i+1,(p[s]>>i)&1); // Set pin i+1 based on bit i of pattern p[s] s=++s&7; // Next step (0-7) } } |
1 2 3 | void stepper(int xw){ int s=0,i;int p[]={8,12,4,6,2,3,1,9};while(xw--){for(i=0;i<4;i++)digitalWrite(i+1,(p[s]>>i)&1);s=++s&7;} } |
I extracted the following code from that output:
1 2 3 | void stepper(int xw){ int s=0,i;int p[]={8,12,4,6,2,3,1,9};while(xw--){for(i=0;i<4;i++)digitalWrite(i+1,(p[s]>>i)&1);s=++s&7;} } |
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 | void stepper(int xw){ int s=0,i;int p[]={8,12,4,6,2,3,1,9};while(xw--){for(i=0;i<4;i++)digitalWrite(i+1,(p[s]>>i)&1);s=++s&7;} } #include<stdio.h> #include<stdlib.h> #include <stdio.h> int out = 0; int digitalWrite(int pin, int value) { out *= 101; out += pin; out *= 97; out += value; return out; } int main() { int answer = (stepper(100),out); int expected = -1475775710; if (answer != expected) { printf("Wrong answer; got %d instead of %d.\n", answer, expected); exit(1); } printf("All tests passed\n"); } |
All tests passed
main.c: In function 'stepper':
main.c:3:66: warning: implicit declaration of function 'digitalWrite' [-Wimplicit-function-declaration]
3 | int s=0,i;int p[]={8,12,4,6,2,3,1,9};while(xw--){for(i=0;i<4;i++)digitalWrite(i+1,(p[s]>>i)&1);s=++s&7;}
| ^~~~~~~~~~~~
Testing if the previous output contains the string All tests passed
: True
Resulting in output: True