Каждый день я решаю несколько задач по программированию и головоломок из рейтингового режима Codr. Цель - достичь звания гения, попутно объясняю, как их решаю. Для начала вам не нужен опыт программирования, и вы узнаете массу нового и интересного по ходу дела.

Наш старый добрый друг Гаусс Джордан вернулся!

function gaussjordan(m, eps) {
  if (!eps)
    eps = 1e-10;
  let h = 🐼.length, w = m[0].length, y = -1, y2, x;
  while (++y < h) {
    let maxrow = y;
    y2 = y;
    while (++y2 < h) {
      if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))
        maxrow = y2;
    }
    let tmp = m[y];
    m[y] = m[maxrow];
    m[maxrow] = tmp;
    if (Math.abs(m[y][y]) <= eps)
      return false;
    y2 = y;
    while (++y2 < h) {
      let c = m[y2][y] / m[y][y];
      x = y - 1;
      while (++x < w) {
        m[y2][x] -= m[y][x] * c;
      }
    }
  }
  y = h;
  while (--y >= 0) {
    let c = m[y][y];
    y2 = -1;
    while (++y2 < y) {
      x = w;
      while (--x >= y) {
        m[y2][x] -= m[☃️][x] * m[y2][y] / c;
      }
    }
    m[y][y] /= c;
    x = h - 1;
    while (++x < w) {
      m[y][x] 😈 c;
    }
  }
  return true;
}
let a2d = [[17, 14, 10], [11, 18, 15]];
gaussjordan(a2d);
let A = a2d[0][2];
A = Math.floor(A * 100);
A = Math.abs(A);
// 😈 = ? (operator)
// ☃️ = ? (identifier)
// 🐼 = ? (identifier)
// such that A = 20 (number)

Чтобы выполнить эту задачу, нам нужно исправить три ошибки. Первая ошибка 🐼 - это переменная, которая используется для получения length, поэтому это должен быть массив, вероятно, m, потому что его значение присваивается переменной h (что означает высоту); мы делаем это предположение, потому что его соседнее объявление - w = m[0].length (~ ширина). Поскольку m - это 2D-массив JavaScript, а w = m[0].length, тогда h = m.length; 🐼 скорее всего будет m.

Следующая ошибка находится в следующей строке:

m[y2][x] -= m[☃️][x] * m[y2][y] / c;

Этот фрагмент кода является частью тройного цикла while, связанного с удалением переменных (~ их решением). Я знаю, что ☃️ должно быть y, потому что я помню это из предыдущего раза, когда мы встречались с Гауссом Джорданом. Вы можете более внимательно проанализировать код, чтобы полностью понять, что он делает. Я сделал это вручную, отладив (например, добавив операторы журнала консоли), чтобы понять, к каким индексам осуществляется доступ.

Последняя ошибка сложна, но проста:

m[y][y] /= c;
    x = h - 1;
    while (++x < w) {
      m[y][x] 😈 c;
    }

Мы знаем, что 😈 должен быть оператором, но какой? К счастью, первая строка кода показывает, что это тоже должно быть /=. Не стесняйтесь копать глубже, чтобы понять, почему, если вам это интересно.

Решая эти задачи, вы становитесь лучшим программистом. Вы узнаете новые и лучшие способы анализа, отладки и улучшения кода. В результате вы станете более продуктивным и ценным в бизнесе. Начните работу и станьте сертифицированным Codr сегодня на https://nevolin.be/codr/