Mathematica, 180 bajtów
(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]&
Wyjaśnienie:
(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
]&
Czysta funkcja, która akceptuje 5x5tablicę. to 3-bajtowy prywatny znak U+F3C7reprezentujący operator transpozycji Postfiksa \[Transpose].
(f=Flatten@#;p=Partition): Spłaszcza listę wejściową i zapisuje ją f. Ustawia p = Partitioni zwraca.
g=p[r,5]: Tablica {{1,2,3,4,5}, ..., {21,22,23,24,25}}( dzieje się tak, ponieważ rzostaje ustawiona na Range@25).
Join[g=p[r,5],g]: lista wierszy i kolumn g.
p[#,2,1]&: Czysta funkcja #dzieląca listę na podlisty o długości 2z nakładaniem się 1; tj. lista sąsiednich par w #.
##&@@p[#,2,1]&: Tak samo jak powyżej, z tym że zwraca a Sequence.
##&@@p[#,2,1]&/@Join[g=p[r,5],g]: Odwzorowuje poprzednią funkcję wierszy i kolumn w gcelu uzyskania listy wszystkich sąsiednich pozycji w g. Mój żołądek mówi, że jest na to krótszy sposób.
r~Graph~Cases[...]: Wykres, którego wierzchołki są liczbami całkowitymi, 1, ..., 25a których krawędzie są krawędziami między sąsiednimi wpisami, w gktórych te same odpowiadające wpisy w tablicy wejściowej (inne niż " ")
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" ": Wzorzec, który pasuje do {a,b}tego f[[a]] == f[[b]](ta sama wartość w tablicy wejściowej) i który nie jest równy " ". Ustaw, A = f[[a]]aby zapisać 1bajt.
...:>a<->b: Zamień każde dopasowanie na nieukierunkowaną krawędź od a do b.
VertexComponent: Zwraca połączony składnik drugiego argumentu (wierzchołek) w pierwszym argumencie (wykres).
Tr[1^VertexComponent[...]]: Rozmiar podłączonego komponentu. Zapisuje 1bajt z Length@VertexComponent[...].
If[Tr[...]<3,f[[#]],"x"]&Pure funkcja, która zajmuje pozycję #w g. Jeśli rozmiar podłączonego komponentu jest mniejszy niż 3, zastąp go odpowiednim wpisem na wejściu. W przeciwnym razie zastąp go "x".
(f=Flatten@#;p=Partition)[...,5]: I w końcu przekształć wynik w 5x5tablicę.