MATLAB, 94 93 bytes
rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)
Ejemplo de ejecución (la primera línea después del código es la entrada escrita por el usuario):
>> 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
Explicación
rng(input(''));
toma un número entero y lo usa como semilla. (Esto funciona en versiones modernas de MATLAB. Las versiones antiguas pueden necesitar una sintaxis diferente).
x(9,9)=~1;
asigna lógico 0
u false
(obtenido negando lógicamente 1
) a la entrada (9,9)
de una matriz x
. El resto de las entradas también se inicializan automáticamente a lógico 0
.
x(randperm(81,10))=1;
asigna 1
(automáticamente convertido a lógico 1
, o true
) a 10
las
81
entradas de x
, elegidas al azar sin reemplazo. Estas entradas son las que contienen bombas.
conv2(+x,ones(3),'s')
es una abreviatura de conv2(+x,ones(3),'same')
. Convoluciona la matriz x
(que necesita ser convertida double
, usando +
) con una vecindad de 3 × 3 que contiene 1
. Esto cuenta cuántas bombas hay adyacentes a cada entrada. Para las entradas que contienen una bomba, incluye esa bomba, pero el valor allí se sobrescribirá más adelante.
y=[...+48 ''];
agrega 48 al valor, para convertir de número a código ASCII. La concatenación con la matriz vacía convierte estos códigos ASCII en caracteres.
y(x)=42;
asigna 42 (código ASCII para '*'
) a las posiciones de las bombas. Estas posiciones están dadas por x
, que aquí se usa como un índice lógico.
disp(y)
Muestra el resultado.