Вызов
Эта задача будет вам написать программу , которая принимает в двух целых чисел n
и m
и выводит число непересекающихся петель на n
на m
торе , сделанных начиная с (0,0)
и только предпринимают шаги вверх и вправо. Вы можете думать о торе как о решетке с закруглением сверху и снизу и по бокам.
Это код-гольф, поэтому побеждает меньше байтов.
пример
Например, если введено n=m=5
одно допустимое
(0,0) -> (0,1) -> (0,2) -> (1,2) -> (2,2) -> (2,3) -> (2,4) ->
(2,0) -> (3,0) -> (4,0) -> (4,1) -> (4,2) -> (4,3) ->
(0,3) -> (1,3) -> (1,4) ->
(1,0) -> (1,1) -> (2,1) -> (3,1) -> (3,2) -> (3,3) -> (3,4) -> (4,4) ->
(0,4) -> (0,0)
как показано на рисунке.
Некоторые примеры ввода / вывода
f(1,1) = 2 (up or right)
f(1,2) = 2 (up or right-right)
f(2,2) = 4 (up-up, up-right-up-right, right-right, right-up-right-up)
f(2,3) = 7
f(3,3) = 22
f(2,4) = 13
f(3,4) = 66
f(4,4) = 258
code-golf
combinatorics
grid
topology
Питер Кейджи
источник
источник
Ответы:
Желе , 28 байт
Монадическая ссылка, принимающая список
[m,n]
, который выдает счет.TIO-jt1qe1v9 ... хотя в этом нет особого смысла, он слишком неэффективен.
(Я даже не могу работать
[2,3]
локально с 16 ГБ оперативной памяти)!Как?
Грубая сила - создает достаточно большие координаты мозаичной версии, затем фильтрует набор мощностей этих точек по тем путям, у которых соседние объекты увеличиваются только на единицу в одном направлении, затем фильтрует по тем, которые начинаются с минимальной координаты (т. Е. Начала координат), и, в то же время удаляет эту начальную координату из каждого. Затем использует арифметику по модулю для возврата к тору и отфильтровывает любые содержащие повторяющиеся координаты (т. Е. Содержащие пересечения) и, наконец, фильтрует те, которые имеют минимальные конечные координаты (т. Е. Заканчивающиеся в начале координат), и возвращает длину результата.
источник
Python 2 , 87 байт
Попробуйте онлайн!
Здесь интересно использовать комплексное число
z
для хранения координаты текущей позиции. Мы можем двигаться вверх, добавляя,1
и двигаться вправо, добавляя1j
. К моему удивлению, модуль работает с комплексными числами таким образом, что позволяет нам обрабатывать перенос для каждого измерения отдельно: выполнение%m
действует на действительную часть и%(n*1j)
воздействует на мнимую часть.источник
k:=x+y*m
. Это заставляет меня задуматься о том, будет ли короче использоватьk
непосредственно для(x,y)
, используя,x+y*m
а неx+y*1j
. Жаль, что Python 3 не допускает сложный модуль.JavaScript (ES6), 67 байт
Принимает вход как
(m)(n)
.Попробуйте онлайн!
Чтобы это работало для любого ввода, мы могли бы использовать BigInts для 73 байтов :
Попробуйте онлайн!
JavaScript (ES6),
76 7372 байтаПринимает вход как
(m)(n)
.Попробуйте онлайн!
комментарии
источник
Haskell,
8880 байтПопробуйте онлайн!
Простая грубая сила: попробуйте все комбинации вверх / вправо, отбрасывая те, которые пересекаются (мы сохраняем все позиции, которые мы посетили, в списке
a
) и подсчитываем те, которые в конечном итоге достигают позиции(0,0)
снова.Базовый случай рекурсии - это когда мы посещаем позицию во второй раз (
elem(x,y)a
). Результатом является0^0
=,1
когда позиция равна(0,0)
и учитывает количество циклов или0
(0^x
сx
ненулевым значением) в противном случае и не увеличивает количество циклов.Изменить: -8 байт благодаря @xnor.
источник
|elem(x,y)a=0^(x+y)
и(0!0)[]
могут быть0!0$[]
.Желе , 44 байта
Попробуйте онлайн!
источник
Java 8, 120 байт
Попробуйте онлайн.
источник
CJam (50 символов)
Демо онлайн . Это программа, которая принимает два входа от стандартного ввода.
Наконец у нас есть ответ на вопрос
рассечение
источник
Желе ,
5439 байтПопробуйте онлайн!
Я отправил это как отдельный ответ на мой другой Jelly, потому что это совершенно другой метод. Это в принципе ближе к ответу @ Арно. Он использует рекурсивную функцию, которая работает через все возможные пути, пока не достигнет точки, к которой уже достиг, а затем возвращает результат проверки, вернулась ли она в начало. Я подозреваю, что можно сбрить еще несколько байтов. Теперь изменилось использование оператора слайса. Хорошо работает до 5х5. Глубина рекурсии должна быть не более mx n.
источник