Matlab 171 bayt
Giriş 2d bir matris olmalıdır, bu yüzden şöyle adlandırırsınız c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(noktalı virgüller yeni bir satır başlatır). Bu işlev tüm olası hareketleri kaba kuvvetlendirir, böylece bir çalışma zamanı elde ederiz O(2^(n^2))
.
Nasıl yapılır
Bu, aynı boyuttaki başka bir matrisi bir ve sıfırla doldurmak için mümkün olan tüm yolları seçerek yapılır, bu temel olarak, matrisin her girişinin belirli bir 2 gücünü temsil ettiği ikili wich sayılır.
Daha sonra 1 olan hücreler üzerinde hareketler gerçekleştiriyoruz , bu iki boyutlu evrişim toplamı (mod 2) ile 1xn ve nx1 boyutlarında bir vektörle yapılır.
Son olarak, tüm girdiler üzerinde standart sapmayı hesaplayarak bu hareketlerin gerçekten istenen sonucu üretip üretmediğine karar veriyoruz. Standart sapma yalnızca tüm girişler aynı olduğunda sıfırdır. İstediğimiz sonucu her bulduğumuzda, önceki çözümlerin hamle sayısı ile karşılaştırıyoruz. inf
Verilen sorun çözülemezse işlev geri döner .
Matematik?
Aslında tüm bu hareketlerin bir abelya grubu oluşturduğunu belirtmek gerekir ! Eğer birisi bu grupların kalsifikasyonunu gerçekten başarırsa, lütfen bana bildirin.
Golf versiyonu:
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
Tam sürüm (gerçek hamlelerin çıkışı ile.)
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
(kare olarak yeniden düzenlenmiş, nasıl olduğu önemli değil).