Введение
Вам было поручено написать программу, которая разбивает прямоугольный целочисленный массив равномерно пополам (по любой причине). Эта задача требует больших вычислительных ресурсов, но, к счастью, у вас есть двухъядерный компьютер для выполнения вычислений. Чтобы максимизировать преимущества параллелизма, вы решили разделить программу равномерно пополам и позволить каждому ядру запускать одну из частей независимо от другой.
Вход и выход
Ваш ввод представляет собой прямоугольный двумерный массив неотрицательных целых чисел размером не менее 1 × 1 , взятый в любом приемлемом формате. Расщепление такого массива получается путем расщепления каждой горизонтальной строки в качестве префикса и суффикс (любой из которых может быть пустыми). Чтобы разделение было действительным, две соседние строки должны быть разделены по одному и тому же индексу или соседним индексам. Например, рассмотрим массив
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
Это правильное разбиение:
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
Это также допустимое разбиение:
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
Это недопустимое разбиение:
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
Ваш вывод должен быть минимальным значением
abs(sum_of_prefixes - sum_of_suffixes)
по всем допустимым разбиениям ввода.
Правила и оценки
Вы должны написать две программы (либо полные программы, либо функции) на одном языке, у которых не должно быть общего кода между ними. Давайте назовем их P1 и P2 . Программа P1 берет входной массив и что-то выводит . Программа P2 принимает это что-то в качестве входных данных и выводит ответ вышеупомянутой задачи для входного массива.
Ваша оценка - это максимальное число байтов P1 и P2 , при этом чем меньше оценка, тем лучше.
Некоторые уточнения:
- Вы можете написать две полных программы, одну функцию и одну полную программу или две функции.
- В случае двух полных программ весь вывод P1 подается на P2 в качестве ввода, как в конвейере Unix
P1 | P2
. Программы должны работать правильно, если они скомпилированы / интерпретированы из двух отдельных исходных файлов. - Если какая-либо программа является функцией, она преобразуется в полную программу путем добавления необходимого шаблонного кода, и к ней применяется вышеуказанное правило. В частности, две функции не могут использовать общие вспомогательные функции, общие операторы импорта или общие глобальные переменные.
Контрольные примеры
[[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