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представляющий оператор транспонирования postfix\[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]&: Pure функция, которая разбивает список #на подсписки длины 2с перекрытием 1; т.е. список соседних пар в #.
##&@@p[#,2,1]&: То же, что и выше, но возвращает a 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массив.