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]&
Erläuterung:
(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
]&
Reine Funktion, die ein 5x5Array akzeptiert . ist das 3-Byte-Zeichen U+F3C7für den privaten Gebrauch, das den Postfix-Transponierungsoperator darstellt \[Transpose].
(f=Flatten@#;p=Partition): Glättet die Eingabeliste und speichert sie in f. Legt es fest p = Partitionund gibt es zurück.
g=p[r,5]: Das Array {{1,2,3,4,5}, ..., {21,22,23,24,25}}(dies liegt daran, dass res auf gesetzt wird Range@25).
Join[g=p[r,5],g]: die Liste der Zeilen und Spalten von g.
p[#,2,1]&: Reine Funktion, die die Liste #in Unterlisten 2mit einer Überlappung unterteilt 1; dh die Liste benachbarter Paare in #.
##&@@p[#,2,1]&: Wie oben, außer dass a zurückgegeben wird Sequence.
##&@@p[#,2,1]&/@Join[g=p[r,5],g]: Ordnet die vorherige Funktion der Zeilen und Spalten von gzu, um eine Liste aller benachbarten Einträge in zu erhalten g. Mein Bauch sagt, dass es einen kürzeren Weg gibt, dies zu tun.
r~Graph~Cases[...]: Graph, dessen Eckpunkte die ganzen Zahlen sind 1, ..., 25und dessen Kanten die Kanten zwischen benachbarten Einträgen sind, in gdenen dieselben entsprechenden Einträge im Eingabearray vorhanden sind (außer " ")
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ": Muster, das so übereinstimmt {a,b}, dass f[[a]] == f[[b]](gleicher Wert im Eingabearray) und das nicht gleich ist " ". Set A = f[[a]]speichern 1Byte.
...:>a<->b: Ersetzen Sie jede Übereinstimmung durch eine ungerichtete Kante von a nach b.
VertexComponent: Gibt die verbundene Komponente des zweiten Arguments (einen Scheitelpunkt) im ersten Argument (ein Diagramm) zurück.
Tr[1^VertexComponent[...]]: Die Größe der angeschlossenen Komponente. Speichert 1Byte von Length@VertexComponent[...].
If[Tr[...]<3,f[[#]],"x"]&: Reine Funktion, die einen Eintrag #in nimmt g. Wenn die Größe der angeschlossenen Komponente kleiner als ist 3, ersetzen Sie sie durch den entsprechenden Eintrag in der Eingabe. Andernfalls ersetzen Sie es durch "x".
(f=Flatten@#;p=Partition)[...,5]: Und schließlich das Ergebnis in ein 5x5Array umformen .