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]&:リストを重複する#長さのサブリストに分割する純粋な関数。つまり、の隣接ペアのリスト。21#
##&@@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:最初の引数(グラフ)の2番目の引数(頂点)の接続コンポーネントを返します。
Tr[1^VertexComponent[...]]:接続されているコンポーネントのサイズ。1からバイトを保存しますLength@VertexComponent[...]。
If[Tr[...]<3,f[[#]],"x"]&:エントリー取るピュア機能#ではg。接続されているコンポーネントのサイズがより小さい場合3は、入力の対応するエントリに置き換えます。それ以外の場合は、"x"ます。
(f=Flatten@#;p=Partition)[...,5]:最後に、結果を5x5配列に再形成します。