Математика, 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]&
: Те саме, що вище, за винятком того, що він повертає 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
масив.