Minesweeper est un jeu de puzzle populaire dans lequel vous devez découvrir quelles tuiles sont des "mines" sans cliquer dessus. Chaque tuile est soit une mine (représentée par *
), soit un indice, c'est-à-dire un nombre compris entre 0 et 8 représentant le nombre de tuiles voisines qui sont des mines. Votre tâche aujourd'hui est de prendre un tableau contenant les mines et de renseigner tous les indices. Par exemple, regardez le tableau 5x4 suivant, avec 5 mines:
*
* *
*
*
Une fois les indices renseignés, le tableau ressemblera à ceci:
2*211
*33*1
12*32
0112*
Détails
Vous devez écrire un programme complet ou une fonction qui prend une grille de caractères ne contenant que des espaces et des astérisques et génère une autre grille dans laquelle chaque espace est remplacé par le nombre de mines adjacentes (astérisques). Tous ces formats sont acceptables pour vos grilles:
Une chaîne avec des nouvelles lignes dedans
Une liste 2D de caractères / chaînes de caractères uniques
Une liste de chaînes
Vous pouvez supposer que la grille sera au moins 1x1, bien qu'il soit possible que ce soit toutes les mines ou tous les espaces.
La grille d’entrée sera toujours complétée avec le nombre approprié d’espaces. Comme d'habitude, c'est du code-golf , donc des échappatoires standard s'appliquent et la réponse la plus courte en octets l'emporte!
Échantillon IO
Pour que vous puissiez voir les espaces, je vais montrer tous les exemples d'E / S entre parenthèses.
Input:
[ * ]
[* ]
[ ]
[ ]
[ ** ]
[ * * ]
Output:
[1101*1]
[*10111]
[110000]
[012210]
[12**21]
[1*33*1]
Input:
[****]
[****]
Output:
[****]
[****]
Input:
[ ]
[ ]
[ ]
[ ]
Output:
[000]
[000]
[000]
[000]
Input:
[* ]
[** ]
[ ]
[ *]
Ouput:
[*310]
[**10]
[2221]
[001*]
Input:
[** ]
[* *]
[ * ]
[ ]
[* ]
[**** ]
Output:
[**1011]
[*4211*]
[12*111]
[121100]
[*43210]
[****10]
Input:
[ * ]
[ * ]
[ * ]
[** *** ]
[ *** ]
[ ]
[ ** ]
[ * * ]
[* ** ]
[ ** ]
Output:
[00001*1111]
[00002221*1]
[22102*4321]
[**102***31]
[221013***1]
[0000013542]
[0112111**1]
[12*2*12442]
[*212112**2]
[1100002**2]
la source
Réponses:
MATL ,
1817 octetsMerci à @ mbomb007 pour une correction dans l'entrée du scénario de test 6
L'entrée est un tableau de caractères 2D, au format
Essayez-le en ligne!
Cas de test: 1 , 2 , 3 , 4 , 5 , 6 .
Explication
la source
JavaScript (ES6),
114 à96 octetsEdit: 18 octets sauvés grâce à une idée de @ETHproductions.
la source
a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>a.slice(i-!!i,i+2).reduce((t,s)=>t+(q=i=>s[i+j]>' ')(-1)+q(0)+q(1),0)))
R,
127112 octetsmerci à @gtwebb et @ sebastian-c pour les améliorations apportées.
Points notables:
Les matrices sont des vecteurs dans R. Vous n'avez pas besoin d'indexation 2D pour extraire des éléments.
seq(M)
retournera une séquence de la même "longueur" (lignes x colonnes) queM
.Vous ne pouvez pas mélanger des indices d'extraction positifs et négatifs dans R.
M[-3]
C'est un code R légitime, mais pas ce qui est souhaité.L'entrée se présente sous la forme d'une matrice R. Quelques exemples:
la source
T
place deTRUE
. J'ai aussi réussi à faire glisser certaines bretelles de l'une des fonctions if:f=function(M){a=nrow(M);b=ncol(M);for(i in seq(M))if(M[i]!="*")M[i]=sum(M[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)]=="*",na.rm=T);M}
b=ncol(M)
et ne l'utilisez pas pour vous en débarrasser.M->{a=nrow(M);p=M=='*';M[]=ifelse(p,'*',sapply(seq(M),i->sum(p[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)],na.rm=T)))}
- Cependant, cela triche légèrement car il nécessite un<-
lambda redéfini , voir klmr / functional / lambdaJava, 190 octets
Modifier:
Snipet
Ungolfed:
Idéone-le.
la source
x,y,i,j
c[i][j]==32
et ainsi de suite et je les ai simplement modifiés dans la partie Ungolfed0000*1\n*10011\n110000\n000000\n00**10\n0*22*1
. Pourriez-vous peut-être ajouter un lien de test ideone.com? EDIT: De plus, à moins que je ne fasse quelque chose de mal moi-même, votre sortie du code golfé:ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0s
pour le premier cas de test (il a tout remplacé*
avec des zéros ..): SJavaScript (ES6), 107
Entrée / sortie sous forme de tableau de chaînes
remarque lorsque la fonction s est appelée avec un élément de la liste l hors limites, le paramètre
a
estundefined
etc+a
résultera" undefined"
grâce aux règles de conversion originales de javascriptPlus lisible
la source
Python 2, 138 octets
Définit une fonction
f
qui accepte une chaîne d'entrée telle queet imprime une chaîne sur STDOUT:
la source
enumerate(s,2)
), et remplacez toutes les occurrences dei + 2
withi
eti - 1
withi - 3
. Cela va nous faire perdre quelques octets.JavaScript (ES6)
186182177161152 octetsMise à jour
Le code ci-dessus pour les
" *"
retours"2*"
. Ceci est corrigé dans le script suivant.168167 octetsEssayez ici.
la source
t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k
devrait fonctionner de manière similaire et vous sauver latry
/catch
partie.(a[x+i%3-1]||1)[y+i/3-1|0]
.Haskell, 115 octets
Définit une fonction
f
sur les listes de chaînesla source
Python 2, 192 octets
-3 octets grâce au cuivre, -10 octets si la modification de la grille d'entrée est autorisée, un autre -11 octets par
continue
suppression et un autre -12 octets pour éliminer la variable de compteurUtilise une liste de caractères
L
et crée une version rembourréeK
, donc pas de problème aux limites. L'indentation estUsage:
la source
if'*'==L[y][x]:
pour enregistrer un octet.r=range;
sur la même ligne quen,S,s
, vous pouvez enregistrer cinq caractères en remplaçant les appelsrange(...)
avecr(...)
.ange
donc 8 octets, mais je dois aussi ajouter,r
et,range
ce qui correspond également à 8 octets, donc rien n'est gagné.range
.Ruby, 112
Prend et retourne une chaîne. La chaîne doit être séparée et reliée par une nouvelle ligne.
dans le programme de test
la source
TSQL
292291 octetsGolfé:
Ungolfed:
Violon
la source
;
à l'avant de votre code compte-t-il? Il semble que vous l'avez compté.Raquette 415 octets
Ungolfed:
Testing (liste sous forme de chaîne unique avec le numéro de colonne spécifié; fonctionnera également avec des espaces):
Sortie:
la source
PHP,
145133132127 octetsprend les entrées en tant que chaîne simple, séparées par une nouvelle ligne. Courez avec
-r
.panne
la source
"!">$n=$s[$p]
au lieu de" "==$n=$s[$p]
sauver un octetTortue , 99 octets
(oups je continue à oublier le lien: |)
Prend des entrées avec des crochets autour de chaque ligne
Turtlèd ne peut pas prendre une entrée multiligne, donc après la dernière ligne, écrivez
|
pour signaler la fin de l’entréeNotez que les crochets incompatibles sont dus au fait que les crochets ouverts analysent le caractère suivant dans le cadre de la commande crochet
Essayez-le en ligne!
Comment ça marche (description générale):
Jusqu'à
|
est entré, il écrit l'entrée sur chaque ligne, avec des crochets pour l'aider à reconnaître la fin de chaque ligne. Une fois que cela est arrivé, cela remonte au début des entrées. Il passe par chaque caractère en entrée. S'il s'agit d'un espace, il regarde autour de lui, en ajoutant un au compteur pour chaque bombe trouvée. après chaque ligne, il supprime les crochets. Quand il arrive à la dernière ligne, avec le | dans celui-ci, il s'arrête et supprime le |. la grille est implicitement imprimée.la source
C,
152150147145 octetsL'entrée se présente sous la forme d'un tableau de caractères à deux dimensions, suivi du nombre de lignes et de colonnes. Le résultat sera retourné sur place.
(La plupart du temps) Ungolfed:
L’approche est simple: boucle sur chaque position, boucle sur ses voisins et addition de tous les astérisques. Il existe deux astuces au niveau des bits:
Lorsque nous décidons si une cellule est un astérisque ou non, nous pouvons simplement vérifier si le bit des huitièmes est défini, car le nombre dans la cellule doit être inférieur à 8 (la valeur maximale de la cellule).
Nous pouvons transformer un caractère d'espace en un caractère zéro en effectuant une opération OR-ing 16.
Edit: Golfé deux octets en utilisant
/
à la place de>=
.Edit: Cinq autres octets en inversant le sens des boucles.
la source
C #, 341 octets
Une implémentation naïve qui peut définitivement être raccourcie.
la source
Python 2, 183 octets
la source