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; } } |
Looking at the original code, I notice it's controlling 4 pins in 8 different sequence steps. Let me first create a table of what's being written to each pin: | Step | Pin 1 | Pin 2 | Pin 3 | Pin 4 | Decimal | |------|-------|-------|-------|-------|---------| | 0 | 0 | 0 | 0 | 1 | 1 | | 1 | 0 | 0 | 1 | 1 | 3 | | 2 | 0 | 0 | 1 | 0 | 2 | | 3 | 0 | 1 | 1 | 0 | 6 | | 4 | 0 | 1 | 0 | 0 | 4 | | 5 | 1 | 1 | 0 | 0 | 12 | | 6 | 1 | 0 | 0 | 0 | 8 | | 7 | 1 | 0 | 0 | 1 | 9 | I can represent each step with a single number where each bit represents a pin state. Then I can set all pins by bit-shifting this number! First attempt:
1 2 3 4 5 6 7 8 9 10 | void stepper(int xw) { static const int p[] = {1, 3, 2, 6, 4, 12, 8, 9}; for (int x = 0; x < xw; x++) { int s = p[x % 8]; digitalWrite(1, (s >> 3) & 1); digitalWrite(2, (s >> 2) & 1); digitalWrite(3, (s >> 1) & 1); digitalWrite(4, s & 1); } } |
1 2 3 4 5 6 7 8 9 | void stepper(int xw) { static const int p[] = {1, 3, 2, 6, 4, 12, 8, 9}; for (int x = 0; x < xw; x++) { digitalWrite(1, (p[x % 8] >> 3) & 1); digitalWrite(2, (p[x % 8] >> 2) & 1); digitalWrite(3, (p[x % 8] >> 1) & 1); digitalWrite(4, p[x % 8] & 1); } } |
1 2 3 4 5 6 7 8 9 10 | void stepper(int xw){ static const int p[]={1,3,2,6,4,12,8,9}; for(int x=0;x<xw;x++){ int v=p[x%8]; digitalWrite(1,v>>3&1); digitalWrite(2,v>>2&1); digitalWrite(3,v>>1&1); digitalWrite(4,v&1); } } |
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){ static const int p[]={1,3,2,6,4,12,8,9}; for(int x=0;x<xw;x++){ int v=p[x%8]; digitalWrite(1,v>>3&1); digitalWrite(2,v>>2&1); digitalWrite(3,v>>1&1); digitalWrite(4,v&1); } } |
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){ static const int p[]={1,3,2,6,4,12,8,9}; for(int x=0;x<xw;x++){ int v=p[x%8]; digitalWrite(1,v>>3&1); digitalWrite(2,v>>2&1); digitalWrite(3,v>>1&1); digitalWrite(4,v&1); } } #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
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; } } |
# Code Golf Solution First, I'll map the digital writes to a pattern:
1 2 3 4 5 6 7 8 9 10 | Step | Pin 1 | Pin 2 | Pin 3 | Pin 4 | Binary | Decimal -----|-------|-------|-------|-------|--------|-------- 0 | 0 | 0 | 0 | 1 | 0001 | 1 1 | 0 | 0 | 1 | 1 | 0011 | 3 2 | 0 | 0 | 1 | 0 | 0010 | 2 3 | 0 | 1 | 1 | 0 | 0110 | 6 4 | 0 | 1 | 0 | 0 | 0100 | 4 5 | 1 | 1 | 0 | 0 | 1100 | 12 6 | 1 | 0 | 0 | 0 | 1000 | 8 7 | 1 | 0 | 0 | 1 | 1001 | 9 |
1 2 3 4 5 6 7 8 9 10 | void stepper(int xw){ static const byte p[]={1,3,2,6,4,12,8,9}; for(int x=0;x<xw;x++){ byte v=p[x&7]; digitalWrite(1,v>>3&1); digitalWrite(2,v>>2&1); digitalWrite(3,v>>1&1); digitalWrite(4,v&1); } } |
1 | void stepper(int xw){static const byte p[]={1,3,2,6,4,12,8,9};for(int x=0;x<xw;x++){byte v=p[x&7];digitalWrite(1,v>>3&1);digitalWrite(2,v>>2&1);digitalWrite(3,v>>1&1);digitalWrite(4,v&1);}} |
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){ static const byte p[]={1,3,2,6,4,12,8,9}; for(int x=0;x<xw;x++){ byte v=p[x&7]; digitalWrite(1,v>>3&1); digitalWrite(2,v>>2&1); digitalWrite(3,v>>1&1); digitalWrite(4,v&1); } } |
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){ static const byte p[]={1,3,2,6,4,12,8,9}; for(int x=0;x<xw;x++){ byte v=p[x&7]; digitalWrite(1,v>>3&1); digitalWrite(2,v>>2&1); digitalWrite(3,v>>1&1); digitalWrite(4,v&1); } } #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