Comptez Mills dans neuf hommes Morris

21

introduction

Morris de Nine Mens (également appelé Mills) est un jeu de société pour deux joueurs qui se joue sur le plateau suivant (image tirée de la page Wikipedia liée):

Conseil de moulin

Chaque joueur a 9 hommes, de couleur noir et blanc. Les règles concrètes ne sont pas importantes pour ce défi, mais consultez la page Wikipedia si vous êtes intéressé.

Le défi

Étant donné une grille en entrée, qui représente un certain état du conseil d'administration, affichez le nombre total de moulins mavec 0<=m<=8.
Trois hommes de la même couleur forment un moulin lorsqu'ils sont dans une rangée droite de points connectés. b2to f2n'est pas un moulin puisque les hommes sont de couleur différente. Aussi d2à d5ne formerait pas un moulin puisque les trois points doivent être connectés.
La planche dans l'image ci-dessus contient deux moulins par exemple. Un de f2à f6et un de e3àe5 .

Contribution

La carte est représentée comme une grille 2D avec 24 points qui sont connectés comme indiqué dans l'exemple d'image ci-dessus. L'exemple utilise des lettres de a-gpour les colonnes et des chiffres de 1-7pour les lignes, mais vous pouvez choisir n'importe quel format d'entrée raisonnable tant qu'il mappe 24 coordonnées uniques à l'un des états suivants:

  • Vide
  • Pris par le noir
  • Pris par le blanc

La représentation concrète est à vous, vous n'êtes pas limité à "b" ou "w" pour les couleurs.

En plus de cela, votre entrée ne peut contenir aucune information supplémentaire.

Notes complémentaires

  • Vous n'avez pas à mapper les points par n'importe quel type de valeurs. Si vous voulez prendre l'entrée comme un tableau 2D, c'est bien aussi. Mais gardez à l'esprit que tous les points ne sont pas utilisés et que vous devez considérer les connexions entre eux.
  • L'entrée peut être vide, auquel cas vous devez sortir zéro (plateau vide -> pas de fraisage).
  • Puisque chaque joueur a 9 hommes, l'entrée ne contiendra jamais plus de 18 points pris.
  • Vous pouvez laisser de côté les points vides dans l'entrée et donc uniquement les points d'entrée qui sont pris.
  • L'entrée peut être commandée de n'importe quelle manière. Vous ne pouvez pas compter sur une commande spécifique.
  • Vous pouvez supposer que l'entrée sera toujours valide. Cela signifie qu'il n'y aura pas plus de 9 hommes de chaque couleur et que chaque point sera unique.

Règles

  • Indiquez clairement le format d'entrée que vous utilisez dans votre solution. Fournir un exemple d'exécution de votre programme est fortement encouragé.
  • Fonction ou programme complet autorisé.
  • Règles par défaut pour les entrées / sorties.
  • Des échappatoires standard s'appliquent.
  • Il s'agit de , donc le nombre d'octets le plus bas l'emporte. Tiebreaker est une soumission antérieure.

Cas de test

Le format d'entrée ici est une liste de tuples avec les coordonnées comme dans l'exemple ci-dessus comme premier élément et l'état du point deuxième élément. Un point pris par le blanc est marqué comme "w" et un point pris par le noir comme "b". Tous les autres points sont laissés de côté et sont vides.

[("a4", "w"), ("b2", "b"), ("b4", "b"), ("c4", "b"), ("d1", "w") , ("d2", "w"), ("e3", "w"), ("e4", "w"), ("e5", "w"), ("f2", "b") , ("f4", "b"), ("f6", "b"), ("g4", "w")] -> 2
[("a1", "b"), ("a4", "b"), ("a7", "b"), ("b4", "b"), ("c4", "b") , ("d3", "w"), ("d2", "w"), ("d1", "w")] -> 3
[] -> 0
[("b4", "b"), ("a4", b "), (" c4 ", w")] -> 0
[("b4", "b"), ("a4", b "), (" c4 ", b")] -> 1
[("a1", "b"), ("a4", "b"), ("a7", "b"), ("b2", "b"), ("b4", "b") , ("b6", "b"), ("c3", "b"), ("c4", "b"), ("c5", "b"), ("e3", "w") , ("e4", "w"), ("e5", "w"), ("f2", "w"), ("f4", "w"), ("f6", "w") , ("g1", "w"), ("g4", "w"), ("g7", "w")] -> 8

