Démineur est un jeu informatique populaire auquel vous avez probablement perdu du temps à jouer où vous essayez de révéler les cellules qui sont des mines dans une grille rectangulaire en fonction des indices du nombre de mines voisines que possède chaque cellule non minière. Et si vous ne l'avez pas joué, faites-le ici .
Un fait mathématique astucieux à propos d'une grille de démineur (aka conseil) est que:
Une planche et son complément ont le même nombre total de mines . ( Preuve )
C'est-à-dire que si vous avez une grille de démineur complètement révélée, la somme de tous les nombres sur cette grille, c'est-à-dire le total de la mine , sera égale au total de la mine du complément de la grille, qui est la grille où chaque mine a été remplacée avec une non-mine et chaque non-mine remplacée par une mine.
Par exemple, pour la grille Démineur
**1..
34321
*2**1
le total de la mine est 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17.
Le complément de la grille est
24***
*****
3*44*
qui a le mien total 2 + 4 + 3 + 4 + 4 = 17 à nouveau.
Ecrire un programme qui prend dans une grille Démineur arbitraire sous forme de texte où *
représente une mine et 1
par 8
représenter le nombre de mines adjacentes à une cellule non-moi. Vous pouvez utiliser .
ou 0
ou
(espace) pour représenter des cellules sans voisin, selon votre choix. Vous pouvez supposer que la grille d'entrée sera correctement marquée, c'est-à-dire que chaque cellule non minière indiquera avec précision le nombre total de mines immédiatement adjacentes orthogonalement ou en diagonale.
Votre programme a besoin d'imprimer le complément de la grille dans le même format ( en utilisant le même .
, 0
ou
comme prévu dans l'entrée).
Le code le plus court en octets gagne.
- Au lieu d'un programme, vous pouvez écrire une fonction qui prend la grille d'entrée sous forme de chaîne et imprime ou renvoie la grille complémentaire.
- Un retour à la ligne de fin dans l'entrée ou la sortie est correct, mais il ne doit pas y avoir d'autres caractères que ceux qui forment la grille.
- Vous pouvez supposer qu'une grille 1 × 1 sera la plus petite entrée.
Cas de test
Toutes les entrées et sorties pourraient être échangées car le complément du complément est la grille d'origine. Les grilles peuvent également être tournées pour d'autres cas de test.
Contribution:
111
1*1
111
Sortie:
***
*8*
***
Contribution:
.
Sortie:
*
Contribution:
*11*1.1**1...1***1.....1*****1..........
Sortie:
1**2***11*****1.1*******1...1***********
Entrée: ( exemple Cut The Knot )
**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*
Sortie:
24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3
la source
?
) sur la ligne après la dernière ligne de la carte est-elle acceptable, ou pourrais-je prendre le nombre de lignes d'entrée via la ligne de commande?Réponses:
Pyth,
3938 octetsEssayez-le en ligne: démonstration
L'algorithme principal est vraiment simple. Je parcours simplement chaque cellule, je prends la boîte 3x3 environnante (ou plus petite lorsque la cellule est à la frontière) et j'imprime une étoile ou le nombre de non-étoiles dans cette boîte.
Explication:
la source
CJam,
5857 octetsL'entrée ne doit pas se terminer par un saut de ligne. La sortie contient
0
pour les cellules sans mines à proximité.Essayez-le en ligne dans l' interprète CJam .
Idée
Nous commençons par remplir la matrice d'entrée avec une ligne et une colonne d'astérisques.
Pour l'entrée
cela se traduit par
Maintenant, nous générons toutes les modifications possibles qui résultent de la rotation des lignes et des colonnes 0, -1 ou 1 unités vers le haut / gauche:
Nous éliminons les "emplacements de rembourrage" de chaque rotation, c.-à-d.
et former une matrice unique en concaténant les caractères correspondants de chaque rotation:
Le premier caractère de chaque position est son caractère d'origine.
S'il ne s'agit pas d'un astérisque, il doit être remplacé par un astérisque.
S'il s'agit d'un astérisque, le nombre de non-astérisques dans cette chaîne est le nombre de mines voisines.
Comment ça marche
la source
Rubis, 119
Non testé dans le programme de test:
la source
Octave, 76
Explication
Convertissez la chaîne d'entrée en matrice de chaînes à l'aide de
strsplit
etcell2mat
.Obtenez la matrice logique contenant
1
où il n'y*
en a pas dans la matrice d'origine.Prenez sa convolution avec une matrice 3x3 de 1.
Masquez-le avec la matrice logique inverse et mettez
*
en place le masque.Remarque: Les cellules sans voisin de mine sont représentées comme
0
.Exécution
la source