Матлаб 171 байт
Вхід має бути 2-матричною матрицею, так що ви б назвали це так c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(крапкою з комою починається новий рядок). Ця функція просто посилює всі можливі рухи, тому ми отримуємо час виконання O(2^(n^2))
.
Як це робиться
Це робиться шляхом вибору всіх можливих способів заповнення іншої матриці однакового розміру одиницями та нулем, це в основному рахується в двійковій частині, де кожен запис матриці представляє певну потужність 2.
Потім виконуємо рухи на тих осередках, які дорівнюють 1, це робиться сумою (мод 2) двох двовимірних згортків з вектором розмірів 1xn і nx1.
Нарешті ми вирішуємо, чи справді ці ходи дали бажаний результат, обчислюючи стандартне відхилення для всіх записів. Стандартне відхилення - це лише нулі, якщо всі записи однакові. І кожного разу, коли ми дійсно знайшли бажаний результат, ми порівнюємо його з кількістю ходів попередніх рішень. Функція повернеться, inf
якщо задана проблема не вирішена.
Математика?
Справді варто відзначити, що всі ці кроки разом породжують абелеву групу! Якщо комусь насправді вдасться класифікувати ці групи, будь ласка, дайте мені знати.
Версія для гольфу:
function M=c(a);n=numel(a);p=a;M=inf;o=ones(1,n);for k=0:2^n-1;p(:)=dec2bin(k,n)-'0';b=mod(conv2(p,o,'s')+conv2(p,o','s'),2);m=sum(p(:));if ~std(b(:)-a(:))&m<M;M=m;end;end
Повна версія (з виведенням фактичних рухів.)
function M = c(a)
n=numel(a);
p=a;
M=inf; %current minimum of number of moves
o=ones(1,n);
for k=0:2^n-1;
p(:) = dec2bin(k,n)-'0'; %logical array with 1 where we perform moves
b=mod(conv2(p,o,'same')+conv2(p,o','same'),2); %perform the actual moves
m=sum(p(:)); %number of moves;
if ~std(b(:)-a(:))&m<M %check if the result of the moves is valid, and better
M=m;
disp('found new minimum:')
disp(M) %display number of moves of the new best solution (not in the golfed version)
disp(p) %display the moves of the new best solution (not in the golfed version)
end
end
1000
(Переставляти як квадрат, не важливо, як).