Wyobraź sobie dwuwymiarową tablicę wartości boolowskich, gdzie 0 oznaczają kwadraty trawy na prostokątnej działce, a 1 oznaczają ogrodzenie.
Napisz funkcję, która akceptuje tablicę 2D jako dane wejściowe i określa, czy możesz podróżować z dowolnego obszaru trawy do dowolnego innego obszaru trawy, używając tylko ruchów północ / wschód / zachód / południe, bez wpadania na płot.
Jeśli jakikolwiek obszar trawy w tablicy jest całkowicie otoczony płotami (co oznacza, że nie można podróżować N / E / W / S, aby dotrzeć do każdego innego obszaru trawy w tablicy), funkcja powinna zwrócić wartość false; w przeciwnym razie powinien zwrócić wartość true.
Poniżej znajdują się dwie przykładowe tablice, których możesz użyć jako danych wejściowych, chociaż twoja funkcja powinna być w stanie obsłużyć nie tylko te, ale dowolną tablicę 2D wartości logicznych:
0 0 0 0 0
0 1 0 0 0
0 1 1 1 1
0 0 0 0 0
0 0 0 1 1
(should return true)
0 1 0 1 0
0 1 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 1 1 0
(should return false, since the middle 0 in the top row is fully enclosed)
Wygrywa najkrótszy działający kod. Wybiorę zwycięzcę po upływie tygodnia lub nowych zgłoszeń w ciągu 24 godzin.
1 1 1
;1 0 1
;1 1 1
? W centrum znajduje się jedna komórka trawiasta. Wizualnie komórka trawy w środku jest całkowicie ogrodzona płotami, ale z twojej definicji tak nie jest.Odpowiedzi:
Matlab 45
źródło
input('');c=bwconncomp(~ans,4);c.NumObjects<2
To daje 45 znaków.APL (39)
Stosowanie:
źródło
Mathematica,
6058 znakówStosowanie:
źródło
f=Max@WatershedComponents[Image@#,CornerNeighbors->1>2]<2&
Ruby,
202198193Wypełnia zalanie, a następnie sprawdza, czy pozostały zera.
źródło
PHP 147
202177165149bajtówEDYCJA Pobiłem swój hack gzip z prawdziwym rozwiązaniem php.
Trochę długi .... wejście jako ciąg tekstowy, bez spacji, wiersze oddzielone znakami nowej linii. Powodzi wypełnia się
c
s, a następnie sprawdza, czy pozostały zera. W pętli używamexp
jako surowej górnej granicy liczby wymaganych iteracji. Korzystam z symetrii do obsługi zduplikowanych przypadków przy mniejszym kodzieOto przypadek testowy bez golfa:
źródło
Excel VBA,
305215 bajtówTak, haha VBA , ale macierzowy charakter problemu sugeruje praktyczne rozwiązanie w Excelu (plus ktoś już przesłał odpowiedź w moich innych językach!). Oczywiście VBA nie będzie najbardziej zwięzły, ale myślę, że to rozsądne.
Ta powódź wypełnia się z dowolnego punktu początkowego, a następnie sprawdza, czy pozostała „trawa”
R jest zakresem arkusza z zerami i zerami reprezentującymi ogrodzenia i trawę zgodnie z definicją problemu. Premia, pole gry nie musi być prostokątne ani nawet ciągłe.
Na przykład zwróci wartość False. Zera po prawej stronie nie mogą być osiągnięte z zer po lewej stronie. Nieregularne pole go nie łamie.
Kilka uwag na temat gry w golfa.
Myślę, że niektóre znaki mogą zostać przycięte, jeśli wymaganie zostało odwrócone w stosunku do 1 i 0, ale niewystarczająco, aby warto było odwrócić.
VBA nalega na kilka białych znaków (a = b vs a = b), co nie pomaga w liczeniu znaków.
S należy wyraźnie zadeklarować jako zakres. Jeśli pozostawia wariant, zmienia się w wartość zakresu, a nie w zakres.
Może lepszy sposób na rozgałęzienie powodzi? Nie mogłem wymyślić pętli, która oszczędziłaby dowolne znaki, aby wysłać ją N / E / S / W
Edycja: ponownie przeanalizuj skrzynkę podstawową przy wypełnieniu powodziowym, udało się ją nieco przyciąć, sprawdzając, czy jest ona w skrzynce podstawowej po rekurencji, zamiast zapobiegać rekurencji.
źródło
Python (219 bajtów)
Zdecydowanie nie najkrótszy, ale to moja pierwsza próba tutaj, więc jestem z tego dumny:
Dane wejściowe powinny być ciągiem zer i jedynek, w których wiersze są rozdzielane znakiem nowej linii (\ n).
Przykładowe użycie:
źródło
and
, myślę, że to oszczędza trochę znakówPython (196)
Standardowe wypełnienie zalewowe.
Prowadzi macierz przez STDIN, a każdy wiersz jest oddzielony pojedynczą spacją. Na przykład „01010 01100 00000 00010 11110”.
źródło
Mathematica 53
Wywołuje funkcję wewnętrzną
Image`MorphologicalOperationsDump`imageBinaryLabel
, która jest podobna doMorphologicalComponents
.źródło
PHP (286 znaków)
O wiele za długo, prawdopodobnie przeszedłem długą drogę.
Nie golfa:
źródło
C #, 235 bajtów
Próbuje zalać każdą komórkę na planszy, sprawia, że tylko jeden zwrot wypełnienia jest prawdziwy.
źródło
Python 2.X + 3.X: 335 znaków
Gra w golfa:
Nie golfowany:
źródło