MATL , 54 51 49 bajtów
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
Dane wejściowe to tablica znaków 2D w formacie MATL (AB), z ;
separatorem wierszy. Dane wejściowe w przykładzie i przypadkach testowych wynoszą odpowiednio:
['11-011123';'111-010--';'0010---01';'111-01234']
['1']
['1-1-1-1';'-1-1-1-';'2-1-1-1';'-1-1-1-']
['12-45-';'4-65-9';'87-654';'12-487';'45----';'684764']
['111-12';'------';'21--10']
Wypróbuj online!
Wyjaśnienie
Działa to poprzez zbudowanie macierzy przyległości wykresu zdefiniowanej przez relację „bycie połączonym”. Jako przykład rozważ pole 3 × 4
52-4
15-8
3-72
Wpisy w tablicy 2D można łatwo opisać w MATL, stosując indeksowanie liniowe (główne kolumny). W przypadku 3 × 4 indeks liniowy każdego wpisu podaje się jako
1 4 7 10
2 5 8 11
3 6 9 12
Macierz przylegania jest budowana etapami przy użyciu mnożenia macierzy. W pierwszym etapie rozważani są najbliżsi sąsiedzi. Na przykład punkt o indeksie 3 jest sąsiadem samego siebie i tego o indeksie 2. Nie jest sąsiadem liczby 6, ponieważ punkt ten nie zawiera liczby zgodnej z polem. W tym przykładzie macierzą przyległości relacji „najbliższy sąsiad” jest macierz L 12 × 12 podana jako
1 1 0 1 0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0
0 1 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 0 1 1
(Widać, że kolumna 3 ma wartość 1
w wierszach 2 i 3.) Ta macierz jest zawsze symetryczna, a jej przekątna ma wartość 1
dla punktów, które nie zawierają -
.
Następnym krokiem byłaby macierz przyległości relacji „połączonej co najwyżej z jednym punktem pomiędzy ”. Aby go uzyskać, wystarczy pomnożyć L i ustawić niezerowe wpisy na 1
. Zasadniczo macierz przylegania relacji „połączonej jakąś ścieżką”, M , jest uzyskiwana przez podniesienie L do wykładnika wykładniczego (w sensie macierzowym), który reprezentuje maksymalną możliwą długość ścieżki. Górna granica maksymalna długość drogi jest liczba niezerowych w pozycji L .
Bezpośrednie obliczenie mocy macierzy może spowodować przepełnienie, ponieważ szybko pojawiają się duże liczby. Dlatego lepiej jest stopniowo pomnożyć przez tę samą macierz, konwertując niezerowe wpisy na 1 po każdym kroku, aby zapobiec tworzeniu się dużych liczb.
Kolumna I z M oznacza punkty, które są połączone (dowolnym ścieżką) z punktem ı . Teraz pole poziomu można sprowadzić do wektora kolumny c w kolejności liniowej, gdzie każdy wpis zawiera odpowiednią liczbę lub niezdefiniowaną wartość dla -
. Więc w tym przypadku byłoby c
5
1
3
2
5
-
-
-
7
4
8
2
Mutantowanie każdej kolumny M przez element c i obliczanie sumy każdej kolumny daje, dla każdego punktu i , całkowity wynik punktu powierzchni i, do którego należy. Obszar jest definiowany przez wszystkie punkty, które są ze sobą połączone. Zauważ, że wiele kolumn da ten sam wynik; mianowicie kolumny i oraz j dadzą tę samą sumę, jeśli punkty i i j są połączone (należą do tego samego obszaru). Ostateczny wynik to maksimum tych sum.
% Implicitly take input: 2D char array
n: % Range [1,...,N], where N is number of entries in the input
" % For loop. Each iteration builds a row of matrix L
G % Push input again
~ % Logical negate: transform into matrix of zeros
1 % Push 1, to be written into a matrix entry
@ % Iteration index. Ranges from 1 to N
( % Write that 1 into the N-th entry (linear order)
2Y6 % Push array [0 1 0; 1 1 1; 0 1 0]: mask of immediate neighbours
Z+ % Convolve and keep same-size result
le % Linearize into row array
G45> % Array of same size as the input that contains 1 for numbers, 0 for '-'
1e % Linearize into row array
* % Multiply element-wise
5M % Push last array again: 1 for numbers, 0 for '-'
@) % Get 0 or 1 value of that array corresponding to current iteration
* % Multiply. This is to give a row of zeros for non-numbers
] % End. We have all rows of L in the stack
v % Concatenate all rows into a matrix: L.
tz: % Duplicate. Range [1,...,K], where K is the number of nonzeros in L
" % For loop. Repear K times. This loop computes the 0/1 matrix power
o % Convert matrix entries to double
tY* % Duplicate and matrix-multiply
g % Convert to logical values, that is, nonzero values become 1
] % End. We have matrix M
G48- % Convert input chars to the corresponding numbers by subtractig 48
X: % Linearize into column array. This is vector c
* % Element-wise multiplication with broadcast (implicit repetition)
s % Sum of each column. Gives a row array
X> % Maximum of that row array
% Implicitly display