Вдохновленный /puzzling/24334/to-catch-a-thief
Вам предоставляется сетка ( сама n
по себе необязательна), заполненная символами s и s (или любым другим символом по вашему выбору). Ваша цель - сделать каждую клетку одинаковой (или или ). Вы можете сделать серию ходов, как определено ниже (обратите внимание на разницу в ссылке Puzzling SE):n
n
0
1
0
1
- Выберите ячейку.
- Каждая ячейка в той же строке и столбце (кроме самой ячейки) превращается в свою противоположность.
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
code-golf
grid
puzzle-solver
path-finding
ghosts_in_the_code
источник
источник
1000
(переставляется как квадрат, неважно, как).Ответы:
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?
На самом деле стоит отметить, что все эти шаги вместе создают абелеву группу! Если кому-то действительно удастся оценить эти группы, пожалуйста, дайте мне знать.
Гольф версия:
Полная версия (с выводом актуальных ходов.)
источник
Perl 5, 498 байт
Он принимает «n» и желаемый результат и выводит счетчик или «X», если его нет.
Например:
дает
2
. Это будет работать только тогда, когда n ^ 2 <= 64, поэтомуn <= 8
. Несмотря на то, что он довольно медленный, даже если n меньше 5. Он создает массив из 3 битов и заранее сортирует массив из 2 ^ (n ^ 2), потому что почему бы и нет ?Я потратил пару строк здесь для удобства чтения :
источник