MATLAB, 94 93 байта
rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)
Пример выполнения (первая строка после кода - ввод, введенный пользователем):
>> rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)
99
*10001*2*
220001232
*201111*1
*312*1111
12*211000
011211000
0001*1000
000112110
000001*10
объяснение
rng(input(''));
берет целое число и использует его как начальное число. (Это работает в современных версиях MATLAB. В старых версиях может потребоваться другой синтаксис.)
x(9,9)=~1;
присваивает логическую 0
или false
(полученную путем логического отрицания 1
) элемент (9,9)
матрицы x
. Остальные записи также автоматически инициализируются как логические 0
.
x(randperm(81,10))=1;
правопреемники 1
(autoomatically приведения к логическому 1
или true
) к 10
из
81
записей x
, выбранных случайным образом, без замены. Эти записи содержат бомбы.
conv2(+x,ones(3),'s')
это сокращение от conv2(+x,ones(3),'same')
. Он сворачивает матрицу x
(которую нужно привести double
, используя +
) с окрестностью 3 × 3, содержащей 1
. Это подсчитывает, сколько бомб находится рядом с каждой записью. Для записей, которые содержат бомбу, она включает эту бомбу, но значение там будет перезаписано позже.
y=[...+48 ''];
добавляет 48 к значению, чтобы преобразовать число в код ASCII. Конкатенация с пустой матрицей переводит эти коды ASCII в символы.
y(x)=42;
присваивает 42 (код ASCII для '*'
) позициям бомб. Эти позиции задаются с помощью x
, который здесь используется в качестве логического индекса.
disp(y)
отображает результат.