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


12

Дано не порожній 2D масив, що складається з 0і 1, знайдіть кількість квадратів, у яких 4 кути 1. Квадрати не повинні бути «вертикальними». Гарантовано, що всі ряди однакової довжини.

Дозволені розумні методи введення / виводу.

Тести:

0001000
1000000
0000000
0000100
0100000

Це повертається 1.

10101
00000
10100
00000
10001

Це повертається 2.

1111
1111
1111
1111

Це повертається 20.

Це . Найкоротша відповідь у байтах виграє. Застосовуються стандартні лазівки .


Інше тлумачення, якщо я розумію наміри: 4 1s на квадраті, таким чином, щоб кожен 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.