Mathematica,180个字节
(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]&
说明:
(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
]&
接受5x5数组的纯函数。是3个字节的专用字符,U+F3C7代表后缀转置运算符\[Transpose]。
(f=Flatten@#;p=Partition):拼合输入列表并将其存储在中f。设置p = Partition并返回它。
g=p[r,5]:数组{{1,2,3,4,5}, ..., {21,22,23,24,25}}(这是因为r将其设置为Range@25)。
Join[g=p[r,5],g]:的行和列的列表g。
p[#,2,1]&:将列表#分成长度2重叠的子列表的纯函数1; 即,中的相邻对的列表#。
##&@@p[#,2,1]&:与上述相同,但返回Sequence。
##&@@p[#,2,1]&/@Join[g=p[r,5],g]:映射的行和列的前一个功能,g以获取中所有相邻条目的列表g。我的直觉说,有一种较短的方法可以做到这一点。
r~Graph~Cases[...]:图的顶点是整数,1, ..., 25并且边是相邻条目之间的边,相邻条目在g输入数组中具有相同的对应条目(除外" ")
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ":模式相匹配{a,b},使得f[[a]] == f[[b]](输入数组中相同的值),并且是不等于" "。设置A = f[[a]]为保存1字节。
...:>a<->b:用从a到b的无向边替换所有匹配项。
VertexComponent:返回第一个参数(图形)中第二个参数(顶点)的连接分量。
Tr[1^VertexComponent[...]]:连接的组件的大小。1从中保存字节Length@VertexComponent[...]。
If[Tr[...]<3,f[[#]],"x"]&:纯函数,它接受一个条目#在g。如果其连接的组件的大小小于3,则将其替换为输入中的相应条目。否则,将其替换为"x"。
(f=Flatten@#;p=Partition)[...,5]:最后将结果整形为5x5数组。