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; } } |
### Step 1: Create a table of values The table of values being written to the pins can be represented as follows: | Steps | Pin 1 | Pin 2 | Pin 3 | Pin 4 | | --- | --- | --- | --- | --- | | 0 | 0 | 0 | 0 | 1 | | 1 | 0 | 0 | 1 | 1 | | 2 | 0 | 0 | 1 | 0 | | 3 | 0 | 1 | 1 | 0 | | 4 | 0 | 1 | 0 | 0 | | 5 | 1 | 1 | 0 | 0 | | 6 | 1 | 0 | 0 | 0 | | 7 | 1 | 0 | 0 | 1 | ### Step 2: Find an expression for the table The values in the table can be represented as binary numbers. Let's represent the binary numbers as `0b` followed by the binary digits. | Steps | Binary | | --- | --- | | 0 | 0b0001 | | 1 | 0b0011 | | 2 | 0b0010 | | 3 | 0b0110 | | 4 | 0b0100 | | 5 | 0b1100 | | 6 | 0b1000 | | 7 | 0b1001 | These binary numbers can be represented as an array in the code. ### Step 3: Write the function as short as possible
1 2 3 4 5 6 7 8 9 10 11 | void stepper(int xw) { int states[] = {0b0001, 0b0011, 0b0010, 0b0110, 0b0100, 0b1100, 0b1000, 0b1001}; int Steps = 0; for (int x = 0; x < xw; x++) { digitalWrite(1, (states[Steps] >> 3) & 1); digitalWrite(2, (states[Steps] >> 2) & 1); digitalWrite(3, (states[Steps] >> 1) & 1); digitalWrite(4, states[Steps] & 1); Steps = (Steps + 1) % 8; } } |
1 2 3 4 5 6 7 8 9 10 | void stepper(int xw) { int states[] = {0b0001, 0b0011, 0b0010, 0b0110, 0b0100, 0b1100, 0b1000, 0b1001}; int Steps = 0; for (int x = 0; x < xw; x++) { for (int i = 1; i <= 4; i++) { digitalWrite(i, (states[Steps] >> (4 - i)) & 1); } Steps = (Steps + 1) % 8; } } |
1 2 3 4 5 6 7 8 9 10 | void stepper(int xw) { int s[] = {0b0001, 0b0011, 0b0010, 0b0110, 0b0100, 0b1100, 0b1000, 0b1001}; int i = 0; while(xw--) { for (int p = 1; p <= 4; p++) { digitalWrite(p, (s[i] >> (4 - p)) & 1); } i = (i + 1) % 8; } } |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 | #include <Arduino.h> void stepper(int xw) { int s[] = {0b0001, 0b0011, 0b0010, 0b0110, 0b0100, 0b1100, 0b1000, 0b1001}; int i = 0; while(xw--) { for (int p = 1; p <= 4; p++) { digitalWrite(p, (s[i] >> (4 - p)) & 1); } i = (i + 1) % 8; } } |
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 33 34 35 36 37 38 39 40 | #include <Arduino.h> void stepper(int xw) { int s[] = {0b0001, 0b0011, 0b0010, 0b0110, 0b0100, 0b1100, 0b1000, 0b1001}; int i = 0; while(xw--) { for (int p = 1; p <= 4; p++) { digitalWrite(p, (s[i] >> (4 - p)) & 1); } i = (i + 1) % 8; } } #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"); } |
main.c:2:10: fatal error: Arduino.h: No such file or directory
2 | #include <Arduino.h>
| ^~~~~~~~~~~
compilation terminated.
main.sh: line 2: ./a.out: No such file or directory
Testing if the previous output contains the string All tests passed
: False
Resulting in output: True