Crack an toàn!


10

Lấy cảm hứng từ /puzzling/24334/to-catch-a-thief

Bạn được cung cấp một lưới nbởi n( nchính nó là đầu vào tùy chọn) chứa đầy 0s và 1s (hoặc bất kỳ ký tự nào khác bạn chọn). Bạn mục đích là để làm cho mọi tế bào như nhau (một trong hai 0hoặc 1). Bạn có thể thực hiện một loạt các động tác như được định nghĩa dưới đây (lưu ý sự không giống nhau với liên kết Puzzling SE):

  • Chọn một ô.
  • Mỗi ô trong cùng một hàng và cột (ngoại trừ chính ô) được thay đổi thành đối diện của nó. 0để 11để 0.

Xuất ra số lượng di chuyển tối thiểu cần thiết để hoàn thành nhiệm vụ. Nếu không thể giải quyết, hãy xuất bất cứ thứ gì ngoại trừ một số nguyên không âm. Mã ngắn nhất sẽ thắng.

Dữ liệu mẫu

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
Làm gì trong trường hợp câu đố không thể giải được? Ví dụ 1000(sắp xếp lại như một hình vuông, không quan trọng bằng cách nào).
orlp


@orlp Bất kỳ đầu ra nào không phải là số sẽ làm.
ghosts_in_the_code

Chúng ta có cần phân tích cú pháp đầu vào hay nó có thể là bất kỳ kiểu dữ liệu mảng nào đã được điền không?
coredump

1
Giải pháp cho trường hợp thử nghiệm đầu tiên là gì? Tôi không nhận được giải pháp cho nó.
tông_box

Câu trả lời:


4

Matlab 171 byte

Đầu vào phải là ma trận 2d, vì vậy bạn sẽ gọi nó như thế c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])(dấu chấm phẩy bắt đầu một hàng mới). Hàm này chỉ bruteforces tất cả các di chuyển có thể, vì vậy chúng tôi có một thời gian chạy O(2^(n^2)).

Nó được thực hiện như thế nào

Điều này được thực hiện bằng cách chọn tất cả các cách có thể để điền vào một ma trận khác có cùng kích thước với các số không và số 0, về cơ bản, nó được tính trong nhị phân trong đó mỗi mục nhập của ma trận đại diện cho một sức mạnh nhất định là 2.

Sau đó, chúng tôi thực hiện các bước di chuyển trên các ô đó là 1, điều này được thực hiện bằng tổng (mod 2) của phép tích chập hai chiều với một vectơ có kích thước 1xn và nx1.

Cuối cùng, chúng tôi quyết định xem những động thái đó có thực sự tạo ra kết quả mong muốn hay không, bằng cách tính độ lệch chuẩn trên tất cả các mục. Độ lệch chuẩn chỉ là số không nếu tất cả các mục giống nhau. Và bất cứ khi nào chúng tôi thực sự tìm thấy kết quả mong muốn, chúng tôi so sánh nó với số lần di chuyển của các giải pháp trước đó. Hàm sẽ trả về infnếu vấn đề đã cho không thể giải được.

Môn Toán?

Điều thực sự đáng chú ý là tất cả những động thái đó cùng nhau tạo ra một nhóm abelian! Nếu bất cứ ai thực sự quản lý để calssify các nhóm đó xin vui lòng cho tôi biết.

Phiên bản chơi gôn:

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

Phiên bản đầy đủ (với đầu ra của các bước di chuyển thực tế.)

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

Perl 5, 498 byte

Điều này chấp nhận 'n' và kết quả mong muốn, và đưa ra số đếm, hoặc 'X' nếu không có.

Ví dụ:

perl ./crack.golf.pl 3 000111111

cho 2. Nó sẽ chỉ hoạt động khi n ^ 2 <= 64, vì vậy n <= 8. Mặc dù nó khá chậm ngay cả với n thấp đến 5. Nó xây dựng một mảng ^ 3 bit và sắp xếp một mảng 2 ^ (n ^ 2) trước, tại sao không ?

Tôi đã lãng phí một vài nguồn cấp dữ liệu ở đây để dễ đọc :

$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";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.