Mathematica, 180 byte
(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]&
Spiegazione:
(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
]&
Funzione pura che accetta un 5x5
array.
è il carattere di uso privato a 3 byte che U+F3C7
rappresenta l'operatore di trasposizione postfix \[Transpose]
.
(f=Flatten@#;p=Partition)
: Appiattisce l'elenco di input e lo memorizza f
. Imposta p = Partition
e restituisce.
g=p[r,5]
: L'array {{1,2,3,4,5}, ..., {21,22,23,24,25}}
(questo perché r
viene impostato su Range@25
).
Join[g=p[r,5],g]
: l'elenco di righe e colonne di g
.
p[#,2,1]&
: Funzione pura che suddivide l'elenco #
in elenchi di lunghezza di lunghezza 2
con sovrapposizione 1
; cioè, l'elenco delle coppie adiacenti in #
.
##&@@p[#,2,1]&
: Come sopra, tranne per il fatto che restituisce a Sequence
.
##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Mappa la funzione precedente delle righe e delle colonne di g
per ottenere un elenco di tutte le voci adiacenti in g
. Il mio istinto dice che c'è un modo più breve per farlo.
r~Graph~Cases[...]
: Grafico i cui vertici sono numeri interi 1, ..., 25
e i cui bordi sono i bordi tra le voci adiacenti in g
cui hanno le stesse voci corrispondenti nell'array di input (diverso da " "
)
{a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Pattern che corrisponde a {a,b}
tale f[[a]] == f[[b]]
(stesso valore nella matrice di input) e che non è uguale a " "
. Imposta A = f[[a]]
per salvare 1
byte.
...:>a<->b
: Sostituisci ogni partita con un bordo non orientato da a a b.
VertexComponent
: Restituisce il componente collegato del secondo argomento (un vertice) nel primo argomento (un grafico).
Tr[1^VertexComponent[...]]
: La dimensione del componente collegato. Salva 1
byte da Length@VertexComponent[...]
.
If[Tr[...]<3,f[[#]],"x"]&
: Pura funzione che prende una voce #
in g
. Se la dimensione del suo componente collegato è inferiore a 3
, sostituirlo con la voce corrispondente nell'input. Altrimenti, sostituirlo con "x"
.
(f=Flatten@#;p=Partition)[...,5]
: E infine rimodellare il risultato in un 5x5
array.