MATL , 54 51 49 byte
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
L'input è un array di caratteri 2D in formato MATL (AB), con ;
come separatore di riga. Gli input nell'esempio e nei casi di test sono rispettivamente:
['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']
Provalo online!
Spiegazione
Funziona costruendo una matrice di adiacenza del grafico definita dalla relazione "essere connessi". Ad esempio, considera il campo 3 × 4
52-4
15-8
3-72
Le voci in un array 2D sono facilmente descritte in MATL usando l'indicizzazione lineare (colonna maggiore). Nel caso 3 × 4, l'indice lineare di ciascuna voce è indicato come
1 4 7 10
2 5 8 11
3 6 9 12
La matrice di adiacenza è costruita in fasi usando la moltiplicazione della matrice. Nel primo passo vengono considerati i vicini immediati . Ad esempio, il punto indicizzato 3 è vicino a se stesso e quello con l'indice 2. Non è un vicino di 6 perché quel punto non contiene un numero in base al campo. In questo esempio la matrice di adiacenza della relazione "vicino immediato" è la matrice 12 × 12 L data come
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
(Si può vedere che la colonna 3 ha valore 1
nelle righe 2 e 3.) Questa matrice è sempre simmetrica e la sua diagonale ha valore 1
per i punti che non contengono -
.
Il prossimo passo sarebbe la matrice di adiacenza della relazione "connesso con al massimo un punto in mezzo ". Per ottenerlo, è sufficiente moltiplicare L per se stesso e impostare voci diverse da zero 1
. In generale, la matrice di adiacenza della relazione "collegata da un certo percorso", M , si ottiene elevando L ad un esponente (in senso di matrice) che rappresenta la massima lunghezza possibile del percorso. Un limite superiore della lunghezza massima del percorso è il numero di voci nella nulli L .
Il calcolo diretto della potenza della matrice può causare overflow, poiché si verificano rapidamente grandi numeri. Quindi è meglio moltiplicare gradualmente per la stessa matrice, convertendo le voci diverse da zero in 1 dopo ogni passaggio per impedire l'accumulo di numeri grandi.
La colonna i di M rappresenta i punti che sono collegati (da qualsiasi percorso) con il punto i . Ora, il campo di livello può essere ridotto a un vettore di colonna c in ordine lineare, dove ogni voce contiene il numero corrispondente o un valore indefinito per -
. Quindi in questo caso c sarebbe
5
1
3
2
5
-
-
-
7
4
8
2
La moltiplicazione di ciascuna colonna di M per elemento c e calcolando la somma di ciascuna colonna fornisce, per ogni punto i , il punteggio totale dell'area punto i a cui appartiene. Un'area è definita da tutti i punti collegati reciprocamente. Nota che molte colonne daranno lo stesso risultato; vale a dire, le colonne i e j daranno la stessa somma se i punti i e j sono collegati (appartengono alla stessa area). Il risultato finale è il massimo di tali somme.
% 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