Rozważ przedstawienie prostej , otwartej , dwuwymiarowej krzywej na siatce tekstu o szerokości W i szerokości H, gdzie X
reprezentuje część krzywej i .
reprezentuje pustą przestrzeń i nie używa się żadnych innych znaków.
Każda przestrzeń siatki ma 8 sąsiednich pól siatki, sąsiedztwo Moore . Przestrzenie siatki poza granicami są uważane za puste.
Siatka zawiera krzywą, jeśli ma dokładnie jedną X
OR, jeśli ma więcej niż jedną, X
gdzie:
- Dokładnie dwa
X
s mają tylko jeden sąsiadującyX
. To są punkty końcowe krzywej. - Każdy
X
oprócz punktów końcowych sąsiadów dokładnie dwaX
s. Tworzą one większość krzywej.
Na przykład ta siatka, w której W = 9 i H = 4 zawiera krzywą:
....X.... .X.X.X.X. X..X..X.X .XX.....X
Podobnie, te siatki (W = 4, H = 3) mają krzywe:
.... .X.. .... .... .X.X .... X..X ..X. XX.. X.X. ..X. .XX. .X.. .... ....
Te siatki nie zawierają jednak krzywej:
.... .XX. ...X XX.. .... X.X. .... X..X ..XX XX.. .X.X .X.. .... .XX. .X.. .... ...X X.X.
Długość krzywej możemy znaleźć, sumując odległości między wszystkimi sąsiadującymi parami X
s:
Odległość między dwoma sąsiadującymi prostopadle
X
s wynosi 1 jednostkę.XX
X X
Odległość między dwoma sąsiednimi ukośnie
X
s wynosi units2 jednostki.X. .X
.X X.
Na przykład długość krzywej w siatce
XXX. ...X ..X.
może być zwizualizowane jako
więc możemy zobaczyć, że jest to 1 + 1 + √2 + √2 = 4,828427 ...
Długość krzywej z tylko jednym X
wynosi zero.
Gdy siatka nie tworzy krzywej, jej długość nie jest dobrze określona.
Wyzwanie
Biorąc pod uwagę siatkę tekstu X
s i .
s, wypisz długość zawartej krzywej lub wypisz coś takiego jak -1
lub, Null
aby wskazać, że siatka nie ma krzywej.
Do wprowadzania można używać innych znaków niż X
i, .
jeśli to pożądane, a H i W mogą być przyjmowane jako dane wejściowe w razie potrzeby. Wprowadzanie jako zagnieżdżona lista lub macierz wypełniona 1 i 0 zamiast ciągów również jest w porządku.
Możesz wyprowadzić liczbę zmiennoprzecinkową dla długości krzywej lub alternatywnie dwie liczby całkowite A i B gdzie length = A + B*√2
.
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
XXX.
...X
..X.
2 + 2*√2 = 4.828427...
....X....
.X.X.X.X.
X..X..X.X
.XX.....X
3 + 8*√2 = 14.313708...
....
....
..X.
0 + 0*√2 = 0
.X..
X..X
.XX.
1 + 3*√2 = 5.242640...
....
..X.
.X..
0 + 1*√2 = 1.414213...
....
XX..
....
1 + 0*√2 = 1
.X.X
X.X.
....
0 + 3*√2 = 4.242640...
....
....
....
....
-1
.XX.
X..X
.XX.
-1
...X
..XX
.X..
-1
....
.X.X
...X
-1
X.X.
.X..
X.X.
-1
źródło
[x.x,...,.x.]
nie jest poprawna krzywa, prawda?Odpowiedzi:
MATL ,
5251 bajtówDane wejściowe to macierz zer i jedynek.
Wyjście jest
B
więcA
. Brak krzywych daje wynik ujemnyA
.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Przy obliczaniu długości krzywej wykorzystuje się dwa zwoje 2D 1 : jeden z maską Moore'a, a drugi z maską zawierającą tylko ukośnych sąsiadów. Wyniki są dwie macierze o tej samej wielkości wejściowych, które będą oznaczone jako M i D , odpowiednio. M podaje całkowitą liczbę sąsiadów dla każdego punktu, podczas gdy D podaje liczbę diagonalnych sąsiadów.
Wyniki w M i D muszą być filtrowane, aby odrzucić punkty, które nie należą do krzywej. Ponadto należy je podzielić przez 2, ponieważ „bycie sąsiadem” jest relacją symetryczną, więc każdy punkt na krzywej jest liczony dwukrotnie.
Ustalenie, czy krzywa jest poprawna, jest bardziej kłopotliwe niż się spodziewałem. Aby to zrobić, kod testuje trzy warunki:
2
? (Czy są dokładnie dwa punkty z jednym sąsiadem?)2
minus2
? (Wraz z warunkiem 1 sprawdza się, czy wszystkie niezerowe wartości w M, z wyjątkiem dwóch równych2
)Krzywa jest ważna, jeśli warunki 1 i 2 są prawdziwe, lub jeśli warunek 3 jest spełniony.
1 Konwolucja jest kluczem do sukcesu .
źródło
Python 3 ,
316315311 bajtówMyślę, że dotyczy to wszystkich przypadków; przynajmniej przypadki testowe działają.
Ponadto z pewnością jest jeszcze wiele do gry w golfa, prawdopodobnie na początku, gdy obsługiwane są skrzynki krawędziowe.
Wypróbuj online!
Jak to działa:
d,R,C
to 1. lista list z 1 jako krzywą i 0 jako tłem, 2. liczbą wierszy i kolumnd
, abyśmy nie musieli martwić się o krawędź tablicy 2dDzięki @Helka Homba za wskazanie brakującej sprawy. Dzięki @TuukkaX i @Trelzevir za wskazówki dotyczące gry w golfa.
źródło
d=[[1,0,1],[0,1,0],[1,0,1]]
że tutaj się nie powiedzie (dodana walizka testowa).s=sum
oszczędza 4 bajty.Mathematica,
153150 bajtówPobiera tablicę 2D z
0
s dla.
s i1
s dlaX
s. Dane wyjścioweNull
dla nie-krzywych.Mathematica ma do tego wbudowane 45 bajtów, ale generuje pewne liczby dla niekrzywych i 1 / sqrt (2) dla danych wejściowych
{{1}}
. Korekta tych kosztów kosztuje 105 bajtów (czy można grać w golfa?).źródło