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; } } |
We discovered that the eight “steps” can be described by these 4‐bit values (for pins 1–4): Step 0: (0,0,0,1) → 1 Step 1: (0,0,1,1) → 3 Step 2: (0,0,1,0) → 2 Step 3: (0,1,1,0) → 6 Step 4: (0,1,0,0) → 4 Step 5: (1,1,0,0) → 12 Step 6: (1,0,0,0) → 8 Step 7: (1,0,0,1) → 9 But instead of using a lookup table, we can “decode” these numbers into four expressions: • digitalWrite(1,…) is 1 when steps 5–7 (i.e. when s>4) • digitalWrite(2,…) is 1 when s is 3–5 (i.e. when s>2 && s<6) • digitalWrite(3,…) is 1 when s is 1–3 (i.e. when s>0 && s<4) • digitalWrite(4,…) is 1 when s is 0,1, or 7 (i.e. when s<2 || s==7) Since in C the relational operators yield 0 or 1 we can simply use these expressions. (Note that s==7 and 7==s are the same.) Then we just loop xw times, updating s cyclically (using s=(s+1)&7). One acceptable final, under‑300‑byte, golfed answer is: ------------------------------------------------ void stepper(int xw){int s=0;while(xw--){digitalWrite(1,s>4);digitalWrite(2,s>2&&s<6);digitalWrite(3,s>0&&s<4);digitalWrite(4,s<2||7==s);s=(s+1)&7;}} ------------------------------------------------ This is our final answer.
I extracted the following code from that output:
1 2 3 | #include <Arduino.h> void stepper(int xw){int s=0;while(xw--){digitalWrite(1,s>4);digitalWrite(2,s>2&&s<6);digitalWrite(3,s>0&&s<4);digitalWrite(4,s<2||7==s);s=(s+1)&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 | #include <Arduino.h> void stepper(int xw){int s=0;while(xw--){digitalWrite(1,s>4);digitalWrite(2,s>2&&s<6);digitalWrite(3,s>0&&s<4);digitalWrite(4,s<2||7==s);s=(s+1)&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"); } |
main.c:1:10: fatal error: Arduino.h: No such file or directory
1 | #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; } } |
The idea was to notice that in each case we write four bits whose value (when read as a binary number with bit 3 the value for pin 1, bit 2 for pin 2, bit 1 for pin 3, and bit 0 for pin 4) is: Step 0: 0001 → 1 Step 1: 0011 → 3 Step 2: 0010 → 2 Step 3: 0110 → 6 Step 4: 0100 → 4 Step 5: 1100 → 12 Step 6: 1000 → 8 Step 7: 1001 → 9 So one may build an array: int t[]={1,3,2,6,4,12,8,9} and on each step use bit‐masking to set the pins. (Note that s=(s+1)&7 is the same as (s+1)%8 since 8 is a power of two.) Below is one acceptable golfed final answer (any answer with equivalent functionality and under 300 bytes is correct): ------------------------------------------------ Final answer: void stepper(int xw){for(int s=0,t[]={1,3,2,6,4,12,8,9};xw--;s=(s+1)&7) {digitalWrite(1,t[s]&8?1:0);digitalWrite(2,t[s]&4?1:0);digitalWrite(3,t[s]&2?1:0);digitalWrite(4,t[s]&1?1:0);}} ------------------------------------------------ Explanation: • We create an array t with the eight 4‐bit patterns. • In a for–loop we run xw times, and at each step we write each bit to the proper pin (using the correct bit–mask) and then increment the index (wrapping with &7). This is our final answer.
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 | #include <Arduino.h> void stepper(int xw){ for(int s=0, t[]={1,3,2,6,4,12,8,9}; xw--; s=(s+1)&7){ digitalWrite(1, t[s]&8?1:0); digitalWrite(2, t[s]&4?1:0); digitalWrite(3, t[s]&2?1:0); digitalWrite(4, t[s]&1?1:0); } } |
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 | #include <Arduino.h> void stepper(int xw){ for(int s=0, t[]={1,3,2,6,4,12,8,9}; xw--; s=(s+1)&7){ digitalWrite(1, t[s]&8?1:0); digitalWrite(2, t[s]&4?1:0); digitalWrite(3, t[s]&2?1:0); digitalWrite(4, t[s]&1?1:0); } } #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:1:10: fatal error: Arduino.h: No such file or directory
1 | #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