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