Skip to content

Commit

Permalink
Resolução desafio 10 por Valdinei Junior (#979)
Browse files Browse the repository at this point in the history
* Resolução desafio 10 por Valdinei Junior

* corrigindo mensagem de erro
  • Loading branch information
ValdineiJunior authored Jul 16, 2023
1 parent 87f87c4 commit 4999baa
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
1 change: 1 addition & 0 deletions desafio-10/valdineijunior/javascript/.valid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1a89166e6ba0a8c58b124c73dc0146e91
93 changes: 93 additions & 0 deletions desafio-10/valdineijunior/javascript/turing.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
const fs = require("fs");

function processFile(filename) {
const rulesAndInputFile = fs.readFileSync(filename, "utf8");
let rulesAndInput = "";
if ((/(\r)/.test(rulesAndInputFile))) {
rulesAndInput = rulesAndInputFile.split("\r\n");
} else {
rulesAndInput = rulesAndInputFile.split("\n");
}
rulesAndInput.pop();

for (const line of rulesAndInput) {
const [rulesFilePath, input] = line.split(",");
const rules = filteredRules(rulesFilePath);
turningMachine(rulesFilePath, rules, input);
}
}

function filteredRules(rulesFileName) {
const fileRules = fs.readFileSync(rulesFileName, "utf-8").split("\n");
const filteredLines = fileRules
.filter(line => line.trim() !== "" && !line.startsWith(";"))
.map(line => {
const lineWithoutComments = line.split(";")[0].trim();
const [currentState, currentSymbol, newSymbol, direction, newState] = lineWithoutComments.split(" ");
return { currentState, currentSymbol, newSymbol, direction, newState };
});

return filteredLines;
}

function turningMachine(rulesFilePath, rules, input) {
const tape = (input.replace(" ", "_").split(""));
let currentState = "0";
let tapePosition = 0;
while (true) {
const currentSymbol = tape[tapePosition];
const selectedRule = findRule(currentState, currentSymbol, rules);
const stateAndSymbolCombinationNotFound = selectedRule === null;
if (stateAndSymbolCombinationNotFound) {
console.log(`${rulesFilePath},${input},ERR`);
return;
}
const symbolNeedsToBeReplaced = selectedRule.newSymbol !== "*";
if (symbolNeedsToBeReplaced) {
tape[tapePosition] = selectedRule.newSymbol;
}
if (selectedRule.newState.startsWith("halt")) {
console.log(`${rulesFilePath},${input},${tape.join("").replace(/_/g, " ").trim()}`);
return;
}
if (selectedRule.direction === "r") {
tapePosition++;
if (tapePosition >= tape.length) {
tape.push("_");
}
} else if (selectedRule.direction === "l") {
tapePosition--;
if (tapePosition < 0) {
tape.unshift("_");
tapePosition = 0;
}
}
currentState = selectedRule.newState;
}
}

function findRule(state, symbol, rules) {
for (let i = 0; i < rules.length; i++) {
if (rules[i].currentState === state && rules[i].currentSymbol === symbol) {
return { ...rules[i] };
}
}

for (let i = 0; i < rules.length; i++) {
if ((rules[i].currentState === state || rules[i].currentState === "*") && (rules[i].currentSymbol === symbol || rules[i].currentSymbol === "*")) {
return { ...rules[i] };
}
}

return null;
}

const filename = process.argv[2];

if (!filename) {
console.log("Nenhum argumento foi passado.");
console.log("Exemplo de uso: node turing.js datafile");
process.exit(1);
}

processFile(filename);

0 comments on commit 4999baa

Please sign in to comment.