Привет, я борюсь с копированием массива в середину другого большего массива. Я не вижу причин, по которым это не должно работать, даже если индикаторы верны. Это для https://adventofcode.com/2020/day/17. Они просят 3D-массив, но мне нужно сначала решить его с 2D-массивом.
У меня есть пустой массив, например
[
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ]
]
и небольшой массив
[
[ 'X', '#' ],
[ '#', 'X' ]
]
и моя цель - поместить маленький массив в середину большого пустого, вот так
[
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', 'X','#', '', ''],
[ '', '', '#','X', '', ''],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ]
]
но я получаю
[
[ '', '', '#', 'X', '', '' ],
[ '', '', '#', 'X', '', '' ],
[ '', '', '#', 'X', '', '' ],
[ '', '', '#', 'X', '', '' ],
[ '', '', '#', 'X', '', '' ],
[ '', '', '#', 'X', '', '' ]
]
Мой код
let square = [ [ 'X', '#' ], [ '#', 'X' ] ]
let cycles = 2;
let startWidth = square.length;//square is the small array
let finalWidth = startWidth + (cycles * 2);//cycles is part of the task it tells
let twoD = new Array(finalWidth).fill(new Array(finalWidth).fill('')); how big is the bigger array/how many spaces from the edge to the small array
if (finalWidth % 2 == 0){//just made for even numbers once I make this work will edit it for odd too
for(let row = (finalWidth / 2) - 1; row < (finalWidth / 2) + startWidth - 1; row++){
for(let col = (finalWidth / 2) - 1; col < (finalWidth / 2) + startWidth - 1; col++){
let i = col - (finalWidth / 2) + 1;
let j = row - (finalWidth / 2) + 1;
console.info(i, j, row, col)//logs correct indecies
twoD[row][col] = square[i][j]
}
}
}
Любая идея приветствуется. Спасибо!
Я нигде не вижу cycles
определенного. Отредактируйте код и сделайте так, чтобы он работал без ошибок.
@MaheerAli сделал, что все переменные теперь объявлены там
Вы можете попробовать эту логику:
midRow
: удерживать позицию xmidCol
: удерживать позицию ymidRow
и midCol
, чтобы рассчитать позицию для записи.const matrix = [
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ],
[ '', '', '', '', '', '' ]
]
const value = [
[ 'X', '#' ],
[ '#', 'X' ]
]
const midRow = Math.floor((matrix.length - 1)/2)
const midCol = Math.floor((matrix[0].length - 1)/2)
for (let r = 0; r < value.length; r++) {
for (let c = 0; c < value[0].length; c++) {
matrix[r + midRow][c + midCol] = value[r][c]
}
}
console.info(matrix.join('\n'))
Я также вижу, что вы используете это для создания массива:
let matrix = new Array(6).fill(new Array(6).fill(''));
Проблема с Array.fill
заключается в том, что он сначала создает ценность, а затем передает ее всем элементам. Обычно это не вызывает проблем, но поскольку вы заполняете Array
, вы копируете ссылку на 1 массив в 6 позиций. Следовательно, изменение одного повлияет на все
Отсюда ваша проблема:
let matrix = new Array(6).fill(new Array(6).fill(''));
matrix[2][2] = '#'
console.info(matrix.join('\n'))
Решение:
Используйте Array.from()
. Это создает динамический массив, и вы можете заполнить его по своему усмотрению.
let matrix = Array.from(
{ length: 6},
() => Array.from({length: 6}, () => '')
)
matrix[2][2] = '#'
console.info(matrix.join('\n'))
Спасибо, но что я делаю не так в своем коде?
когда я запускаю свой код, журнал консоли записывает - i, j, row, col = 0 0 2 2 1 0 2 3 0 1 3 2 1 1 3 3, поэтому 0,0 от квадрата до 2,2 в большом массиве и так далее но пишет во всю колонку почему?
Вместо Array.from
вы также можете fill()
и map()
. let matrix = Array(6).fill().map(x => Array(6).fill(''))
@MaheerAli Просто проверьте свою строку и посчитайте количество созданных в ней итераций и массивов.
@MaheerAli спасибо, мне нравится эта инициализация 2d-массива, она короче и не имеет объекта с длиной, и я понимаю это лучше :)
и какая должна быть функция, чтобы это называлось? копировать в миддл? @МахирАли
@DaliborTrampota Да, все в порядке. копитомиддл. Я бы использовал copyToCenter
.
Чувак, дай работающий фрагмент, чтобы мы могли воспроизвести