программирование
April 18, 2018
Вариант решения задачи про сапера
Один из подписчиков прислал неплохой вариант решения задачи про сапера.
Напомню текст задачи:
Дан файл с решеткой N x N (разделители пробел и \n), который представляет собой минное поле из игры Сапер. O - означает что на поле нет мины, X - что есть. Нужно заменить все O на количество смежных мин (всего смежных клеток 8 - по горизонтали, вертикали и диагонали). Пример: Входной файл: X O O X X X O O O O O O X O X X X X O X X O O O O X O O O X X X O O X X X X O X X O X X X O X O O O O X O X O X X O X X O X O X Вывод в консоль: X 1 1 X X X 3 2 3 3 3 5 X 5 X X X X 3 X X 5 5 4 3 X 5 5 6 X X X 2 4 X X X X 6 X X 3 X X X 5 X 3 2 4 5 X 6 X 5 X X 2 X X 4 X 4 X
А вот один из вариантов решения (на JavaScript):
let str = 'X O O X X X O O\nO O O O X O X X\nX X O X X O O O\nO X O O O X X X\nO O X X X X O X\nX O X X X O X O\nO O O X O X O X\nX O X X O X O X'; let m = str.split('\n').map(item => item.split(' ')); let extraLog = false; m.forEach(item => { console.log(item.join(' ')) }); if (extraLog) { console.log('\n'); console.log('y | x | range | above > below'); console.log('-----------------------------'); } let n = m.map((item, index, arr) => { let newStr = []; item.forEach((subitem, subindex, subarr) => { if (subitem === 'X') { newStr.push('X'); return; } let startX = (subindex > 0 ? subindex - 1 : 0); let endX = subindex < subarr.length ? subindex + 1 : subindex; let aboveArr = index > 0 ? getFilteredArray(arr[index - 1]) : []; let belowArr = index < arr.length - 1 ? getFilteredArray(arr[index + 1]) : []; if (extraLog) console.log(index + ' | ' + subindex + ' | ' + startX + ' - ' + endX + ' | ', aboveArr, ' | ', belowArr); let aboveCount = aboveArr.length; let belowCount = belowArr.length; let left = (subindex > 0 && subarr[subindex - 1] === 'X' ? 1 : 0); let right = (subindex < subarr.length && subarr[subindex + 1] === 'X' ? 1 : 0); newStr.push(aboveCount + belowCount + left + right); function getFilteredArray(arr) { return arr.slice(startX, endX + 1).filter(item => item === 'X'); } }) return newStr; }) console.log('\n'); n.forEach(item => { console.log(item.join(' ')); }) console.log('\n');
Для тех, кто хочет поточнее разобраться, как работает данный код: просто измените значение переменной extraLog на true. Тогда в консоль будет выведена логика перебора массива.