Matlab 171 byte
Input harus berupa matriks 2d, jadi Anda akan menyebutnya seperti c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(titik koma memulai baris baru). Fungsi ini hanya bruteforces semua gerakan yang mungkin, jadi kami mendapatkan runtime dari O(2^(n^2))
.
Bagaimana itu dilakukan
Ini dilakukan dengan memilih semua cara yang mungkin untuk mengisi matriks lain dengan ukuran yang sama dengan yang satu dan nol, ini pada dasarnya menghitung dalam biner yang mana setiap entri matriks mewakili kekuatan tertentu 2.
Kemudian kami melakukan gerakan pada sel-sel yang 1, ini dilakukan dengan jumlah (mod 2) dari dua lilitan dua dimensi dengan vektor yang berukuran 1xn dan nx1.
Akhirnya kami memutuskan apakah gerakan itu benar-benar menghasilkan hasil yang diinginkan, dengan menghitung simpangan baku atas semua entri. Standar deviasi hanya nol jika semua entri sama. Dan setiap kali kami benar-benar menemukan hasil yang diinginkan, kami membandingkannya dengan jumlah gerakan solusi sebelumnya. Fungsi akan kembali inf
jika masalah yang diberikan tidak dapat dipecahkan.
Matematika?
Sebenarnya perlu dicatat bahwa semua gerakan itu bersama-sama menghasilkan kelompok abelian! Jika ada yang benar-benar berhasil mengkalsifikasi kelompok-kelompok itu, beri tahu saya.
Versi 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 lengkap (dengan output dari gerakan aktual.)
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
(disusun ulang sebagai persegi, tidak peduli bagaimana).