MATLAB, 94 93 byte
rng(input(''));x(9,9)=~1;x(randperm(81,10))=1;y=[conv2(+x,ones(3),'s')+48 ''];y(x)=42;disp(y)
Esempio di esecuzione (la prima riga dopo il codice è l'input digitato dall'utente):
>> 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
Spiegazione
rng(input(''));
prende un numero intero e lo usa come seme. (Funziona nelle moderne versioni MATLAB. Le vecchie versioni potrebbero aver bisogno di una sintassi diversa.)
x(9,9)=~1;
assegna logico 0
o false
(ottenuto negando logicamente 1
) l'ingresso (9,9)
di una matrice x
. Anche il resto delle voci viene automaticamente inizializzato in logico 0
.
x(randperm(81,10))=1;
assegna 1
(cast automaticamente a logico 1
, o true
) 10
delle
81
voci di x
, scelte casualmente senza sostituzione. Queste voci sono quelle che contengono bombe.
conv2(+x,ones(3),'s')
è un'abbreviazione di conv2(+x,ones(3),'same')
. Convolge la matrice x
(che deve essere lanciata double
, usando +
) con un vicinato 3 × 3 contenente 1
. Questo conta quante bombe sono adiacenti a ciascuna voce. Per le voci che contengono una bomba include quella bomba, ma il valore verrà sovrascritto in seguito.
y=[...+48 ''];
aggiunge 48 al valore, per convertire dal numero al codice ASCII. La concatenazione con la matrice vuota lancia questi codici ASCII in caratteri.
y(x)=42;
assegna 42 (codice ASCII per '*'
) alle posizioni delle bombe. Queste posizioni sono indicate da x
, che viene qui utilizzato come indice logico.
disp(y)
visualizza il risultato.