javascript矩阵操作不起作用

javascript matrix manipulation is not working

本文关键字:不起作用 操作 javascript      更新时间:2023-09-26

这是"代码的出现"中问题的错误编码解决方案:问题的链接

我不知道原因,因为我的代码工作不正常,我有一个与正则表达式有关的错误,因为我没有重置regexp对象的指针,现在我想这个错误已经修复了,但据我所知,我做得不好。

问题是我的代码显示的解决方案不正确,你可以在我提供的链接上提交解决方案,并获得你的解决方案的反馈。

正确的解决方案:543903给定解决方案:418954

// day 6 of advent of code
var input = "removed, take from problem";
function processInput(input, matrix) {
  var linesOfInput = input.split("'n");
  var matches;
  var turnOnRE = /turn on ('d+),('d+).*?('d+),('d+)/g;
  var turnOffRE = /turn off ('d+),('d+).*?('d+),('d+)/g;
  var toggleRE = /toggle ('d+),('d+).*?('d+),('d+)/g;
  // regular expression objects lastIndex property must be 'reseted' in order to work well
  for (var i = 0 ; i < linesOfInput.length; i++) {
    turnOnRE.lastIndex = 0;
    turnOffRE.lastIndex = 0;
    toggleRE.lastIndex = 0;
    matches = turnOnRE.exec(linesOfInput[i]);
    if (matches != null) {
      manipulateLights(matrix, matches[1], matches[2], matches[3], matches[4], true);
      continue;
    }
    matches = turnOffRE.exec(linesOfInput[i]);
    if (matches != null) {
      manipulateLights(matrix, matches[1], matches[2], matches[3], matches[4], false);
      continue;
    }
    matches = toggleRE.exec(linesOfInput[i]);
    manipulateLights(matrix, matches[1], matches[2], matches[3], matches[4]);
  }
}
function manipulateLights(matrix, startI, startJ, endI, endJ, newValue) {
  if (newValue == undefined) { // toogle
    for (var i = startI ; i <= endI; i++) {
      for (var j = startJ ; j <= endJ; j++) {
        matrix[i][j] = !matrix[i][j];
      }
    }
    console.log(startI, startJ, endI, endJ, newValue);
  } else {
    for (var i = startI ; i <= endI; i++) {
      for (var j = startJ ; j <= endJ; j++) {
        matrix[i][j] = newValue;
      }
    }
    console.log(startI, startJ, endI, endJ, newValue);
  }
  console.log(countTurnedOnLights(matrix));
}
function countTurnedOnLights(matrix) {
  var turnedOn = 0;
  for (var i = 0 ; i < matrixWidth; i++) {
    for (var j = 0 ; j < matrixHeigth; j++) {
      if (matrix[i][j] == true) {
        turnedOn++;
      }
    }
  }
  return turnedOn;
}
var matrixHeigth = 1000;
var matrixWidth = 1000;
// define a bidimensional array, is almost like in C++
var lightMatrix = new Array(matrixWidth);
for (var i = 0 ; i < matrixWidth; i++) {
  lightMatrix[i] = new Array(matrixHeigth);
}
// turn off all lights
for (var i = 0 ; i < matrixWidth; i++) {
  for (var j = 0 ; j < matrixHeigth; j++) {
    lightMatrix[i][j] = false;
  }
}
processInput(input, lightMatrix);
console.log(countTurnedOnLights(lightMatrix));

好的,我发现了错误——当你第一次创建for循环时,正则表达式匹配被视为字符串。

for (var i = startI ; i <= endI; i++) {
    for (var j = startJ ; j <= endJ; j++) {

当你打出756,53到923339这样的组合时,它会认为53>339,然后立即退出循环。在for循环中,用Number()包装每个"start"变量,或者在传递参数时这样做。