Фон
Полимин называется L-выпуклый , если это возможно путешествовать из любой плитки любой другой плитки с помощью L-образной траектории, то есть путь , который идет в кардинальных направлениях и меняет направление более одного раза. Например, полиомино 1
с на рисунке
0 0 1 1 1 0
1 1 1 1 0 0
1 1 0 0 0 0
не является L-выпуклым, поскольку оба L-образных пути от нижнего левого 1
до верхнего правого 1
содержат 0
:
0>0>1>1>1 0
^ ^
1 1 1 1 0 0
^ ^
1>1>0>0>0 0
Однако polyomino из 1
s на этом рисунке является L-выпуклым:
0 1 1 1 0 0
1 1 1 1 1 1
0 1 1 0 0 0
вход
Ваш ввод представляет собой двумерный массив битов в собственном формате вашего языка или в виде строки с разделителями новой строки, если в нашем языке отсутствуют массивы. Он гарантированно содержит хотя бы один 1
.
Выход
Ваш вывод должен быть истинным значением, если множество 1
s является L-выпуклым polyomino, и ложным значением, если нет. Эти выходные данные должны быть согласованными: вы должны вывести одно и то же истинное значение для всех L-выпуклых входов и то же самое ложное значение для других. Обратите внимание, что несвязанный набор 1
s (который не является polyomino) приводит к ложному выводу.
Правила и оценки
Вы можете написать либо полную программу, либо функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Тестовые случаи
Эти тесты также должны работать, если вы поворачиваете или отражаете массивы или добавляете строки 0
s к любым границам.
False instances
01
10
111
101
111
1101
1111
1110
1100
1000
0011
01100
11110
01110
00110
011000
011110
001111
True instances
1
01
11
010
111
010
001
011
111
11100
11110
01100
01000
011000
011000
111100
111111
001000
Ответы:
Улитки ,
4524Сразу после публикации моего первоначального решения я понял, что есть гораздо лучший способ. Оригинальная программа путешествовала по квадрату, образованному путями между двумя
1
s, проверяя наличие 0 в каждой паре сторон. Это также должно было иметь особый случай для прямых путей. Новая версия начинается с телепортации от одного1
к другому и проверки на отсутствие прямого или L-образного пути1
s назад к началу.источник
Matlab, 182 байта
Идея: Повторите для каждого
1
в матрице полиомино:1
но с остальным нулем.1
в этой новой матрице (повторять, пока ничего не меняется)1
качестве соседей в направлении х, если1
в полиноме есть соседей1
в этой новой матрице (повторять, пока ничего не меняется)1
качестве соседей в направлении х, если1
в полиноме есть соседейТеперь
1
в новой матрице необходимо охватить все1
полиномиоматрицы, которые достижимы из заданной начальной точки, сначала двигаясь в направлении x, а затем в направлении y. Теперь мы можем повторить тот же процесс, но сначала в направлении y, а затем в направлении x. Теперь каждая1
матрица полиомино должна быть достигнута одновременно или оба раза. Если нет, то мы нашли позицию в матрице полинома, которая не может быть достигнута из любой другой позиции с помощьюL
-path.Golfed:
С комментариями:
Скрипт тестовых случаев:
источник
Javascript ES6, 290 байт
Хорошо, возможно, он не получит никаких наград за краткость, но он использует новый подход. Посмотрите версию ungolfed для того, как это работает.
Доказательство этого метода можно найти в: Сотовые автоматы и дискретные комплексные системы .
Ungolfed:
источник
Mathematica,
129127 байтовОбъяснение:
Во-первых, если
0
между двумя1
s в одной строке или столбце есть массив, он не является L-выпуклым, потому что мы не можем соединить эти два1
s.После исключения этого случая каждые две
1
s в одной строке или столбце могут быть соединены прямым путем. Мы можем сгенерировать граф, вершинами которого являются позиции1
s в массиве, а ребрами являются пары1
s в одной строке или столбце. Тогда массив является L-выпуклым тогда и только тогда, когда диаметр графа меньше 3.источник
JavaScript (ES6) 174
Глядя на сетку пустых или заполненных ячеек, для любой пары заполненных ячеек я проверяю горизонтальные пути к столбцу другой ячейки (может быть 1, если ячейки находятся в одной строке, иначе или 2) и вертикальные пути к другой ряд ячеек (тоже может быть 1 или 2). Если я найду пустую ячейку в обоих вертикальных или обоих горизонтальных путях, то между ячейками не может быть L-образного пути.
(Я с трудом пытался выдвинуть это объяснение - надеюсь, было понятно)
Попробуйте запустить приведенный ниже фрагмент в любом браузере, совместимом с EcmaScript 6
источник