Mathematica, 180 octets
(f=Flatten@#;p=Partition)[If[Tr[1^VertexComponent[r~Graph~Cases[##&@@p[#,2,1]&/@Join[g=p[r,5],g],{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ":>a<->b],#]]<3,f[[#]],"x"]&/@(r=Range@25),5]&
Explication:
(f=Flatten@#;p=Partition)[
If[
Tr[1^VertexComponent[
r~Graph~Cases[
##&@@p[#,2,1]&/@Join[g=p[r,5],g],
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ":>a<->b
],
#
]]<3,
f[[#]],
"x"
]&/@(r=Range@25),
5
]&
Fonction pure qui accepte un 5x5
tableau.
est le caractère à usage privé de 3 octets U+F3C7
représentant l'opérateur de transposition postfix \[Transpose]
.
(f=Flatten@#;p=Partition)
: Aplanit la liste d'entrée et la stocke f
. Définit p = Partition
et retourne.
g=p[r,5]
: Le tableau {{1,2,3,4,5}, ..., {21,22,23,24,25}}
(c'est parce qu'il r
est réglé sur Range@25
).
Join[g=p[r,5],g]
: la liste des lignes et colonnes de g
.
p[#,2,1]&
: Fonction pure qui partitionne la liste #
en sous-listes de longueur 2
avec chevauchement 1
; c'est-à-dire la liste des paires adjacentes dans #
.
##&@@p[#,2,1]&
: Identique à ci-dessus sauf qu'il renvoie a Sequence
.
##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Mappe la fonction précédente des lignes et des colonnes de g
pour obtenir une liste de toutes les entrées adjacentes dans g
. Mon instinct dit qu'il existe un moyen plus court de le faire.
r~Graph~Cases[...]
: Graphique dont les sommets sont les entiers 1, ..., 25
et dont les arêtes sont les arêtes entre les entrées adjacentes dans g
lesquelles ont les mêmes entrées correspondantes dans le tableau d'entrée (autre que " "
)
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Modèle qui correspond {a,b}
tel que f[[a]] == f[[b]]
(même valeur dans le tableau d'entrée) et qui n'est pas égal à " "
. Réglez A = f[[a]]
pour enregistrer l' 1
octet.
...:>a<->b
: Remplacez chaque correspondance par un bord non orienté de a à b.
VertexComponent
: Renvoie la composante connectée du deuxième argument (un sommet) dans le premier argument (un graphique).
Tr[1^VertexComponent[...]]
: La taille du composant connecté. Enregistre l' 1
octet de Length@VertexComponent[...]
.
If[Tr[...]<3,f[[#]],"x"]&
: Pure fonction qui prend une entrée #
dans g
. Si la taille de son composant connecté est inférieure à 3
, remplacez-la par l'entrée correspondante dans l'entrée. Sinon, remplacez-le par "x"
.
(f=Flatten@#;p=Partition)[...,5]
: Et enfin remodeler le résultat en un 5x5
tableau.