Mathematica 188 185 170 115 130 46 48 znaków
Wyjaśnienie
We wcześniejszych wersjach stworzyłem wykres pozycji, w których odległość od szachownicy wynosi 1. GraphComponents
następnie ujawnił liczbę wysp, po jednej na komponent.
Obecna wersja używa MorphologicalComponents
do znajdowania i numerowania klastrów w tablicach - regionach, w których 1
fizycznie sąsiadują ze sobą. Ponieważ tworzenie wykresów nie jest konieczne, powoduje to ogromną oszczędność kodu.
Kod
Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&
Przykład
Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}}]
5
Jak to działa
Dane są wprowadzane jako tablica; w Mathematica jest to lista list.
W tablicy wejściowej dane są zamieniane na 1
„i 0
” przez zamianę
/.{"."->0,"*"->1}
gdzie /.
jest forma infiksowa, ReplaceAll
po której następują reguły zastępowania. To zasadniczo przekształca tablicę w obraz czarno-biały. Wszystko, co musimy zrobić, to zastosować tę funkcję Image
.
Image[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}} /. {"." -> 0, "*" -> 1}]
Białe kwadraty odpowiadają komórkom o wartości 1.
Poniższy obrazek pokazuje kilka kroków, jakie stosuje to podejście. Matryca wejściowa zawiera tylko 1
„i 0
”. Macierz wyjściowa oznacza każdy klaster morfologiczny liczbą. (Owinąłem macierze wejściową i wyjściową, MatrixForm
aby podkreślić ich dwuwymiarową strukturę).
MorphologicalComponents
zastępuje 1
s liczbą całkowitą odpowiadającą numerowi klastra każdej komórki.
Max
zwraca największy numer klastra.
Wyświetlanie wysp
Colorize
pokoloruje każdą wyspę wyjątkowo.