Matlab 171 바이트
입력은 2 차원 행렬이어야하므로 c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(세미콜론은 새 행을 시작 합니다)과 같이 호출합니다 . 이 함수는 가능한 모든 움직임을 무차별 처리하므로 런타임은 O(2^(n^2))
입니다.
어떻게 하는가
이것은 같은 크기의 다른 행렬을 1과 0으로 채울 수있는 모든 가능한 방법을 선택하여 수행됩니다. 이는 기본적으로 행렬의 각 항목이 2의 특정 거듭 제곱을 나타내는 이진 단위로 계산됩니다.
그런 다음 1 인 셀 에서 이동 을 수행합니다 . 이것은 1xn 및 nx1 크기의 벡터로 두 개의 2 차원 컨벌루션의 합 (mod 2)에 의해 수행됩니다.
마지막으로 모든 항목에 대한 표준 편차를 계산하여 이러한 움직임이 실제로 원하는 결과를 산출했는지 결정합니다. 모든 항목이 동일한 경우 표준 편차는 0입니다. 실제로 원하는 결과를 찾을 때마다 이전 솔루션의 이동 횟수와 비교합니다. 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
(정사각형으로 재 배열, 방법은 중요하지 않음)