// Parses the input string for the numerators and denominators
function compile(prog, numArr, denArr) {
let regex = /\s*(\d*)\s*\/\s*(\d*)\s*(.*)/m;
let result;
while (result = regex.exec(prog)) {
numArr.push(result[1]);
denArr.push(result[2]);
prog = result[3];
}
return [numArr, denArr];
}
// Outputs the result of the compile stage
function dump(numArr, denArr) {
let output = "";
for (let i in numArr) {
output += `${numArr[i]}/${denArr[i]} `;
}
return `${output}
`;
}
// Step
function step(val, numArr, denArr) {
let i = 0;
while (i < denArr.length && val % denArr[i] != 0) i++;
return numArr[i] * val / denArr[i];
}
// Executes Fractran
function exec(val, i, limit, numArr, denArr) {
let output = "";
while (val && i < limit) {
output += `${i}: ${val}
`;
val = step(val, numArr, denArr);
i++;
}
return output;
}
// Main
// Outputs to DOM (clears and writes at the body tag)
let body = document.body;
let [num, den] = compile("17/91 78/85 19/51 23/38 29/33 77/29 95/23 77/19 1/17 11/13 13/11 15/14 15/2 55/1", [], []);
body.innerHTML = dump(num, den);
body.innerHTML += exec(2, 0, 15, num, den);