Mathematica, 180 bytes
(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]&
Explicación:
(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
]&
Función pura que acepta una 5x5
matriz.
es el carácter de uso privado de 3 bytes que U+F3C7
representa el operador de transposición postfix\[Transpose]
.
(f=Flatten@#;p=Partition)
: Aplana la lista de entrada y la almacena f
. Lo establece p = Partition
y lo devuelve.
g=p[r,5]
: La matriz {{1,2,3,4,5}, ..., {21,22,23,24,25}}
(esto se debe a que r
se establece en Range@25
).
Join[g=p[r,5],g]
: la lista de filas y columnas de g
.
p[#,2,1]&
: Función pura que divide la lista #
en sublistas de longitud 2
con superposición 1
; es decir, la lista de pares adyacentes en #
.
##&@@p[#,2,1]&
: Igual que el anterior, excepto que devuelve a Sequence
.
##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Asigna la función anterior de las filas y columnas de g
para obtener una lista de todas las entradas adyacentes en g
. Mi instinto dice que hay una forma más corta de hacer esto.
r~Graph~Cases[...]
: Gráfico cuyos vértices son los enteros 1, ..., 25
y cuyos bordes son los bordes entre las entradas adyacentes en las g
que tienen las mismas entradas correspondientes en la matriz de entrada (que no sea" "
)
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Patrón que coincide de {a,b}
tal manera f[[a]] == f[[b]]
(mismo valor en la matriz de entrada) y que no son iguales a " "
. Establecer A = f[[a]]
para guardar el 1
byte.
...:>a<->b
: Reemplace cada partido con un borde no dirigido de a a b.
VertexComponent
: Devuelve el componente conectado del segundo argumento (un vértice) en el primer argumento (un gráfico).
Tr[1^VertexComponent[...]]
: El tamaño del componente conectado. Guarda 1
byte de Length@VertexComponent[...]
.
If[Tr[...]<3,f[[#]],"x"]&
: Función pura que tiene una entrada #
en g
. Si el tamaño de su componente conectado es menor que 3
, reemplácelo con la entrada correspondiente en la entrada. De lo contrario, reemplácelo con"x"
.
(f=Flatten@#;p=Partition)[...,5]
: Y finalmente, rediseñar el resultado para que sea una 5x5
matriz.