Mathematica 188 185 170 115 130 130 46 48 caracteres
Explicação
Nas versões anteriores, fiz um gráfico de posições com uma distância de 1 no tabuleiro de xadrez. GraphComponents
depois revelou o número de ilhas, uma por componente.
A presente versão usa MorphologicalComponents
para encontrar e numerar clusters de unidades no array - regiões onde 1
são fisicamente contíguas. Como os gráficos são desnecessários, isso resulta em uma enorme economia de código.
Código
Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&
Exemplo
Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}}]
5
Como funciona
Os dados são inseridos como uma matriz; no Mathematica, esta é uma lista de listas.
Na matriz de entrada, os dados são convertidos em 1
's 0
' pela substituição
/.{"."->0,"*"->1}
onde /.
é uma forma infix ReplaceAll
seguida por regras de substituição. Isso basicamente converte a matriz em uma imagem em preto e branco. Tudo o que precisamos fazer é aplicar a função Image
,.
Image[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}} /. {"." -> 0, "*" -> 1}]
Os quadrados brancos correspondem às células com o valor 1.
A figura abaixo mostra alguns passos que a abordagem usa. A matriz de entrada contém apenas 1
's e 0
' s. A matriz de saída rotula cada cluster morfológico com um número. (Coloquei as matrizes de entrada e saída MatrixForm
para destacar sua estrutura bidimensional.)
MorphologicalComponents
substitui 1
s por um número inteiro correspondente ao número do cluster de cada célula.
Max
retorna o maior número de cluster.
Exibindo as Ilhas
Colorize
colorirá cada ilha exclusivamente.