금고를 부수십시오!


10

/puzzling/24334/to-catch-a-thief에서 영감을 받음

당신가 주어진다 n하여을 n( n가득 그리드 자체는 선택 입력) 0들과 1의 (또는 선택한 다른 문자). 목표는 모든 셀을 동일하게 ( 0또는 1) 만드는 것입니다 . 아래 정의 된대로 일련의 동작을 수행 할 수 있습니다 (퍼즐 링 SE 링크와 다른 점에 유의).

  • 셀을 선택하십시오.
  • 동일한 행과 열에있는 모든 셀 (셀 자체 제외)은 그 반대로 변경됩니다. 0110.

작업을 완료하는 데 필요한 최소 이동 수를 출력하십시오. 해결할 수 없으면 음이 아닌 정수를 제외한 모든 것을 출력하십시오. 가장 짧은 코드가 승리합니다.

샘플 데이터

1 0 0
0 0 0
0 0 0

-1

1 1 1
1 1 1
1 1 1

0

1 0 1
0 1 0
1 0 1

1

1 1 1 1
0 0 0 0
0 0 0 0
1 1 1 1

2

0 1 0 1
1 0 1 0
1 0 1 0
0 1 0 1

2


3
퍼즐을 풀 수없는 경우 어떻게해야합니까? 예를 들어 1000(정사각형으로 재 배열, 방법은 중요하지 않음)
orlp December


@orlp 숫자가 아닌 모든 출력이 수행됩니다.
ghosts_in_the_code

입력을 구문 분석해야합니까, 아니면 이미 채워진 배열 데이터 유형일 수 있습니까?
coredump

1
첫 번째 테스트 사례에 대한 해결책은 무엇입니까? 해결책이 없습니다.
cardboard_box

답변:


4

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

1

펄 5, 498 바이트

이것은 'n'과 원하는 결과를 받아들이고 카운트를 출력하거나 'X'가 없으면 출력합니다.

예를 들면 다음과 같습니다.

perl ./crack.golf.pl 3 000111111

제공합니다 2. n ^ 2 <= 64 일 때만 작동하므로 n <= 8. n이 5만큼 낮은 경우에도 속도가 느리지 만 3 비트 배열을 빌드하고 미리 2 ^ (n ^ 2) 배열을 정렬합니다. 왜 그렇지 않습니까?

가독성을 위해 여기에 몇 가지 줄 바꿈을 낭비했습니다 .

$n=shift;$y=shift;$p=$n*$n;@m=(0..$n-1);@q=(0..$p-1);@v=(0..2**$p-1);@d=map{0}(@q);@b=map{$r=$_;map{$c=$_;$d[$r*$n+$_]^=1 for(@m);$d[$_*$n+$c]^=1 for(@m);$j=0;$k=1;
map{$j|=$k*$d[$_];$k<<=1;}@q;@d=map{0}(@q);$j;}@m}@m;for$k(sort{$a->[0]<=>$b->[0]}map{$z=0;map{$z+=$_}split(//,sprintf"%b",$_);[$z,$_]}@v){$l=sprintf"%0${p}b",$k->[1];
@m=map{$_}split(//,$l);$s=0;for(@q){$s^=$b[$_]if$m[$_];}$z=0;map{$z+=$_}split(//,sprintf"%b",$_);if($y eq sprintf"%0${p}b",$s){print"$k->[0]\n";exit 0;}}print"X\n";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.