JSFiddle - React, Tailwind, and code Playground

by Andrew Maxwell

JavaScript

/*

Start at state 0.
If the first element of the input is 0, go to state 0, else go to state 1
Do this for the rest of the input
If you end up on state 0, then the input is a binary number that is divisible by 7

*/
const constructDivisibilityDFA = (num) =>
  [...Array(num).keys()].map((i) => [(i * 2) % num, (i * 2 + 1) % num]);

const dfaAccepts = (dfa, [first, ...rest], s = 0) =>
  first ? dfaAccepts(dfa, rest, dfa[s][first]) : s === 0;

const dfa = constructDivisibilityDFA(7);

for (let i = 0; i < 100; i++) {
  const binaryString = i.toString(2);
  console.log(i, binaryString.padStart(10), dfaAccepts(dfa, binaryString));
}