Как пройти матрицу функционально в JavaScript ES6? - PullRequest
0 голосов
/ 08 января 2020

Вот мой код для участия в конкурсе «Лестница» на Hackerrank:

function staircase(n) {
    // fill() fills out `undefined` items, which helps to initiate new n*n matrix 
    let matrix = Array(n).fill().map(() => Array(n).fill());

    matrix.forEach((curArr, idY) => {
        curArr.forEach((curVal, idX) => {
            curVal = (idX + idY + 1 >= n) ? '#' : ' ';
            process.stdout.write(curVal);
        }, [])
        console.log();
    }, []);
}

Когда я тестировал с staircase(6), я получил ожидаемый результат:

     #
    ##
   ###
  ####
 #####
######

Однако, когда я изменяю код для проверки matrix следующим образом:

function staircase(n) {
    // fill() fills out `undefined` items, which helps to initiate new n*n matrix 
    let matrix = Array(n).fill().map(() => Array(n).fill());

    matrix.forEach((curArr, idY) => {
        curArr.forEach((curVal, idX) => {
            curVal = (idX + idY + 1 >= n) ? '#' : ' ';
        }, [])
    }, []);

    console.log(matrix);
}

Вот что я получаю:

[ [ undefined, undefined, undefined, undefined, undefined, undefined ],
  [ undefined, undefined, undefined, undefined, undefined, undefined ],
  [ undefined, undefined, undefined, undefined, undefined, undefined ],
  [ undefined, undefined, undefined, undefined, undefined, undefined ],
  [ undefined, undefined, undefined, undefined, undefined, undefined ],
  [ undefined, undefined, undefined, undefined, undefined, undefined ] ]

Итак, мои вопросы:

  1. Почему matrix не изменяется?
  2. Существуют ли чисто функциональные способы решения этой проблемы (т. Е. С использованием только map()?)

Ответы [ 3 ]

1 голос
/ 08 января 2020

Я бы так и сделал.

const array = (length, lookup) => Array.from({ length }, (_, i) => lookup(i));

const string = (separator, length, lookup) => array(length, lookup).join(separator);

const staircase = n =>
    console.log(
        string("\n", n, i =>
            string("", n, j =>
                i + j < n - 1 ? ' ' : '#')));

staircase(9);

Помимо console.log, функция staircase является чистой.

0 голосов
/ 08 января 2020

Основная задача вашего упражнения - решить, печатать ли # или пустое пространство ... на основе разницы между индексом столбца и индексом строки (j >= i).

const staircase = (length) => Array.from({ length }, (_, x) => 
  Array.from({ length }, (_, y) => y >= length - 1 - x ? '#' : ' ').join('')
)
  .join('\n');


console.log(
  staircase(10),
);

в вашем примере:

    matrix.forEach((curArr, idY) => {
        curArr.forEach((curVal, idX) => {
            curVal = (idX + idY + 1 >= n) ? '#' : ' ';
        }, [])
    }, []);

, как указано другими, вы не можете напрямую изменить curVal, так как он не передается по ссылке попробуйте использовать Array#map вместо:

curArr.map((curVal, idX) => 'somethingElse')
0 голосов
/ 08 января 2020
  1. причина проблемы

curVal - это тип значения, а не ссылочный тип. Значение в matrix не изменяется, поскольку curVal является просто копией.

одно решение: измените curVal = (idX + idY + 1 >= n) ? '#' : ' '; на matrix[idY][idX] = (idX + idY + 1 >= n) ? '#' : ' '

использование map
[...Array(n).keys()].map((ignore, y)=>[...Array(n).keys()].map((ignore, x)=>(x+y+2>n)?'#':' '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...