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',...