Скажите, сколько там квадратов?


12

Для непустого двумерного массива, состоящего из 0и 1, найдите количество квадратов, у которых все 4 угла 1. Квадраты не должны быть "вертикальными". Все строки гарантированно имеют одинаковую длину.

Разумные методы ввода / вывода допускаются.

Testcases:

0001000
1000000
0000000
0000100
0100000

Это возвращается 1.

10101
00000
10100
00000
10001

Это возвращается 2.

1111
1111
1111
1111

Это возвращается 20.

Это . Кратчайший ответ в байтах побеждает. Применяются стандартные лазейки .


Другая интерпретация, если я понимаю намерение: 4 1с на квадрате, так что каждый 1равноотстоящий по периметру от своих двух соседей.
feersum

@feersum Последнее условие верно для каждого квадрата, не так ли?
Wojowu

Ответы:


18

JavaScript (ES6), 127 124 119 байтов

Сохранено 3 байта благодаря nderscore

m=>(F=(x,y)=>m.map((r,Y)=>r.map((i,X)=>i?1/y?n+=x<X&y<=Y&(g=(a,b)=>(m[b+X-x]||0)[a-Y+y])(x,y)&g(X,Y):F(X,Y):0)))(n=0)|n

Как?

Эта функция выполняет итерацию по всем парам ячеек (x, y) , (X, Y) входной матрицы m , так что:

  • m [x, y] = m [X, Y] = 1
  • х <х
  • y ≤ Y

Каждая подходящая пара описывает координаты потенциального ребра квадрата. Уравнения гарантируют, что каждое ребро тестируется только один раз.

Мы используем вектор [dx, dy] = [X - x, Y - y], повернутый на 90 ° по часовой стрелке, чтобы проверить ячейки, расположенные в [x - dy, y + dx] и [X - dy, Y + dx] . Если они оба содержат 1 , мы нашли правильный квадрат.

площадь

Контрольные примеры


-2 байта: g=(a,b)=>(m[b+X-x]||0)[a-Y+y]-1 байт: использовать |nвместо&&n
nderscore

6

MATL , 20 байтов

&fJ*+4XN!"@&-|un3=vs

Вход представляет собой матрицу.

Попробуйте онлайн!

Как это устроено

Он находит все координаты ненулевых элементов входной сетки и представляет их в виде комплексных чисел, так что индексы строк и столбцов соответствуют действительной и мнимой частям соответственно.

Затем код генерирует массив всех комбинаций (порядок не имеет значения) этих чисел, взятых по 4 за раз. Каждая комбинация представляет собой квадрат кандидата. Для каждой комбинации вычисляется матрица парных абсолютных разностей (т.е. расстояния в комплексной плоскости) 4 × 4. Это симметричная матрица с нулями вдоль ее главной диагонали. Текущая комбинация образует квадрат тогда и только тогда, когда матрица содержит ровно 3 различных значения (это будет сторона квадрата, квадратная диагональ и ноль):

введите описание изображения здесь

С другой стороны, например, неквадратный прямоугольник даст 4 различных значения (две стороны, одно диагональное значение и ноль);

введите описание изображения здесь

и общий четырехугольник может иметь до 7 значений (четыре стороны, две диагонали и ноль):

введите описание изображения здесь

&f      % Input (implicit). Push vectors of row and column indices of nonzero entries
J*      % Multiply by imaginary unit
+       % Add the two vectors. Gives a vector of complex coordinates
4XN     % Matrix of combinations of these complex numbers, taken 4 at a time. Each
        % row is a combination
!       % Transpose
"       % For each column
  @     %   Push current column: candidate set of four points
  &-    %   All pair-wise differences
  |     %   Absolute value
  u     %   Unique entries
  n3=   %   Does the number of elements equal 3? Gives true (1) or false (0)
  vs    %   Concatenate vertically with previous accumulated result, and sum
        % End (implicit). Display (implicit)

Как это работает?
Утренняя монахиня

Добавлено @LeakyNun Объяснение
Луис Мендо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.