JSFiddle - React, Tailwind, and code Playground

by jrab227

JavaScript

class FSA {
	constructor(inputString) {
  	this.matrix = new Map();
    let i = 0;
    while (i < inputString.length-1) {
    	this.matrix.set(i, { symbol: inputString[i+1], position: i+1})
      i++;
    }
    this.finalState = i;
    this.matrix.set(i, { symbol: inputString[0], position: 0 });
    this.matrix.set("BEGIN", { symbol: inputString[0], position: 0 });
  }
  
  available(char) {
  	return this.matrix.get(char);
  }
}

class NDFAPair {
	constructor(x, y) {
  	this.instances = [];
    this.x = new FSA(x);
    this.y = new FSA(y)
    this.instances.push({
    	x: "BEGIN",
      y: "BEGIN",
      assignment: "",
      assignmentX: "",
      assignmentY: ""
    });
  }
  transition(character) {
  	if (this.instances.length === 0) return false;
  	let newInstances = [];
  	for (let instance of this.instances) {
    	let availableX = this.x.available(instance.x);
      let availableY = this.y.available(instance.y);
      if (availableX && availableX.symbol === character) {
        newInstances.push({
        	x: availableX.position,
          y: instance.y,
          assignment: instance.assignment + "x",
          assignmentX: instance.assignmentX + character,
          assignmentY: instance.assignmentY + 'y',
        });
      }
      if (availableY && availableY.symbol === character) {
        newInstances.push({
        	y: availableY.position,
          x: instance.x,
          assignment: instance.assignment + "y",
          assignmentX: instance.assignmentX + 'x',
          assignmentY: instance.assignmentY + character,
        });
      }
    }
    this.instances = newInstances;
    return true;
  }
  
  run(testString) {
  	for (let character of testString.split("")) {
    	if (!this.transition(character)) return false
    }
    return (this.instances.length > 0) && 
      this.instances.filter((instance) => (
        this.x.finalState === instance.x && this.y.finalState === instance.y
      ));
  }
}

let test = new NDFAPair('1101001',...