В качестве продолжения этой задачи мы теперь хотим подсчитать количество прямоугольников в сетке с r строками и столбцами c, где есть линия, пересекающая каждую диагональ квадрата в сетке. Теперь мы по-прежнему считаем те же прямоугольники, что и раньше, но на этот раз мы должны также включить прямоугольники, наклоненные на 45 градусов.
Ваша цель - создать функцию или программу, которая с учетом числа строк r и столбцов c выводит количество прямоугольников в диагональной сетке с размерами ( r , c ).
В качестве демонстрации это анимация, которая перебирает все 37 прямоугольников, образованных диагональной сеткой (2 x 3).
Тестовые случаи
Each case is [rows, columns] = # of rectangles
[0, 0] = 0
[0, 1] = 0
[1, 0] = 0
[1, 1] = 1
[3, 2] = 37
[2, 3] = 37
[6, 8] = 2183
[7, 11] = 5257
[18, 12] = 40932
[42, 42] = 2889558
[51, 72] = 11708274
правила
- Это код-гольф, поэтому выигрывает самый короткий код.
- Встроенные функции, которые решают эту проблему, не допускаются.
Ответы:
Рубин, 58 байт
Это простая реализация алгоритма в выпуске C-ответа Helium Nuclei .
Я изучал, почему эта формула работает, с ограниченным успехом. Нетрудно подтвердить, что количество вертикальных прямоугольников равно
(m+1)*m/2 * (n+1)*n/2
, а количество диагональных прямоугольников немного неуловимо.Нил подтвердил для
m==n
что количество наклонных прямоугольников вn*n
квадрате ,(4*n**4-n*n-3*n)/6
и что , когдаm>n
вам нужно добавить дополнительный(m-n)(n*(4*n*n-1)/3)
(связанный с OEIS A000447 ), хотя это не объясняет , где эти две формулы пришли. Я нашел часть ответа.Для
m==n
формы внутри сетки является Aztec алмаза .Количество прямоугольников в ацтекском алмазе является сумма ряда крупных прямоугольников накладывается , чтобы сделать это (за четвертый алмаз, который находится в
5x5
сетке2x8
,4x6
,6x4
и8x2
) минус число прямоугольников посчитано дважды (число прямоугольники в предыдущем ацтекском алмазе).Формула здесь (TeX будет добавлен позже):
Согласно Вольфраму Альфе, закрытая форма для
f
is1/30*(n-1)*n*(4*n**3+14*n**2+19*n+9)
и закрытая форма дляaztec_rect
is, как обнаружил Нейл1/6*n*(n-1)*(4*n**2+4*n+3) == 1/6*(4*n**4-n**2-3*n)
.Мне еще предстоит выяснить, почему
(m-n)(n*(4*n*n-1)/3)
работает, хотя я подозреваю, что это потому, что одно определение A000447 являетсяbinomial(2*n+1, 3)
. Я буду держать вас в курсе.Обновление: у меня есть основания полагать, что функция количества прямоугольников в расширенном ацтекском алмазе
m>n
связана с количеством наложенных2k*2(n-k)
прямоугольников в минусеF(m-1,n-1)
. Больше результатов, когда они у меня есть.Обновление: я пробовал другой маршрут и в итоге получил другую формулу для расширенных ацтекских алмазов, которая в основном объяснима, но имеет один термин, который я еще не понимаю. Ура! : D
Краткое описание этой последней формулы:
(m-n+1)*(4*n**4-n*n-3*n)/6
количество наложенных ацтекских алмазов размераn
в структуре, аf(n,n) = (4*n**4-n*n-3*n)/6
.f(7,3)
имеет 5 наложенных ацтекских бриллиантов размером3
, в то время какf(3,3)
имеет только 1 бриллиант.-f(m-1,n-1)
удаляет некоторые повторяющиеся прямоугольники из середины наложенных алмазов.+(m-n)*2
составляет 2 дополнительных2
матрицу с размерностью(2n-1)
прямоугольников для каждого дополнительного бриллианта.+(m-n)*(n-2)
счета за дополнительнуюn
матрицу с размерностьюn
квадрата для каждого дополнительного бриллианта.-(m-n-1)*f(n-1,n-1)
Это новый загадочный термин. Очевидно, я не учел некоторые дополнительные квадраты в моем подсчете, но я не выяснил, где они находятся в расширенном алмазе.Примечание: когда
m==n
,m-n-1 = -1
означает, что последний член добавляет квадраты к счету. Я мог бы что-то упустить в моей обычной формуле. Полное раскрытие, это было предназначено только для исправления более ранней версии этой формулы, которая только что сработала. Очевидно, мне все еще нужно разобраться в том, что происходит, и, возможно, в моей формуле есть некоторые ошибки. Я буду держать вас в курсе.Рассел, Гэри и Вайстейн, Эрик У. "Ацтек Алмаз". Из MathWorld - веб-ресурс Wolfram. http://mathworld.wolfram.com/AztecDiamond.html
источник
C,
7164 байтаПопробуйте это на Ideone
источник
m==n
: количество наклонных прямоугольников вn*n
квадрате равно(4*n*n*n*n-n*n-3*n)/6
. Последовательность 0, 9, 51, 166, 410, 855, 1589, 2716, 4356, 6645, но в OEIS она отсутствует.m>n
вам нужно добавить дополнительную(m-n)(n*(4*n*n-1)/3)
(последняя часть формулы взята из OEIS A000447). Перестановка и добавление дает формулу @ betseg.m==n
. Затем я вручную вычислил количество наклонных прямоугольников в маленьких прямоугольниках и заметил, что при увеличении более длинного измерения всегда добавляется одинаковое количество прямоугольников для данного более короткого измерения. Я подал приращения в OEIS, который нашел совпадение на A000447.Python,
7368 байтИ хотя следующая версия имеет более высокое число байтов (75), это было хорошее упражнение в поиске мест для использования
~
:источник
x=lambda m,n:m*~m*n*~n/4+n*((2*m-n)*(4*n*n-1)-3)/6if m>n else x(n,m)
def
. Благодарность! Обновлено.Выпуклый,
3736 байтовПопробуйте онлайн!
Использует алгоритм Betseg, модифицированный и оптимизированный для стекового языка. Объяснение придет, когда у меня будет больше свободного времени. Могу поспорить, что это может быть сокращено, но я не собираюсь беспокоиться в данный момент.
источник
Пакет, 82 байта
источник