JavaScript

У меня получилось очень длинное решение, хочу посмотреть как можно решить короче, как ее решают уже бывалые) спасибо

Ваша программа должна получить два параметра из командной строки:
- строка размера N ^ 2, описывающая квадратную матрицу символов N * N;
- строка, описывающая данное слово.
Первая строка преобразуется в матрицу по следующему правилу. Строка «QWEASDZXC» образует матрицу:
['Q', 'W', 'E',
'A', 'S', 'D',
'Z', 'X', 'C']
Ваша программа должна вывести на консоль последовательность ячеек, из которых состоит данное слово.
Каждый следующий символ слова может быть помещен прямо в соседнюю ячейку: вверху, внизу, слева или справа от ячейки с предыдущим символом.
Например. если задана матрица «QLGNAEKIRLRNGEAE» и слово «KING», то последовательность ячеек будет [1,2] -> [1,3] -> [0,3] -> [0,2]
такой любитель говнокода как я, сделал бы так
function f(x){
let a=x.split('');
const b='QLGNAEKIRLRNGEAE'.split('');
return a.map(k=>{let y=b.indexOf(k); s=Math.sqrt(b.length)|0; return [y/s|0,y%s]});
}
console.log(f('KING'));
//0: (2) [1, 2]
//1: (2) [1, 3]
//2: (2) [0, 3]
//3: (2) [0, 2]
Влад Волков
Влад Волков
20 274
Лучший ответ
Серёга;) <=Астахов=> Спасибо за краткое решение, модно ещё вопрос, как отследить что следующий элемент находится левее, правее, выше, или ниже предыдущего а если цепочки нет то вывести нет цепочки
тупо, примитивно, работает по вашим условиям, был более заумный вариант но там indexOf может быть вызван 'QLGNAEKIRLRNGEAE'.length раз в худшем случае (хотя он вроде ++), можно былоб лимитировать (ито двойной корень был бы) но увы не шарпы и indexOf не умеет в count, так что решил проверять известные валидные позиции

(function(m, w) {
let sr = Math.sqrt(m.length); if (sr != (sr|0)) return 'invalid matrix';
m = m.split(''); w = w.split('');
let mli = m.length, lli = sr - 1;
let i, x, y, cp, lp, rslt = '';

if ((lp = m.indexOf(w[0])) < 0) return 'char not found';
rslt = `[${y = (lp / sr)|0}:${x = lp % 4}]`;
for (i = 1; i < w.length; ++i)
{
if ((cp = lp - sr) >= 0 && m[cp] == w[i]) rslt += ` => [${--y}:${x}]`;
else if ((cp = lp + sr) < mli && m[cp] == w[i]) rslt += ` => [${++y}:${x}]`;
else if (x > 0 && m[(cp = lp - 1)] == w[i]) rslt += ` => [${y}:${--x}]`;
else if (x < lli && m[(cp = lp + 1)] == w[i]) rslt += ` => [${y}:${++x}]`;
else return 'path not found'; lp = cp;
}
return rslt;
})('QLGNAEKIRLRNGEAE', 'KING')

!ахтунг - мыло вставляет свои пять копеек! убрать пробелы между $ и {
Олег Копылов
Олег Копылов
5 038