MATL , 54 51 49 byte
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
Input adalah array char 2D dalam format MATL (AB), dengan ;
pemisah baris. Masukan dalam contoh dan dalam kasus uji masing-masing:
['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']
Cobalah online!
Penjelasan
Ini bekerja dengan membangun matriks adjacency dari grafik yang didefinisikan oleh hubungan "sedang terhubung". Sebagai contoh, perhatikan bidang 3 × 4
52-4
15-8
3-72
Entri dalam array 2D mudah dijelaskan dalam MATL menggunakan pengindeksan linear (kolom-utama). Dalam kasus 3 × 4, indeks linier dari setiap entri diberikan sebagai
1 4 7 10
2 5 8 11
3 6 9 12
Matriks adjacency dibangun dalam langkah-langkah menggunakan perkalian matriks. Pada langkah pertama, segera tetangga dianggap. Misalnya, titik yang diindeks 3 adalah tetangga itu sendiri dan itu dengan indeks 2. Itu bukan tetangga dari 6 karena titik itu tidak mengandung angka sesuai dengan bidang. Dalam contoh ini, matriks adjacency dari relasi "tetangga langsung" adalah matriks 12x12 L yang diberikan sebagai
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
(Dapat dilihat bahwa kolom 3 memiliki nilai 1
pada baris 2 dan 3.) Matriks ini selalu simetris dan diagonalnya memiliki nilai 1
untuk poin yang tidak mengandung -
.
Langkah selanjutnya adalah matriks kedekatan hubungan "terhubung dengan paling banyak satu titik di antara ". Untuk mendapatkannya, cukup untuk mengalikan L dengan sendirinya dan mengatur entri bukan nol ke 1
. Secara umum, matriks adjacency dari relasi "dihubungkan oleh beberapa lintasan", M , diperoleh dengan menaikkan L ke eksponen (dalam arti matriks) yang mewakili panjang lintasan maksimum yang mungkin. Sebuah batas atas panjang jalur maksimum adalah jumlah nol entri dalam L .
Menghitung daya matriks secara langsung dapat menyebabkan overflow, karena sejumlah besar cepat terjadi. Jadi lebih baik untuk secara bertahap mengalikan dengan matriks yang sama, mengubah entri bukan nol menjadi 1 setelah setiap langkah untuk mencegah peningkatan jumlah besar.
Kolom i dari M menunjukkan titik-titik yang terhubung (dengan jalur apa pun) dengan titik i . Sekarang, bidang level dapat dikurangi menjadi vektor kolom c dalam urutan linier, di mana setiap entri berisi angka yang sesuai atau nilai yang tidak ditentukan untuk -
. Jadi dalam hal ini c akan
5
1
3
2
5
-
-
-
7
4
8
2
Mengubah setiap kolom M dengan elemen- c dan menghitung jumlah setiap kolom memberi, untuk setiap poin i , skor total dari titik area yang saya miliki. Suatu area didefinisikan oleh semua titik yang saling terhubung. Perhatikan bahwa banyak kolom akan memberikan hasil yang sama; yaitu, kolom i dan j akan memberikan jumlah yang sama jika poin i dan j terhubung (milik area yang sama). Hasil akhir adalah jumlah maksimal dari jumlah tersebut.
% 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