แตกปลอดภัย!


10

แรงบันดาลใจจาก/puzzling/24334/to-catch-a-thief

คุณจะได้รับกริดnโดยn( nตัวเองเป็นอินพุตเสริม) ที่เต็มไปด้วย0s และ1s (หรืออักขระอื่น ๆ ที่คุณเลือก) คุณมุ่งหวังที่จะทำให้ทุกเซลล์เหมือนกัน (อย่างใดอย่างหนึ่ง0หรือ1) คุณสามารถสร้างชุดของการเคลื่อนไหวตามที่กำหนดไว้ด้านล่าง (หมายเหตุที่แตกต่างกันกับลิงก์ Puzzling SE):

  • เลือกเซลล์
  • ทุกเซลล์ในแถวและคอลัมน์เดียวกัน (ยกเว้นเซลล์เอง) ได้รับการเปลี่ยนแปลงในทางตรงกันข้าม 0การ1และการ10

เอาท์พุทจำนวนขั้นต่ำของการย้ายที่จำเป็นในการทำงาน ถ้าแก้ไม่ได้ให้เอาต์พุตอะไรก็ได้ยกเว้นจำนวนเต็มไม่เป็นลบ รหัสที่สั้นที่สุดชนะ

ข้อมูลตัวอย่าง

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


@ 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])(เซมิโคลอนเริ่มต้นแถวใหม่) ฟังก์ชั่นนี้เพียง bruteforces O(2^(n^2))ย้ายเป็นไปได้ทั้งหมดเพื่อให้เราได้รับรันไทม์ของ

เป็นอย่างไรกันบ้าง

สิ่งนี้ทำได้โดยเลือกวิธีที่เป็นไปได้ทั้งหมดเพื่อเติมเมทริกซ์อื่นที่มีขนาดเท่ากันกับศูนย์และนี่คือการนับโดยทั่วไปในไบนารีซึ่งแต่ละรายการของเมทริกซ์แสดงถึงพลังบางอย่างของ 2

จากนั้นเราทำการเคลื่อนที่บนเซลล์เหล่านั้นคือ 1 ซึ่งกระทำโดยผลรวม (mod 2) ของการบิดสองมิติสองมิติด้วยเวกเตอร์ที่มีขนาด 1xn และ nx1

ในที่สุดเราตัดสินใจว่าการเคลื่อนไหวเหล่านั้นสร้างผลลัพธ์ที่ต้องการจริงหรือไม่โดยการคำนวณค่าเบี่ยงเบนมาตรฐานเหนือทุกรายการ ค่าเบี่ยงเบนมาตรฐานเป็นศูนย์ก็ต่อเมื่อรายการทั้งหมดเหมือนกัน และเมื่อใดก็ตามที่เราพบผลลัพธ์ที่ต้องการจริงเราเปรียบเทียบกับจำนวนการเคลื่อนไหวของการแก้ปัญหาก่อนหน้า ฟังก์ชั่นจะกลับมาinfหากปัญหาที่ระบุไม่สามารถแก้ไขได้

คณิตศาสตร์?

อันที่จริงแล้วมันเป็นที่น่าสังเกตว่าการเคลื่อนไหวเหล่านั้นทั้งหมดรวมกันสร้างกลุ่มชาวคริสต์! หากใครก็ตามสามารถทำการปลอมแปลงกลุ่มเหล่านั้นได้โปรดแจ้งให้เราทราบ

รุ่น Golfed:

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

Perl 5, 498 ไบต์

วิธีนี้ยอมรับ 'n' และผลลัพธ์ที่ต้องการและส่งออกจำนวนหรือ 'X' หากไม่มี

ตัวอย่างเช่น:

perl ./crack.golf.pl 3 000111111

2จะช่วยให้ มันจะทำงานเมื่อ n ^ 2 <= 64 n <= 8เท่านั้น แม้ว่ามันจะค่อนข้างช้าแม้ว่าจะมี n อยู่ต่ำเพียง 5 แต่ก็สร้างอาร์เรย์ ^ 3 บิตและเรียงลำดับอาร์เรย์ 2 ^ (n ^ 2) ไว้ล่วงหน้าเพราะเหตุใด

ฉันเสีย linefeeds สองสามตัวที่นี่เพื่อให้สามารถอ่านได้ :

$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.