Задний план
У меня есть куча старых и зернистых черно-белых изображений. Некоторые из них изображают вьющиеся по стене лозы, другие нет - ваша задача классифицировать их для меня.
Вход и выход
Ваш ввод представляет собой прямоугольный двумерный массив битов A , заданный в любом удобном формате. Он не будет пустым, но не обязательно будет содержать 0 и 1. Массив изображает виноградную лозу, если выполняются следующие условия:
- Нижний ряд А содержит как минимум один 1. Это корни виноградной лозы.
- Каждый 1 в A связан с нижним рядом путем 1, который идет только влево, вправо и вниз (не вверх и не по диагонали). Эти пути являются ветвями виноградной лозы.
Ваш вывод является непротиворечивым истинным значением, если на входе изображена лоза, и непротиворечивым ложным значением в противном случае.
Примеры
Этот массив изображает лозу:
0 0 1 0 0 1
0 1 1 0 0 1
0 1 0 1 1 1
1 1 0 1 0 1
0 1 1 1 0 1
0 0 1 0 1 1
Эти входные данные не изображают лозу, поскольку в середине правой границы есть 1, который не связан с корнями веткой:
0 0 0 1 1 0
0 1 0 1 1 1
0 1 0 1 0 1
0 1 1 1 1 0
0 0 1 1 0 1
Массив all-0 никогда не отображает лозу, а массив all-1 всегда отображает.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Контрольные примеры
Истинные входы:
1
0
1
1
01
11
0000
0111
1100
1001
1111
1111
1111
1111
001001
011001
010111
110101
011101
001011
1011011
1001001
1111111
0100000
0111111
1111001
1001111
1111101
0000000
0011100
0010100
0011100
0001000
1111111
0001000
0011100
0010100
0010100
Ложные входы:
0
1
0
10
01
000
000
000
011
110
000
111111
000000
101011
111001
010010
001000
000010
110001
001100
111111
110101
010011
111011
000110
010111
010101
011110
001101
11000000
10110001
10011111
11110001
01100011
00110110
01101100
01100001
01111111
Ответы:
Улитки ,
251917 байтПопробуйте онлайн!
объяснение
Snails - это язык сопоставления с двумерным шаблоном, вдохновленный regex, который изначально был разработан для нашей задачи проектирования языка сопоставления с двумерным рисунком .
В
&
ДАЕТ Улитки попробовать образец из всех возможных стартовой позиции и печатает0
или в1
зависимости от того, терпит ли картина в какой - либо из них или матчей во всех из них.Теперь улитки могут работать с неявными круглыми скобками, поэтому шаблон является сокращением для следующего:
,
Действует как*
в регулярном выражении (т.е. соответствует ноль или более раз), в то время как+
такое же , как в регулярном выражении (соответствует один или несколько раз). Таким образом, мы начинаем с сопоставления\0z
так часто, как это необходимо, что соответствует одному,0
а затем позволяет улитке произвольно изменять свое направлениеz
. Это позволяет вводить нули во входные данные, при условии, что допустимая ячейка винограда может быть найдена где-либо еще.Затем мы сопоставляем хотя бы один
\1dlr
, который соответствует одному,1
а затем позволяет улитке сбрасывать свое направление вниз, влево или вправо. Обратите внимание, что если ячейка, с которой мы начали, содержит a,1
то мы соответствуем только этой части. Это в основном позволяет улитке пересекать виноградную лозу от ветви до корней.Наконец, нам нужно убедиться, что мы достигли земли, ища за пределами ячейки (
~
) ниже (d
).источник
JavaScript (ES6), 135 байт
Примечание. Из-за ограничений целочисленного типа работает только для лоз шириной до 31 символа. Объяснение: Каждая строка побитовая И соединяется со смежной строкой для определения точек соединения, а затем
g
функция используется для рекурсивного расширения строки по горизонтали, пока она больше не сможет расширяться. Например, если есть две соседние строки,1110111
а1011100
затем точки подключения,1010100
и это затем расширяется,1110110
а1110111
затем обнаруживает, что строка связана. Еслиg
функция завершается с ошибкой, она возвращает ноль, что также приводитg
к сбою всех последующих функций, и результат становится ложным. Еслиg
функция завершается успешно, она возвращает новую строку, которая затем распространяется через,reduce
чтобы проверить следующую строку.источник
Python 2, 254 байта
Нет библиотек
Обратите внимание, что отступы второго и третьего уровня формируются с помощью вкладок в количестве байтов.
Попробуйте онлайн
источник
Вольфрам - 254
Потратьте некоторое время на создание этой работы, поэтому я просто оставлю это здесь:
В основном я строю сеточный граф с направленными ребрами вверх, удаляю вершины, которые соответствуют 0, проверяю, чтобы нижние компоненты вершин содержали все вершины. Смешно, я знаю ...
источник
Python + NumPy
204202195 байтПредполагается,
A
что это двумерный массив.Берет матрицу, дополняет нулями столбцы влево и вправо и выравнивает матрицу.
s
это трафарет, который указывает на левый, правый и нижний элемент. Цикл проверяет каждый элемент, кроме последней строки, если он есть,1
и хотя бы один из его шаблонов1
, возвращаетFalse
иначе. После этого проверьте, есть ли в последней строке1
.Два теста для вас:
Edit1:
1<0
корочеFalse
Edit2:
flat
прекрасная альтернативаflatten()
и использование табуляторов для второго намерения в циклеисточник