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)
Exemplo de execução (a primeira linha após o código é a entrada digitada pelo usuário):
>> 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
Explicação
rng(input(''));
pega um número inteiro e o usa como semente. (Isso funciona nas versões modernas do MATLAB. As versões antigas podem precisar de uma sintaxe diferente.)
x(9,9)=~1;
atribui lógico 0
, ou false
(obtido negando logicamente 1
) à entrada (9,9)
de uma matriz x
. O restante das entradas também é inicializado automaticamente para lógico 0
.
x(randperm(81,10))=1;
atribui 1
(convertido automaticamente para lógico 1
ou true
) para 10
as
81
entradas de x
, escolhidas aleatoriamente sem substituição. Essas entradas são as que contêm bombas.
conv2(+x,ones(3),'s')
é uma abreviação de conv2(+x,ones(3),'same')
. Ele envolve a matriz x
(que precisa ser convertida em double
, usando +
) com uma vizinhança 3 × 3 1
. Isso conta quantas bombas estão adjacentes a cada entrada. Para entradas que contêm uma bomba, ela inclui essa bomba, mas o valor será substituído posteriormente.
y=[...+48 ''];
adiciona 48 ao valor, para converter de número em código ASCII. Concatenar com a matriz vazia lança esses códigos ASCII em caracteres.
y(x)=42;
atribui 42 (código ASCII para '*'
) às posições das bombas. Essas posições são dadas por x
, que é usada aqui como um índice lógico.
disp(y)
exibe o resultado.