Взломай сейф!


10

Вдохновленный /puzzling/24334/to-catch-a-thief

Вам предоставляется сетка ( сама nпо себе необязательна), заполненная символами s и s (или любым другим символом по вашему выбору). Ваша цель - сделать каждую клетку одинаковой (или или ). Вы можете сделать серию ходов, как определено ниже (обратите внимание на разницу в ссылке Puzzling SE):nn0101

  • Выберите ячейку.
  • Каждая ячейка в той же строке и столбце (кроме самой ячейки) превращается в свою противоположность. 0к 1и 1к 0.

Выведите минимальное количество ходов, необходимое для выполнения задачи. Если неразрешимо, выведите все, кроме неотрицательного целого числа. Самый короткий код выигрывает.

Образец данных

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
Каково решение первого контрольного примера? Я не получаю решения для этого.
картонная

Ответы:


4

Matlab 171 байт

Входные данные должны быть двухмерной матрицей, поэтому вы должны называть ее так c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])(точки с запятой начинаются с новой строки). Эта функция просто перебирает все возможные ходы, поэтому мы получаем время выполнения O(2^(n^2)).

Как это делается

Это делается путем выбора всех возможных способов заполнения другой матрицы того же размера единицами и нулями, это в основном считается в двоичном формате, где каждая запись матрицы представляет определенную степень 2.

Затем мы выполняем ходы для тех ячеек, которые равны 1, это делается суммой (mod 2) двух двумерной свертки с вектором размером 1xn и nx1.

Наконец, мы решаем, действительно ли эти перемещения дали желаемый результат, вычисляя стандартное отклонение для всех записей. Стандартное отклонение составляет только нули, если все записи одинаковы. И всякий раз, когда мы на самом деле нашли желаемый результат, мы сравниваем его с количеством ходов предыдущих решений. Функция вернется, infесли данная проблема не разрешима.

Math?

На самом деле стоит отметить, что все эти шаги вместе создают абелеву группу! Если кому-то действительно удастся оценить эти группы, пожалуйста, дайте мне знать.

Гольф версия:

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), потому что почему бы и нет ?

Я потратил пару строк здесь для удобства чтения :

$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";
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.