[Solved] 02.Bunny Kill Не мога да си намеря проблема
Гледах видеото от 07/10/2016, където Иво я решава и не ми помага да си разбера проблема. Мога да копирам неговия код - но къде е смисъла в това? Освен това, ако изключим резултата, смятам, че моя подход е по-готин. Ето какво съм направил :
function bunnyKill(input) {
    let matrix = [];
    let bombsIndex = input.pop().split(' ');
    input.forEach(line => matrix.push(line.split(' ').map(Number)));
    for (let bombIndex of bombsIndex) {
        let [bombRow, bombCol] = bombIndex.split(',').map(Number);
        let damage = matrix[bombRow][bombCol];
        for (let row = 0, n = matrix.length; row < n; row++) {
            for (let col = 0, m = matrix[row].length; col < m; col++) {
                if ((Math.abs(row - bombRow) <= 1 && Math.abs(col - bombCol) <= 1) && (col !== bombCol || row !== bombRow)) {
                    matrix[row][col] = Math.max(0, matrix[row][col] - damage);
                }
            }
        }
    }
    let sum = 0,
        counter = 0;
    for (let row of matrix) {
        for (let col of row) {
            sum += col;
            if (col > 0) {
                counter++;
            }
        }
    }
    console.log(sum);
    console.log(counter);
    // for (let row = 0; row < matrix.length; row++) {
    //     let str = '';
    //     for (let col = 0; col < row.length; col++) {
    //         if (matrix[row][col].toString().length === 1) {
    //             str += '  ' + matrix[row][col];
    //         } else {
    //             str += ' ' + matrix[row][col];
    //         }
    //     }
    //     console.log(str);
    // }
}
Закоментирания цикъл някарая има за цел да принтира матрицата с подравнени колони, за да се вижда по-лесно. Това, което ми харесва в този подход е, че след като минат бомбите в матрицата остават стйности x == 0 или x > 0. Тоест единственото, което остава е да сумираме матрицата с два цикъла и където има жив заек ( x > 0 ) да увеличаваме counter. Основната разлика в кода е, че аз обхождам матрицата и ползвам разликата между индексите на всяка клетка спрямо индексите на бомбите, а Иво си написа функция, която обхожда всяка клетка около бомбата ( във всички посоки ) и после за да не излиза извън матрицата, си написа втора функция, която да държи стойностите от първата функция в границите на матрицата.
Edit: Оказва се, че ако има две бомби една до друга може да възникне следния проблем - първата гърми, но не убива втората. Дотук - добре, но когато втората бомба се взриви убива или нанася щети на първата и така се губят от точките на Сноубоу. Проблема се решава като към damage-а на Сноубоу се добавят убийствата на бомбите и се нулира стойноста на кетката, още при проверката.
If-a си работи. Представлява алгоритъм, с който намираш околните клетки, вместо да обикаляш всяка клетка, една по една и да проверяваш дали клетките са в матрицата, или извън. Общо взето гледаш разстоянието между бомбата и всяка клетка. Ако е <= 1, коригираш стойностите. Проблема беше в реда, защото ако има две бомби, първата удари втората, но не я убие и втората избухне може да убие първата, което не се брои за Сноубоу. Коригирах го. Обновявам въпроса. Мерси за отговора :)