Prosty konkurs zainspirowany pytaniem dotyczącym przepełnienia stosu :
Dostajesz obraz powierzchni sfotografowanej przez satelitę. Obraz jest bitmapą, na której woda jest oznaczona „
.
”, a ziemia jest oznaczona „*
”. Grupy sąsiadujących*
tworzą wyspę. (Dwa '*
' sąsiadują ze sobą, jeśli są poziomymi, pionowymi lub ukośnymi sąsiadami). Twoim zadaniem jest wydrukowanie liczby wysp na mapie bitowej.
Singiel *
liczy się również jako wyspa.
Przykładowe dane wejściowe:
.........**
**......***
...........
...*.......
*........*.
*.........*
Przykładowe dane wyjściowe:
5
Zwycięzcą jest wpis z najmniejszą liczbą bajtów w kodzie.
*
wyspa*
są również wyspami.Odpowiedzi:
Mathematica
188 185 170 115 130 4648 znakówWyjaś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órych1
fizycznie sąsiadują ze sobą. Ponieważ tworzenie wykresów nie jest konieczne, powoduje to ogromną oszczędność kodu.Kod
Przykład
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
„i0
” przez zamianę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
.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
„i0
”. 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ępuje1
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.źródło
MorphologicalComponents
chceImage
, ale nawet na v9 nie powinno tak byćMax@MorphologicalComponents[d/.{"."->0,"*"->1}]
? Oznacza to, że wymiana wykonana jako pierwsza?Max
zniknie przed dokonaniem wymiany, czyż nie?Max@MorphologicalComponents@d/.{"."->0,"*"->1}
nie działa, co ma sensMax@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]
, więc masz jeszcze jedną postać.Ruby 1.9 (
134121113110)Pobiera mapę na standardowe wejście lub nazwę pliku mapy jako pierwszy argument wiersza poleceń i wypisuje liczbę wysp na standardowe wyjście. Korzystanie z podstawowego rekurencyjnego wypełniania zalewowego. Ulepszenia mile widziane jak zawsze!
Podobnie jak w przypadku koloryzacji Davida, możesz również wyświetlić różne wyspy, zmieniając
$_[i]=?.
na$_[i]=c.to_s
ip c
naputs$_
, co dałoby ci coś takiego:(przynajmniej dopóki nie zabraknie cyfr!)
Niektóre przypadki testowe:
5
9
1
2)
3)
źródło
C, 169 znaków
Czyta mapę ze standardowego wejścia. Nie
r(j)
udało się poprawić funkcji rekursywnego wypełniania powodziowego, chociaż wygląda na to, że może być.źródło
Python 2,
223203 bajtówDziękujemy Stepowi Henowi i Arnoldowi Palmerowi za zgolenie 20 znaków spacji i niepotrzebne nawiasy!
Myślałem, że użycie wyrażeń listowych może zmniejszyć liczbę bajtów, ale nie zapewniło żadnej znaczącej poprawy.
Wypróbuj tutaj.
Próbuję przyciąć go wokół listy n (sąsiadów), ale nie udało mi się. Może ktoś inny wpadnie na jakieś pomysły dotyczące tej sekcji.
źródło
(s.index(l),i)
ifor
,enumerate(l)
iif
,-v[0])<2
iand
,p=0:
ip
orazbool(x&n[p])
ielse
. W wyciągu drukowanym masz także więcej nawiasów, niż jest to konieczne, ponieważ otaczają Cię 2 grupyset
. Edycja: Beat by StepHen, ponieważ robienie rzeczy na urządzeniach mobilnych nie jest idealne.Perl 5 , 100 bajtów
98 bajtów kodu + 2 bajty na
-p0
flagi.Wypróbuj online!
Dostosowanie (a raczej uproszczenie) mojej odpowiedzi na wyzwanie Ile otworów? . Możesz znaleźć wyjaśnienia dotyczące tego, jak działa ten kod w przypadku innej odpowiedzi (wyjaśnienie jest trochę długie, więc wolę nie wpisywać wszystkich wyjaśnień).
źródło
Python 2, 233 bajty
Za długi w porównaniu do innych odpowiedzi. Port mojej odpowiedzi na to pytanie .
Wypróbuj online
źródło
JavaScript, 158 bajtów
Niekompetentna odpowiedź ES6 (wyzwanie dla postdatów językowych) dla 132 bajtów:
Port mojej odpowiedzi na Ile otworów? (tak, wskakuję na modę, teraz, gdy widziałem, jak dwie inne osoby portują swoje odpowiedzi).
źródło
Python 2 , 225 bajtów
Wypróbuj online!
źródło