Codage heureux!

Denker
la source
Connexes - un peu.
insertusernamehere
Je suppose que les couleurs doivent être contiguës et alignées, mais ce n'est pas clair. Par exemple, d2, d3, d5 de la même couleur formeraient-ils un moulin?
Robert Benson
@RobertBenson Non, ce ne serait pas le cas d3et d5ne sont pas connectés. Règles disent: Three men of the same color form a mill when they are in a straight row of connected points.. J'ai ajouté quelques exemples dans cette section pour que ce soit clair, merci pour le commentaire!
Denker

Réponses:

4

APL (Dyalog Classic) , 26 25 octets

-1 grâce à FrownyFrog

≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢

Essayez-le en ligne!

L'argument est un tableau 3x3x3 de 1(noir), ¯1(blanc) et 0(vide). La première dimension se situe le long de la profondeur d'imbrication des carrés concentriques. Les deux autres dimensions se situent le long des axes vertical et horizontal.

000---------001---------002
 |           |           |
 |  100-----101-----102  |
 |   |       |       |   |
 |   |  200-201-202  |   |
 |   |   |       |   |   |
010-110-210     212-112-012
 |   |   |       |   |   |
 |   |  220-221-222  |   |
 |   |       |       |   |
 |  120-----121-----122  |
 |           |           |
020---------021---------022

Nous avons un moulin chaque fois que la sommation le long d'un axe donne un 3ou ¯3, sauf que nous devons éliminer les quatre coins lors de la sommation le long du premier axe.

{} est une fonction avec un argument implicite

↓⍵est divisé - dans notre cas, il transforme un cube 3x3x3 en une matrice 3x3 de vecteurs de longueur 3 imbriqués

⍵⍪↓⍵ prend le cube d'origine et colle la matrice 3x3 de 3 vecteurs en dessous, nous obtenons donc un tableau mixte 4x3x3 de scalaires et de vecteurs

+/somme le long du dernier axe; cela a pour effet combiné de sommer le cube d'origine le long du dernier axe ( +/⍵) et de le sommer le long de l'axe du milieu en raison de la division que nous avons faite ( +/↓⍵)

Maintenant, nous devons nous occuper du cas particulier du premier axe.

+⌿⍵ somme le long du premier axe, renvoyant une matrice 3x3

4 2⍴ mais nous ne devons pas compter les coins, nous le remodelons donc en une matrice 4x2 comme ceci:

ABC      AB
DEF  ->  CD
GHI      EF
         GH  ("I" disappears)

maintenant nous ne sommes intéressés que par la dernière colonne ( BDFH), nous utilisons donc l'idiome⊢/

,concatène BDFHà la matrice que nous avons obtenue auparavant pour les 2e et 3e axes ( BDFHet la matrice a toutes deux une dimension de tête de 4)

aplatit tout ce que nous avons obtenu jusqu'à présent en un seul vecteur

| prend les valeurs absolues

{ }∩≢ filtre uniquement les trois - la longueur (≢) de l'entrée est toujours 3

les compte

ngn
la source
Hé, j'étais sur le point de suggérer cela.
2017
Pouvez-vous rejoindre chat.stackexchange.com/rooms/52405/apl pendant un moment?
Adám
≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢est un plus court :)
FrownyFrog
@FrownyFrog merci! édité en
ngn
4

JavaScript (ES6), 276 228 125 117 105 octets

a=>btoa`i·yø!9%z)ª»-ºü1j;ÝÈ%¥·¡ªÜ"·ç¹Ê1`.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

