Matlab 171 bytes
La entrada debe ser una matriz 2d, por lo que la llamaría así c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(los puntos y comas comienzan una nueva fila). Esta función simplemente fuerza bruta todos los movimientos posibles, por lo que tenemos un tiempo de ejecución de O(2^(n^2))
.
Como esta hecho
Esto se hace eligiendo todas las formas posibles para llenar otra matriz del mismo tamaño con unos y cero, esto es básicamente contar en binario, donde cada entrada de la matriz representa una cierta potencia de 2.
Luego realizamos los movimientos en esas celdas que son 1, esto se hace mediante la suma (mod 2) de dos convoluciones bidimensionales con un vector de unos de tamaño 1xn y nx1.
Finalmente, decidimos si esos movimientos realmente produjeron el resultado deseado, calculando la desviación estándar de todas las entradas. La desviación estándar es solo ceros si todas las entradas son iguales. Y cada vez que encontramos el resultado deseado, lo comparamos con el número de movimientos de soluciones anteriores. La función volverá inf
si el problema dado no se puede resolver.
¿Matemáticas?
¡Realmente vale la pena señalar que todos esos movimientos juntos generan un grupo abeliano! Si alguien realmente logra calificar esos grupos, hágamelo saber.
Versión de golf:
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
Versión completa (con la salida de los movimientos reales).
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
(reorganizado como un cuadrado, no importa cómo).