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
数组。