Сапер - популярная компьютерная игра, в которую вы, вероятно, потратили впустую время, пытаясь выявить ячейки, являющиеся минами, в прямоугольной сетке, основываясь на подсказках о том, сколько соседних мин имеется в каждой не минной ячейке. И если вы еще не играли, сделайте это здесь .
Изящный математический факт о сетке Сапер (aka board) таков:
Доска и ее дополнение имеют одинаковое общее количество шахт . ( Доказательство )
То есть, если у вас есть полностью раскрытая сетка Сапер, сумма всех чисел на этой сетке, то есть общее количество мин , будет равно общему количеству шахты дополнения сетки, то есть сетки, где каждая шахта была заменена с не моим, и каждый не мой заменен на мой.
Например, для сетки Сапер
**1..
34321
*2**1
общее количество мин составляет 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17.
Дополнение сетки
24***
*****
3*44*
у которого моя общая сумма 2 + 4 + 3 + 4 + 4 = 17 снова.
Напишите программу, которая принимает произвольную сетку Сапер в текстовой форме, где *
представляет мину и 1
сквозную 8
представляет количество мин, примыкающих к ячейке, не относящейся к мине. Вы можете использовать .
или 0
или
(пробел) для представления ячеек без моих соседей, по вашему выбору. Можно предположить, что входная сетка будет правильно помечена, т. Е. Каждая не моя ячейка будет точно обозначать общее количество мин, непосредственно прилегающих к ней ортогонально или по диагонали.
Ваша программа должна напечатать дополнение сетки в том же формате ( с использованием тех же .
, 0
или ,
как вы ожидали на входе).
Самый короткий код в байтах побеждает.
- Вместо программы вы можете написать функцию, которая принимает входную сетку как строку и печатает или возвращает сетку дополнения.
- Конечный символ новой строки на входе или выходе - это хорошо, но не должно быть никаких других символов, кроме тех, которые образуют сетку.
- Вы можете предположить, что сетка 1 × 1 будет самым маленьким входом.
Тестовые случаи
Все входы и выходы можно поменять местами, поскольку дополнением является исходная сетка. Решетки также можно вращать для дальнейших тестовых случаев.
Входные данные:
111
1*1
111
Выход:
***
*8*
***
Входные данные:
.
Выход:
*
Входные данные:
*11*1.1**1...1***1.....1*****1..........
Выход:
1**2***11*****1.1*******1...1***********
Вход: ( пример Cut The Knot )
**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*
Выход:
24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3
источник
?
) в строке после последней строки платы, или я могу указать количество строк ввода в командной строке?Ответы:
Pyth,
3938 байтПопробуйте онлайн: демонстрация
Основной алгоритм действительно прост. Я просто перебираю каждую ячейку, беру окружающий прямоугольник 3х3 (или меньше, когда ячейка находится на границе) и печатаю звездочку или количество звездочек в этом прямоугольнике.
Объяснение:
источник
CJam,
5857 байтВвод не должен заканчиваться переводом строки. Выход содержит
0
для клеток без близлежащих мин.Попробуйте онлайн в интерпретаторе CJam .
идея
Мы начнем с заполнения входной матрицы одной строкой и одним столбцом звездочек.
Для ввода
это приводит к
Теперь мы генерируем все возможные модификации, которые приводят к повороту строк и столбцов на 0, -1 или 1 единиц вверх / влево:
Мы отбрасываем «места заполнения» от каждого поворота, т.е.
и сформировать единую матрицу, объединяя соответствующие символы каждого поворота:
Первым символом каждой позиции является ее оригинальный характер.
Если это не звездочка, ее следует заменить звездочкой.
Если это звездочка, то число звездочек в этой строке равно числу соседних мин.
Как это работает
источник
Руби, 119
Разгружен в тестовой программе:
источник
Октава, 76
объяснение
Преобразуйте входную строку в матрицу строк, используя
strsplit
иcell2mat
.Получить логическую матрицу, содержащую,
1
где нет*
в исходной матрице.Возьмите свертку с матрицей 3х3 из 1.
Замаскируйте его с помощью обратной логической матрицы и поместите
*
вместо маски.Примечание: клетки без моих соседей представлены как
0
.выполнение
источник