MATL , 54 51 49 bytes
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
A entrada é uma matriz de caracteres 2D no formato MATL (AB), com o ;
separador de linhas. As entradas no exemplo e nos casos de teste são respectivamente:
['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']
Experimente online!
Explicação
Isso funciona através da construção de uma matriz de adjacência do gráfico definida pela relação "estar conectado". Como exemplo, considere o campo 3 × 4
52-4
15-8
3-72
Entradas em uma matriz 2D são facilmente descritas em MATL usando indexação linear (na coluna principal). No caso 3 × 4, o índice linear de cada entrada é dado como
1 4 7 10
2 5 8 11
3 6 9 12
A matriz de adjacência é construída em etapas usando a multiplicação de matrizes. Na primeira etapa, vizinhos imediatos são considerados. Por exemplo, o ponto indexado 3 é vizinho de si mesmo e daquele com o índice 2. Não é vizinho de 6 porque esse ponto não contém um número de acordo com o campo. Neste exemplo, a matriz de adjacência da relação "vizinho imediato" é a matriz 12 × 12 L dada como
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
(Pode-se ver que a coluna 3 tem valor 1
nas linhas 2 e 3.) Essa matriz é sempre simétrica e sua diagonal possui valor 1
para pontos que não contêm -
.
O próximo passo seria a matriz de adjacência da relação "conectada com no máximo um ponto no meio ". Para obtê-lo, basta multiplicar L por si só e definir entradas diferentes de zero como 1
. Em geral, a matriz de adjacência da relação "conectada por algum caminho", M , é obtida elevando L a um expoente (no sentido da matriz) que representa o comprimento máximo possível do caminho. Um limite superior do comprimento de caminho máximo é o número de entradas diferentes de zero em L .
O cálculo direto da energia da matriz pode causar transbordamento, pois grandes números ocorrem rapidamente. Portanto, é melhor multiplicar gradualmente pela mesma matriz, convertendo entradas diferentes de zero em 1 após cada etapa para impedir que grandes números se acumulem.
A coluna i de M representa os pontos que estão conectados (por qualquer caminho) ao ponto i . Agora, o campo de nível pode ser reduzido a um vetor de coluna c em ordem linear, em que cada entrada contém o número correspondente ou um valor indefinido para -
. Então, nesse caso, c seria
5
1
3
2
5
-
-
-
7
4
8
2
Mutiplicar cada coluna de M por c elemento a elemento e calcular a soma de cada coluna fornece, para cada ponto i , a pontuação total do ponto de área a que pertence. Uma área é definida por todos os pontos que são mutuamente conectados. Observe que muitas colunas fornecerão o mesmo resultado; ou seja, as colunas de i e j vão dar a mesma soma se os pontos I e J são conectados (pertencem à mesma área). O resultado final é o máximo dessas somas.
% 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