tło
Polyomino jest nazywany L-wypukłą , jeżeli jest to możliwe do podróży z dowolnego dachówka do jakiejkolwiek innej płytki przez ścieżką w kształcie litery L, czyli drogi, która przechodzi w kierunkach kardynalnych i zmienia kierunek co najwyżej raz. Na przykład poliomino 1
s na rysunku
0 0 1 1 1 0
1 1 1 1 0 0
1 1 0 0 0 0
nie jest wypukły w kształcie litery L, ponieważ obie ścieżki w kształcie litery L od dolnej lewej 1
do prawej górnej 1
zawierają 0
:
0>0>1>1>1 0
^ ^
1 1 1 1 0 0
^ ^
1>1>0>0>0 0
Jednak poliomino 1
s na tej figurze jest wypukłe w kształcie litery L:
0 1 1 1 0 0
1 1 1 1 1 1
0 1 1 0 0 0
Wejście
Twoje dane wejściowe to tablica 2D bitów w natywnym formacie Twojego języka lub ciąg znaków rozdzielany znakiem nowej linii, jeśli nasz język nie ma tablic. Gwarantuje, że zawiera co najmniej jeden 1
.
Wynik
Twój wynik powinien być prawdziwą wartością, jeśli zbiór 1
s jest L-wypukłym poliomino, i wartością fałszowania, jeśli nie. Te dane wyjściowe muszą być spójne: musisz wygenerować tę samą wartość prawdy dla wszystkich danych wejściowych wypukłych w kształcie litery L i tę samą wartość fałszowania dla innych. Zauważ, że rozłączony zestaw 1
s (który nie jest poliomino) powoduje powstanie fałszowania.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
Te przypadki testowe powinny również działać, jeśli obrócisz lub odzwierciedlisz tablice lub dodasz rzędy 0
s do dowolnych granic.
False instances
01
10
111
101
111
1101
1111
1110
1100
1000
0011
01100
11110
01110
00110
011000
011110
001111
True instances
1
01
11
010
111
010
001
011
111
11100
11110
01100
01000
011000
011000
111100
111111
001000
Odpowiedzi:
Ślimaki ,
4524Zaraz po opublikowaniu mojego pierwszego rozwiązania zdałem sobie sprawę, że istnieje o wiele lepszy sposób. Pierwotny program podróżował po kwadracie utworzonym przez ścieżki między dwoma
1
s, testując obecność 0 w każdej parze boków. Musiał też mieć specjalny przypadek dla ścieżek linii prostych. Nowa wersja zaczyna się od teleportacji z jednej1
do drugiej i testowania braku prostej lub w kształcie litery L ścieżki1
powrotnej do początku.źródło
Matlab, 182 bajty
Pomysł: Powtórz dla każdego
1
w macierzy poliomino:1
ale pozostałym zerem.1
w tej nowej matrycy (powtarzaj, aż nic się już nie zmieni)1
jako sąsiadów w kierunku x, jeśli są1
wielomian jako sąsiedzi1
w tej nowej matrycy (powtarzaj, aż nic się już nie zmieni)1
jako sąsiadów w kierunku x, jeśli są1
wielomian jako sąsiedziTeraz
1
w nowej macierzy należy objąć wszystko1
w macierzy wielomianowej, które są osiągalne z danego punktu początkowego, najpierw w kierunku x, a następnie w kierunku y. Teraz możemy powtórzyć ten sam proces, ale najpierw w kierunku y, a następnie w kierunku x. Teraz do każdej1
matrycy poliomino należy dotrzeć jednocześnie lub za każdym razem. Jeśli nie, to znaleźliśmy pozycję w macierzy wielomianu, do której nie można dotrzeć z każdej innej pozycji przezL
-path.Gra w golfa:
Z komentarzami:
Skrypt przypadków testowych:
źródło
JavaScript ES6, 290 bajtów
Ok, może nie zdobędzie żadnych nagród za zwięzłość, ale stosuje nowatorskie podejście. Zobacz wersję bez golfa, jak to działa.
Dowód tej metody można znaleźć w: Automaty komórkowe i dyskretne złożone systemy .
Nie golfowany:
źródło
Mathematica,
129127 bajtówWyjaśnienie:
Po pierwsze, jeśli w tym samym rzędzie lub kolumnie znajdują się
0
między dwoma1
sami, tablica nie jest wypukła w kształcie litery L, ponieważ nie możemy połączyć dwóch1
s.Po wykluczeniu tego przypadku co dwa
1
s w tym samym rzędzie lub kolumnie mogą być połączone prostą ścieżką. Możemy wygenerować wykres, którego wierzchołki są pozycjami1
s w tablicy, a krawędzie są parami1
s w tym samym rzędzie lub kolumnie. Następnie tablica jest wypukła w kształcie litery L, jeśli tylko wtedy, gdy średnica wykresu jest mniejsza niż 3.źródło
JavaScript (ES6) 174
Patrząc na siatkę pustych lub wypełnionych komórek, dla każdej pary wypełnionych komórek sprawdzam poziome ścieżki do drugiej kolumny komórek (może być 1, jeśli komórki znajdują się w tym samym rzędzie, w przeciwnym razie lub 2) i pionowe ścieżki do inny wiersz komórki (może być też 1 lub 2). Jeśli znajdę pustą komórkę w obu ścieżkach pionowych lub obu ścieżkach poziomych, wówczas między komórkami nie będzie ścieżki w kształcie litery L.
(Trudno mi było wytłumaczyć to wyjaśnienie - mam nadzieję, że było jasne)
Przetestuj poniższy fragment kodu w dowolnej przeglądarce zgodnej z EcmaScript 6
źródło