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]&
Explicação:
(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
]&
Função pura que aceita uma 5x5
matriz.
é o caractere de uso privado de 3 bytes que U+F3C7
representa o operador de transposição do postfix \[Transpose]
.
(f=Flatten@#;p=Partition)
: Nivela a lista de entrada e a armazena f
. Define p = Partition
e retorna.
g=p[r,5]
: A matriz {{1,2,3,4,5}, ..., {21,22,23,24,25}}
(isso ocorre porque r
é definido como Range@25
).
Join[g=p[r,5],g]
: a lista de linhas e colunas de g
.
p[#,2,1]&
: Função pura que divide a lista #
em sublistas de comprimento 2
com sobreposição 1
; ou seja, a lista de pares adjacentes em #
.
##&@@p[#,2,1]&
: O mesmo que acima, exceto que retorna a Sequence
.
##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Mapeia a função anterior das linhas e colunas de g
para obter uma lista de todas as entradas adjacentes em g
. Meu intestino diz que há uma maneira mais curta de fazer isso.
r~Graph~Cases[...]
: Gráfico cujos vértices são os números inteiros 1, ..., 25
e cujas arestas são as arestas entre entradas adjacentes nas g
quais têm as mesmas entradas correspondentes na matriz de entrada (diferente de " "
)
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Padrão que corresponde a {a,b}
tal que f[[a]] == f[[b]]
(mesmo valor na matriz de entrada) e que não é igual a " "
. Defina A = f[[a]]
para salvar o 1
byte.
...:>a<->b
: Substitua todas as correspondências por uma borda não direcionada de a a b.
VertexComponent
: Retorna o componente conectado do segundo argumento (um vértice) no primeiro argumento (um gráfico).
Tr[1^VertexComponent[...]]
: O tamanho do componente conectado. Salva 1
byte de Length@VertexComponent[...]
.
If[Tr[...]<3,f[[#]],"x"]&
: Função pura que leva uma entrada #
no g
. Se o tamanho do componente conectado for menor que 3
, substitua-o pela entrada correspondente na entrada. Caso contrário, substitua-o por "x"
.
(f=Flatten@#;p=Partition)[...,5]
: E, finalmente, remodelar o resultado para ser uma 5x5
matriz.