Каждый день я решаю несколько задач по программированию и головоломок из рейтингового режима 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/