Votre objectif est de vérifier si un tableau Minesweeper terminé est valide. Cela signifie que chaque nombre représente un nombre correct de mines dans les cellules adjacentes, y compris les diagonales. Le conseil ne s'enroule pas.
Comme d'habitude , vous devez donner une fonction ou un programme, et le code le plus court en octets est gagnant.
Voir également les défis passés pour générer , résoudre et mettre en œuvre intégralement Minesweeper.
Contribution:
Une seule chaîne comme ceci: 02X2 13X2 X211
.
Les rangées du tableau du dragueur de mines sont séparées par des espaces. Donc, ce qui précède représente le tableau 3x4:
02X2
13X2
X211
Chaque cellule est un personnage:
X
pour une mine ou un numéro0
par8
.Toutes les lignes ont la même longueur.
Il y a au moins 3 lignes et 3 colonnes.
L'entrée ne commence ni ne se termine par un espace, mais vous pouvez inclure une nouvelle ligne à la fin si vous le souhaitez.
Sortie:
Une vérité cohérente sur les bons tableaux et une valeur cohérente de Falsey sur les mauvais. Consistant signifie que toutes les sorties Truthy sont identiques et que toutes les sorties Falsey sont identiques.
Cas de test
Chaque ligne est un cas de test distinct.
True
:
02X2 13X2 X211
XXXX XXXX XXXX XXXX
XX4X2 5X6X4 XX6XX 4XX54 2X4XX
False
:
02X2 13X2 X212
XXXX XXXX X7XX XXXX
XX5X2 5X6X4 XX6XX 4XX54 2X5XX
Réponses:
Python 2,
132 129128Je l'ai utilisé
enumerate
dans un golf ... et même utilisérange
ailleurs dans le même programme. Il est clair que quelque chose ne va pas ici.Edit: Itérer sur
dict(enumerate(s))
plutôt queenumerate(s)
, doncenumerate
n'a pas besoin d'être appelé deux fois.la source
~
! Et des dictionnaires pour faire du bon travail d’indexation hors des limites.~
opérateur m'a fait ironiquement remarquer que je l'utilisais deux fois sans aucune raison, alors que l'utiliser une seule fois accomplirait évidemment la même chose. Je pensais que la partie dictionnaire était drôle, merci.Pyth, 43
Essayez ici .
Explication:
Jhxzd
: Ceci est l'emplacement du premier espace dans l'entrée + 1. (z
dans l'entrée,d
c'est l'espace.) C'est la séparation dans l'entrée entre les cellules verticalement adjacentes du tableau.!f
: Ceci est la logique not (!
) d'un filter (f
), qui seraTrue
si et seulement si l'expression est falsy pour chaque élément de la séquence.-@zT
: Prenez le caractère à l'emplacementT
(la variable lambda) de l'entrée et supprimez toutes les apparences de: (Ce sera la vérité si le personnage n'est pas supprimé et faux si c'est le cas.+" X"
: Supprimer de l'espace, X et`
: Repr desm
: somme de la carte à/ \X
: nombre de "X" dans:+*JNz
: La tranche de l'entrée préfixée parJ
des caractères facticestd+d2
: De j-1 à j + 2.m+T*kJU3
: Pour d dans [T, T + J, T + 2 * J].Uz
Pour T inrange(len(input))
.la source
APL (NARS2000) (74)
Fonctionne également dans Dyalog APL si
⎕ML
est réglé sur3
.Explication:
⊃⍵⊂⍨⍵≠' '
: divisez⍵
les espaces et utilisez les listes pour former une matrice.G←¯1+⎕D⍳
: recherchez l’index⎕D
pour chaque valeur, soustrayez 1 et stockez-le dansG
. (⎕D
contient les chiffres, tout non-chiffre deviendra10
).Z←G↑⍨2+⍴G
: ajoute deux lignes et colonnes de zéros au bord de la matrice, pour traiter le wraparound{
...}¨⍳⍴Z
: pour chaque position dansZ
, trouvez le nombre de bombes dans le quartier Moore de cette position:G∘.⊖(G←2-⍳3)∘.⌽⊂Z
: faire pivoter àZ
gauche, à droite, en haut, en bas, à gauche en haut, à droite en haut, à gauche en bas et à droite en bas.⍵∘⌷¨
: pour chacune d'elles, trouver l'élément⍵
dans chacune de ces matrices tournées+/∊9<
: compte combien d'éléments sont supérieurs à 9 (c'est le nombre de bombes).(⍴G)↑
: supprimer à nouveau les lignes de zéros ajoutées,G=
: vérifier si chaque élémentG
est égal au nombre de bombes entourant cette position (cela devrait être vrai pour tous les carrés non-bombes),(G>9)∨
: et vérifiez si les éléments dansG
sont plus élevés que9
(ce sont les bombes).~0∊
: retourne1
si la matrice résultante ne contient pas de zéros (= tous les carrés sont soit des bombes soit le nombre correct), et0
si c'est le cas.la source
C #,
321 320305Première tentative de golf n'importe quoi, et je sais que C # n'est pas la langue idéale.
J'espère que l'écriture d'une méthode d'instance est autorisée, sinon ajoutez 7 autres caractères pour
static
.Espacées:
L'utilisation de Linq permet d'économiser de l'espace par rapport aux boucles for, mais il est plus difficile de déboguer.
J'ai appris quelques choses comme convertir
char => int
en soustrayant'0'
.Il semblait plus simple de remplir le tableau avec des espaces afin de le parcourir plus facilement.
la source
-'0'
par-48
. Fonctionne pour moi et enregistre quelques octets pour divers 'X' et ''Python 2, 121
Ceci est fortement inspiré par la réponse de Feersum . L'ordre du jour est exagéré: plutôt que de rechercher des mines chez les 9 voisins de la cellule, vérifiez chaque cellule pour voir s'il s'agit d'une mine voisine.
Nous vérifions si deux cellules sont voisines avec
2>r>-2<c<2
, oùr
etc
sont les différences de cellules en ligne et en colonne, équivalentes à{r,c}<{-1,0,1}
. Ces coordonnées sont calculées à partir des index de cellulesI
eti
dec=I%n-i%n
etr=I/n-i/n
. Il est plus efficace d'indexer directement dans la chaîne et d'extraire des lignes et des colonnes que de le convertir en objet 2D, tel qu'une liste de listes. Le contrôle de la mine estB[i]>'W'
, équivalent ici àB[i]=='X'
.Utiliser
enumerate
aurait sauvé deux caractères sur le vilainrange(len(B))
sauf qu'il retourne un objet itérateur qui ne supporte pas deux boucles imbriquées.la source
~B.find
./
parce qu'il arrondit les négatifs également.Python 2, 140
la source
JavaScript (ES6),
135133125122Fournissez une entrée à la fonction sous forme de chaîne:
Pour une explication, voir l'ancienne version ci-dessous. La nouvelle version remplace les
for
boucles par desevery
appels et utilise la variablee="every"
à faire à lasomeArray[e](...)
place desomeArray.every(...)
.De plus, le compteur
k
est maintenant indexé à1
afin que l'k+=...
expression soit toujours véridique, afin de maintenir laevery
boucle en cours d'exécution. Nous éliminons cet extra1
en soustrayant letrue
résultat (qui coïncide numériquement1
) retourné par l'every
opération[-1,0,k=1][e](...)
.Ancienne version:
Code avec espaces et commentaires:
La
every
méthode de tableau JavaScript prend un rappel et applique le rappel à chaque élément du tableau. Si un rappel renvoie une valeur falsey, l'every
appel est renvoyéfalse
.Les booléens dans JS sont forcés à 1 ou 0 lorsqu'ils font partie d'un ajout. Pour chaque espace environnant, nous "ajoutons" le résultat booléen de la comparaison de sa valeur à
X
, puis ajoutons cette valeur au compteurk
dans l'expressionk += (... == "X")
. Par conséquent,k
contient le nombre deX
s environnants , cartrue
compte comme1
etfalse
compte comme0
.la source
c=="X"
essayer!c/1
, vous économiserez une énorme quantité d'octets! Si cela échoue, essayez!!c/1
. Le raisonnement est que'X'/1 => NaN
, etNaN
est falsie. Vous vérifiez sic=='X'
, pourquoi ne pas essayer de vérifier si ce n'est pasfalse
?(!c)/1
, ce qui n'aide pas, malheureusement; J'aurais besoin d'avoir les parenthèses pour!(c/1)
, qui coûtent 2. En outre,0/1
c'est falsey, donc l'entrée "0X
" invalide aurait un résultat incorrecttrue
. Le mieux que je puisse faire, tout en respectant les zéros, est de combiner les deux conditions en une phrase annulée, par exemple!(+c+1&&k-c)
, mais c'est la même longueur que ce que j'ai déjà.!(k-1-c)
deux conditions sont testées , car si lesk
correspondancesc
(moins l'offset 1), la négation est0
vraie, et si cec
n'est pas un nombre, nous obtenonsNaN
la négation est aussitrue
.CJam,
70 6563 octetsCela peut être beaucoup joué au golf.
Donne
1
pour un conseil valide et0
pour un conseil non valide.Cas de test
Contribution
Sortie
Essayez-le en ligne ici
la source
JavaScript (ES6) 98
Certains utilisent pour appliquer une fonction à chaque caractère de la chaîne.
La fonction retourne
La vérification interne est effectuée à l'aide de la carte, car elle est plus courte que pourChaque
certains retournent vrai à la première valeur de vérité (dans le cas présent, différente de zéro), ce qui signifie un contrôle raté. Le résultat est annulé pour donner un vrai / faux plus reconnaissable.
Tester dans la console FireFox / FireBug
Sortie
la source
R, 156 caractères
Avec des retraits, des espaces et des sauts de ligne, pour plus de lisibilité:
Exemples:
la source