(ce qui précède contient des caractères ascii non imprimables qui n'apparaîtront pas ici, alors voici une version sans le btoaqui peut être copiée et exécutée)

a=>'abcdefghijklmnopqrstuvwxajvdksglpbehqtwimrfnucox'.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

Décompose une chaîne de référence en triplets de lettres qui correspondent aux clés de groupe de fraisage. L'entrée se présente sous la forme d'un objet, où les clés sont les lettres a-x, commençant en bas à gauche et se terminant en haut à droite, se déplaçant de gauche à droite en premier. Les valeurs sont 1pour le blanc, le -1noir et le 0blanc.

Exemple

{b:1,d:-1,e:1,f:-1,i:1,k:-1,l:-1,m:1,n:-1,r:1,u:-1} => 2
{j:1,d:-1,k:-1,l:-1,b:1,e:1,i:1,m:1,r:1,f:-1,n:-1,u:-1,o:1} => 2
{a:-1,j:-1,v:-1,k:-1,l:-1,h:1,e:1,b:1} => 3
{} => 0
{k:-1,j:-1,l:1} => 0
{k:-1,j:-1,l:1} => 1
{a:-1,j:-1,v:-1,d:-1,k:-1,s:-1,g:-1,l:-1,p:-1,i:1,m:1,r:1,f:1,n:1,u:1,c:1,o:1,x:1} => 8

Ces exemples sont tirés des exemples d'OP, convertis en objet clé-lettre et valeur-nombre. La première provient de l'exemple d'image, tandis que les autres proviennent de l'ensemble d'exemples.

Mwr247
la source
1
Bon travail! Vous pouvez compresser la grosse chaîne avec atob.
ETHproductions
@ETHproductions Merci! Il semble cependant utiliser des caractères ascii non imprimables, donc j'en inclurai un sans le btoaaussi. A également trouvé quelques autres améliorations qui le réduisent encore plus.
Mwr247
2

Mathematica, 217 131 octets

Bien que je sois sûr que ce n'est pas particulièrement compétitif, voici une entrée pour vous.

Count[Total/@{{a1,d1,g1},{b2,d2,f2},{c3,d3,e3},{a4,b4,c4},{e4,f4,g4},{c5,d5,e5},{b6,d6,f6},{a7,d7,g7},{a1,a4,a7},{b2,b4,b6},{c3,c4,c5},{d1,d2,d3},{d5,d6,d7},{e3,e4,e5},{f2,f4,f6},{g1,g4,g7}}/.#/.{"w"->1,"b"->2},3|6]&

Exemple d'entrée:

{a4 -> "w", b2 -> "b", b4 -> "b", c4 -> "b", d1 -> "w", d2 -> "w", e3 -> "w", e4 -> "w", e5 -> "w", f2 -> "b", f4 -> "b", f6 -> "b", g4 -> "w"}

Autoriser les noms de coordonnées à un seul caractère joue de manière triviale avec 51 caractères, ce qui en fait une solution de 166 octets. Nommer les joueurs 1 et 2 plutôt que "w" et "b" joue avec 17 autres personnages.

Nous obtenons donc

Count[Total/@{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,a,j,v,d,k,s,g,l,p,b,e,h,q,t,w,r,i,m,f,u,n,c,o,x}~Partition~3,3|6]/.#&
A Simmons
la source
Si je comprends bien les règles de formatage d'entrée, vous devriez pouvoir les prendre en tant que 1et 2. l'exemple utilisé wet b, mais je suis assez certain que nous ne sommes pas limités à cela.
Mwr247
@ Mwr247 Vous avez raison. Vous pouvez utiliser n'importe quel format que vous souhaitez, tant qu'il n'ajoute pas d'informations supplémentaires. Je clarifierai cela quand je serai à la maison.
Denker
1

APL (Dyalog Unicode) , 50 octets

"La solution des objets"

Bien que plus longue (29 caractères) que la solution de @ ngn , elle utilise une approche entièrement différente: l'entrée a la même structure globale que cette solution, mais tous les emplacements sont représentés comme des objets. Les emplacements vides (y compris la colonne centrale inexistante) doivent être des objets vides. tandis que tous les hommes noirs doivent être des références à l'objet "homme noir", et tous les hommes blancs doivent être des références à l'objet "homme blanc". Tous les objets peuvent éventuellement être agréable D isplay F ORM s pour une meilleure lisibilité, et ainsi de la colonne centrale peut éventuellement être rendu invisible.

+/1=(≢¨(,∪/,∪⌿⍤2),(⊢/4 2⍴∪⌿))

Essayez-le en ligne!

+/ la somme de

1=() Ceux de

≢¨(… Les ) décomptes de

  , le ravelé (aplati)

  ∪/ ensembles uniques à travers

  , concaténé à

  ∪⌿⍤2 ensembles uniques

,() Concaténé à

  ⊢/ la colonne la plus à droite de

  4 2⍴ le, remodelé en quatre lignes et deux colonnes,

  ∪⌿ ensembles de colonnes uniques

Un opérateur au sommet , fourni avec AGL ( ä), ramènerait la longueur à 27 caractères .

Adam
la source