Introdução
Você foi encarregado de escrever um programa que divide uma matriz inteira retangular igualmente pela metade (por qualquer motivo). Essa tarefa é intensiva em termos de computação, mas felizmente você tem uma máquina de núcleo duplo para executar os cálculos. Para maximizar os benefícios do paralelismo, você decide dividir o programa igualmente pela metade e deixar que cada núcleo execute uma das partes independentemente da outra.
Entrada e saída
Sua entrada é uma matriz 2D retangular de números inteiros não negativos de tamanho pelo menos 1 × 1 , obtida em qualquer formato razoável. Uma divisão dessa matriz é obtida dividindo cada linha horizontal em um prefixo e um sufixo (um dos quais pode estar vazio). Para que uma divisão seja válida, duas linhas adjacentes devem ser divididas no mesmo índice ou índices adjacentes. Por exemplo, considere a matriz
2 4 5 5 6 3
9 7 1 7 7 0
0 0 3 6 7 8
1 2 4 7 6 1
6 6 8 2 0 0
Esta é uma divisão válida:
2;4 5 5 6 3
;9 7 1 7 7 0
;0 0 3 6 7 8
1;2 4 7 6 1
6 6;8 2 0 0
Essa também é uma divisão válida:
2 4 5 5 6 3;
9 7 1 7 7;0
0 0 3 6 7;8
1 2 4 7;6 1
6 6 8;2 0 0
Esta não é uma divisão válida:
2 4;5 5 6 3
9 7 1;7 7 0
0;0 3 6 7 8
1 2;4 7 6 1
6 6;8 2 0 0
Sua saída deve ser o valor mínimo de
abs(sum_of_prefixes - sum_of_suffixes)
sobre todas as separações válidas da entrada.
Regras e pontuação
Você deve escrever dois programas (programas ou funções completos) no mesmo idioma, que não devem ter nenhum código compartilhado entre eles. Vamos chamá-los de P1 e P2 . O programa P1 pega a matriz de entrada e gera algo . O programa P2 aceita isso como entrada e gera a resposta da tarefa acima para a matriz de entrada.
Sua pontuação é o máximo de contagens de bytes de P1 e P2 , sendo menor a pontuação.
Alguns esclarecimentos:
- Você pode escrever dois pré-programas completos, uma função e um programa completo ou duas funções.
- No caso de dois programas completos, toda a saída de P1 é alimentada para P2 como entrada, como no pipeline Unix
P1 | P2
. Os programas devem funcionar corretamente se compilados / interpretados a partir de dois arquivos de origem separados. - Se um dos programas for uma função, ele será convertido em um programa completo, adicionando o código padrão necessário, e a regra acima será aplicada a ele. Em particular, duas funções não podem usar funções auxiliares compartilhadas, instruções de importação compartilhadas ou variáveis globais compartilhadas.
Casos de teste
[[1]] -> 1
[[4,5],[8,3]] -> 4
[[8],[11],[8],[10],[4]] -> 1
[[5,7,0,9,11,2,1]] -> 7
[[146,194,71,49],[233,163,172,21],[121,173,14,302],[259,169,26,5],[164,30,108,37],[88,55,15,2]] -> 3
[[138,2,37,2],[168,382,33,77],[31,199,7,15],[192,113,129,15],[172,88,78,169],[28,6,97,197]] -> 7
[[34,173,9,39,91],[169,23,56,74,5],[40,153,80,60,28],[8,34,102,60,32],[103,88,277,4,2]] -> 0
[[65,124,184,141],[71,235,82,51],[78,1,151,201],[12,24,32,278],[38,13,10,128],[9,174,237,113]] -> 2
[[164,187,17,0,277],[108,96,121,263,211],[166,6,57,49,73],[90,186,26,82,138],[173,60,171,265,96]] -> 8