unsigned long const onTime {100};  // Microseconds.
size_t const strobes {200};

uint8_t const outPins[] {5, 4, 3, 2};
uint8_t const inPins[] {9, 8, 7, 6};


void blink(size_t const i, size_t const j) {
  digitalWrite(outPins[i], HIGH);
  digitalWrite(inPins[j], LOW);
  delayMicroseconds(onTime);
  digitalWrite(inPins[j], HIGH);
  digitalWrite(outPins[i], LOW);
}

void strobe(size_t const bitmap) {
  for (size_t i {0}; i < strobes; i++) {
    for (size_t j {0}; j < sizeof(outPins) * sizeof(inPins); j++) {
      if (bitmap >> j & 1) {
        blink(j % sizeof(outPins), j / sizeof(inPins));
      }
      else {
        delayMicroseconds(onTime);
      }
    }
  }  
}

void setup() {
  for (uint8_t const& pin: outPins) {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, LOW);
  }
  for (uint8_t const& pin: inPins) {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, HIGH);
  }
}

void loop() {
  for (size_t i {0}; i < pow(2, sizeof(outPins) * sizeof(inPins)); i++) {
    strobe(i);
  }
}