Soit un échiquier 8x8 représenté par deux valeurs distinctes, l'une étant un carré vide et l'autre une reine. Dans les exemples suivants, j'utilise 0 comme carrés vides et 1 comme reines. Par exemple:
est donné par
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Considérez le nombre de paires de reines qui attaquent chacune à au moins un carré de distance (pour rappel, les reines attaquent orthogonalement et en diagonale). Dans l'exemple ci-dessus, l'incroyable diagramme laid suivant montre toutes ces paires sous forme de flèches.
Il y a 43 paires trouvées ci-dessus donnant le cas de test suivant:
Input:
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Output: 43
Défi
Écrivez un programme qui, étant donné un état de carte représenté par deux valeurs distinctes, génère le nombre de paires de reines qui s’attaquent avec au moins un carré entre elles.
- Vous pouvez entrer dans le format le plus pratique qui utilise deux valeurs pour représenter les carrés vides et les reines, par exemple, une chaîne de 64 "." S pour les carrés vides et "Q" pour les reines par lignes de bas en haut, un 8x8 matrice de booléens, une liste de liste d'entiers 0 et 1 etc, pour autant que cela soit expliqué dans votre solution
- La sortie est un entier
- Les méthodes d'E / S standard s'appliquent et les failles standard interdites
- C'est le golf de code, donc la réponse la plus courte en octets gagne
Cas de test:
En utilisant le format 0 et 1, 0 étant des carrés vides et 1 des reines:
Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 0
Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 0
Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 1
Input:
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 0
Output: 10
Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 4
Input:
1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 11
la source
Réponses:
Python 2 , 105 octets
Essayez-le en ligne!
Explication
Nous prenons l'entrée comme une chaîne de 64 caractères
'0'
ou'1'
. En utilisant des tranches de pas, nous lançons quatre "lignes de vue" de chaque reine que nous rencontrons. Par exemple, lorsque i = 10 et d = 7 , marquer la reine comme ♥ et les tuiles sélectionnées parb[i+d::d]
comme █:De toute évidence, nous ne voulons pas réellement que la vision s'enroule autour de la planche comme ça. Nous calculons donc à quelle distance le bord de la planche est dans chaque direction et regardons les tuiles à
b[i+d::d][:…]
.Pour chaque paire direction tuile, nous comptons:
Cela échouera chaque fois
c
n'est pas une reine; oufind
retourne 0); oufind
renvoie -1).Chaque paire de reines n'est vérifiée une fois, puisque les rayons sont toujours casted en avant dans l' ordre de lecture, d'un « plus tôt » la reine à un « plus tard ».
la source
JavaScript (ES7), 86 octets
Prend l'entrée comme un tableau de 64 entiers avec 254 pour une reine et 0 pour un carré vide.
Essayez-le en ligne!
Cette version abuse du sous-dépassement arithmétique pour obtenir une condition d'arrêt dans la partie récursive.
JavaScript (ES7), 89 octets
Prend l'entrée comme un tableau de 64 bits.
Essayez-le en ligne!
Comment?
Nous appelons récursivement une fonction de rappel nommée de
map()
pour parcourir les carrés dans une direction donnée. Bien que nous n'ayons pas vraiment besoin du contenu du troisième paramètre du rappel (le tableau amap()
été appelé), nous l'utilisons néanmoins indirectement pour savoir s'il s'agit de la première itération ou non.Il s'agit de la variable x dans le code.
la source
Escargots , 14 octets
Essayez-le en ligne!
L'entrée est au format 0/1, sans espaces dans les lignes.
Snails a été créé pour un défi PPCG de conception de langage de correspondance de motifs 2D . Plus important encore, il affiche par défaut le nombre de correspondances trouvées, ce qui est parfait pour ce défi.
A
définit l'option "tous les chemins", de sorte que si une reine est dans plusieurs paires, chacune de ces paires générerait une correspondance.rdaa7
définit la direction de correspondance sur S, SE, E et NE. La définition de toutes les directions (z
) entraînerait un double comptage.\1\0+\1
correspond à un1
, puis un ou plusieurs0
s, puis un autre1
.la source
APL (Dyalog Classic) ,
413932 octetsEssayez-le en ligne!
≠⍨
est "pas égal à lui-même" - une matrice 8x8 tout à zéro⊢,≠⍨,⌽,≠⍨
- si la matrice d'origine estABC...
, cette expression renvoie:8 31⍴
le remodèle de 8x32 à 8x31, en réutilisant les éléments dans l'ordre des lignes principales:⊢,⍉,
ajoute la matrice d'origine et sa transposition (espaces supplémentaires pour plus de clarté):2<⌿0⍪
ajoute des 0 en haut et compare en utilisant<
chaque élément contre l'élément en dessous, nous obtenons donc un 1 pour le premier 1 dans chaque groupe vertical de 1, et nous obtenons des 0 partout ailleurs+⌿-⌈⌿
les sommes par colonne moins les maxima par colonne - nous calculons le nombre d'écarts entre les 1-groupes dans chaque colonne, 0 s'il n'y en a pas+/
sommela source
Gelée ,
2220 octetsEssayez-le en ligne!
la source
Retina 0.8.2 ,
6058 octetsEssayez-le en ligne! Prend l'entrée sous la forme de 8 chaînes binaires de 8 caractères séparées par des virgules, mais l'en-tête convertit le format fourni pour vous. Explication:
Créez toutes les sous-chaînes de la planche en commençant par une reine. Suffixez une valeur de marqueur à chaque sous-chaîne. Edit: enregistré 2 octets en laissant quelques chaînes de vidage derrière; ceux-ci sont effectivement ignorés.
Divisez chaque marqueur en une plage inclusive et ajoutez 7 aux éléments non nuls.
Supprimez chaque série de caractères égale à la longueur du marqueur. Cela revient à trouver chaque rayon est, sud-ouest, sud ou sud-est de chaque reine.
Comptez tous les rayons qui traversent au moins une case vide avant de rencontrer une autre reine.
la source
JavaScript (ES6) + SnakeEx , 38 octets
Prend la saisie dans le formulaire
'10111000\n10101011\n10101101\n01010100\n01100101\n10001000\n01000111\n01110101'
. Il s'avère que SnakeEx peut toujours être utilisé en dehors de son défi d'origine!la source
K (ngn / k) , 45 octets
Essayez-le en ligne!
la source