DEV Community

Cover image for Road to Genius: superior #60
Ilya Nevolin
Ilya Nevolin

Posted on

Road to Genius: superior #60

Each day I solve several coding challenges and puzzles from Codr's ranked mode. The goal is to reach genius rank, along the way I explain how I solve them. You do not need any programming background to get started, and you will learn a ton of new and interesting things as you go.

Our good old friend Gauss Jordan is is back!

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) 
Enter fullscreen mode Exit fullscreen mode

We need to fix three bugs to complete this challenge. The first bug ๐Ÿผ is a variable which is used to get the length from, so it must be an array, likely m because its value is assigned to variable h (meaning height); we make this assumption because its neighboring declaration is w = m[0].length (~ width). Since m is a 2D JavaScript array, and w = m[0].length then h = m.length; ๐Ÿผ is likely to be m.

The next bug is on the following line:

m[y2][x] -= m[โ˜ƒ๏ธ][x] * m[y2][y] / c; 
Enter fullscreen mode Exit fullscreen mode

This piece of code is part of a triple while-loop is related to eliminating variables (~ solving them). I know that โ˜ƒ๏ธ should be y because I remember it from the previous time we encountered Gauss Jordan. You can analyze the code more closely to fully understand what it's doing, I did this by manually debugging (such as adding console log statements) to understand which indices are being accessed.

The final bug is tricky but easy:

 m[y][y] /= c; x = h - 1; while (++x < w) { m[y][x] ๐Ÿ˜ˆ c; } 
Enter fullscreen mode Exit fullscreen mode

We know that ๐Ÿ˜ˆ should be an operator, but which? Fortunately the first line of the code reveals that it should be /= as well. Feel free to dig deeper to understand why, if you're curious that is.

coding challenge answer

By solving these challenges you train yourself to be a better programmer. You'll learn newer and better ways of analyzing, debugging and improving code. As a result you'll be more productive and valuable in business. Get started and become a certified Codr today at https://nevolin.be/codr/

Top comments (0)