Matlab 171 octets
L'entrée doit être une matrice 2d, vous pouvez donc l'appeler comme c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(les points-virgules commencent une nouvelle ligne). Cette fonction renforce simplement tous les mouvements possibles, nous obtenons donc un runtime de O(2^(n^2))
.
Comment c'est fait
Cela se fait en choisissant toutes les façons possibles de remplir une autre matrice de la même taille avec des uns et zéro, c'est essentiellement compter en binaire où chaque entrée de la matrice représente une certaine puissance de 2.
Ensuite, nous effectuons les déplacements sur les cellules qui sont 1, cela se fait par la somme (mod 2) de deux convolutions bidimensionnelles avec un vecteur de celles de taille 1xn et nx1.
Enfin, nous décidons si ces mouvements ont réellement produit le résultat souhaité, en calculant l'écart type sur toutes les entrées. L'écart type n'est de zéro que si toutes les entrées sont identiques. Et chaque fois que nous avons réellement trouvé le résultat souhaité, nous le comparons avec le nombre de mouvements des solutions précédentes. La fonction reviendra inf
si le problème donné n'est pas résolu.
Math?
Il est en fait intéressant de noter que tous ces mouvements génèrent ensemble un groupe abélien! Si quelqu'un parvient à calsifier ces groupes, faites-le moi savoir.
Version golfée:
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
Version complète (avec la sortie des mouvements réels.)
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
(réarrangé en carré, peu importe comment).