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 5x5
tablicę.
to 3-bajtowy prywatny znak U+F3C7
reprezentujący operator transpozycji Postfiksa \[Transpose]
.
(f=Flatten@#;p=Partition)
: Spłaszcza listę wejściową i zapisuje ją f
. Ustawia p = Partition
i zwraca.
g=p[r,5]
: Tablica {{1,2,3,4,5}, ..., {21,22,23,24,25}}
( dzieje się tak, ponieważ r
zostaje 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 2
z 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 g
celu 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, ..., 25
a których krawędzie są krawędziami między sąsiednimi wpisami, w g
któ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ć 1
bajt.
...:>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 1
bajt 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 5x5
tablicę.