Цель
Целью этой задачи является создание функции, n
которая вычисляет количество способов разбить n X 1
сетку на треугольники, где все вершины треугольников находятся в точках сетки.
пример
Например, существует 14 способов разбиения сетки 2 x 1, поэтому f(2) = 14
через следующие разделы,
где разделы имеют 2, 2, 2, 2, 4 и 2 разных ориентации соответственно.
счет
Это код-гольф , поэтому выигрывает самый короткий код.
code-golf
geometry
combinatorics
grid
Питер Кейджи
источник
источник
Ответы:
05AB1E , 13 байтов
Порт @Bubbler 's Jelly ответа .
Очень медленный из-за встроенных перестановок.
Попробуйте онлайн или проверьте первые четыре входа .
Объяснение:
источник
Haskell ,
60 55 5452 байтаПосле рисования и программирования множества примеров мне пришло в голову, что это то же самое, что и проблема ладей:
В основном у вас есть верхняя и нижняя линия сетки1 × n . Теперь вам нужно заполнить не горизонтальную линию. Каждый треугольник должен иметь две не горизонтальные линии. Независимо от того, является ли одна из его сторон частью верхней или нижней линии, соответствует направлению и длине, которую вы бы выбрали в задаче о грачах. Это OEIS A051708 . В качестве иллюстрации этого соответствия рассмотрим следующие примеры. Здесь верхняя линия соответствует восходящим движениям, а нижняя соответствует правым движениям.
Спасибо @PeterTaylor за -6 байтов и @PostLeftGarfHunter за -2 байта!
Попробуйте онлайн!
источник
A051708(n+1)
. Поэтому я отправил первый правильный ответ :-PHaskell , 42 байта
Попробуйте онлайн!
Довольно прямая реализация, которая рекурсивно использует более 2 переменных.
Вот как мы можем получить это решение. Начнем с кода, реализующего прямую рекурсивную формулу:
54 байта
Попробуйте онлайн!
Использование интерпретации ладья перемещения flawr в ,
a%b
это число путей , которые получают ладью от(a,b)
к(0,0)
, используя только перемещает уменьшение координаты. Первый ход либо уменьшается,a
либо уменьшаетсяb
, а другой остается тем же, отсюда и рекурсивная формула.49 байтов
Попробуйте онлайн!
Мы можем избежать повторения
map(a%)[0..b-1]++map(b%)[0..a-1]
, отметив, что две половины одинаковыa
иb
поменялись местами. Вспомогательный вызовa?b
подсчитывает пути, где уменьшается первый ходa
, и, таким образом,b?a
подсчитывает пути, где уменьшается первый ходb
. Они в целом разные, и они добавляют кa%b
.Суммирование в
a?b
может также быть записано как понимание спискаa?b=sum[a%i|i<-[0..b-1]]
.42 байта
Попробуйте онлайн!
Наконец, мы избавиться
%
и просто написать рекурсию с точки зрения?
путем заменыa%i
сa?i+i?a
в рекурсивном вызове.Новый базовый случай приводит
?
к тому, что это дает выходные данные вдвое больше, чем?
в 49-байтовой версии, так как с0?0=1
, мы бы получили0%0=0?0+0?0=2
. Это позволяет использовать определениеf n=n?n
без деления пополам, что нам нужно для других.источник
a%b
подсчитывает количество секций, используя узлы0,1,...,a
в верхней строке, и кивает0,1,..,b
в нижней строке. Операторa?b
подсчитывает количество способов добавить новую строку из верхнего узла,a
если нижний узелb
уже используется. (Вы можете подключитьсяa
ко всем узлам[0,1,...,b-1]
, но затем вам придется выполнить повторение для каждого из них.)?
из 42 байтов, которые я не делаю, и что особенно любопытно, это то, что это не симметрично.map...
понимание списка, на втором шаге мы просто добавим определение%
:a?b=sum$map(a%)[0..b-1], a%b=a?b+b?a
a?b=sum[a%i|i<-[0..b-1]], a%b=a?b+b?a
a?b=sum[a?i+i?a|i<-[0..b-1]]
CJam (24 байта)
Онлайн демо
Это использует подход Bubbler суммирования по перестановкам
n
0s иn
1.рассечение
Альтернативный подход (28 байт)
Онлайн демо
рассечение
Все треугольники имеют одно горизонтальное ребро и два ребра, которые связывают горизонтальные линии. Пометьте негоризонтальные ребра с помощью кортежа их двух x-координат и отсортируйте лексикографически. Тогда первое ребро
(0,0)
, последнее ребро(n,n)
, и два последовательных ребра отличаются точно в одном из двух положений. Это делает простую рекурсию, которую я реализовал, используя запомненный оператор рекурсииj
:Заметка
Это не первый раз, когда я хотел
fj
чтобы меня поддерживали в CJam. Здесь это также уменьшит счет до 24 байтов. Возможно, я должен попытаться написать патч ...источник
Желе ,
1514 байтПопробуйте онлайн!
-1 байт на основе комментария Питера Тейлора.
Использует иллюстрацию flawr напрямую, а не полученную формулу.
Как это устроено
Возьмите все возможные маршруты по квадратной сетке. Количество способов перемещения L единиц в одном направлении, как ладья
2**(L-1)
. Примените это к каждому маршруту и суммируйте количество способов прохождения каждого маршрута.источник
Древесный уголь ,
4431 байтвычеркнул 44 все еще регулярно 44
Попробуйте онлайн! Объяснение: Работает, вычисляя количество способов разбить трапецию противоположных длин сторон
m,n
на треугольники, которые все лежат на целочисленных смещениях. Это просто общий случай прямоугольника размераn
в вопросе. Число разделов дается рекурсивно как суммы номеров разделов для всех сторонm,0..n-1
иn,0..m-1
. Это эквивалентно обобщенной проблеме ладей, OEIS A035002 . Код просто вычисляет количество рабочих разделов, начиная0,0
сn,n
использования ранее вычисленных значений.Цикл по рядам
0..n
.Начните с пустой строки.
Обведите столбцы в строке
0..n
.Возьмите строку и значения в предыдущих строках в текущем столбце и добавьте общую сумму к текущей строке. Однако, если значений нет вообще, подставьте
1
вместо суммы.Добавьте готовую строку в список строк.
Выведите окончательное значение, рассчитанное.
источник
JavaScript (ES6),
45 4442 байтаИспользует рекурсивную формулу, найденную Питером Тейлором и Flawr .
Попробуйте онлайн!
источник
Пари / ГП , 43 байта
Согласно OEIS , производящей функцией этой последовательности является
Попробуйте онлайн!
источник
Python 3 , 51 байт
Попробуйте онлайн!
Порт ответа
источник