Цель
Вам дано целое число n
( n > 1
). Вы должны вывода , сколько перестановок чисел 1
на n
есть , которые начинаются с 1
, заканчиваются на n
, и не имеют два последовательных целых чисел , которые отличаются на 1.
В качестве альтернативы, если вы возьмете полный граф K_n
и удалите ребра пути, 1-2-3-...-n
вы должны посчитать гамильтоновы пути от 1
до n
в оставшемся графе.
В примерах будет использоваться f(n)
функция, которая принимает n
и выводит количество допустимых перестановок, но ваша отправка может быть функцией или программой.
Примеры
Для n = 6
возможного решения1-3-5-2-4-6
Тем 1-3-5-2-6-4
не менее, это не является действительным решением, поскольку оно не заканчивается 6
.
На самом деле, для n = 6
, есть только 2 решения ( 1-4-2-5-3-6
есть другое).
Отсюда f(6) = 2
.
Для n = 4
единственных перестановок, которые начинаются 1
и заканчиваются в 4
являются 1-2-3-4
и 1-3-2-4
. В обоих из них 2
смежно с 3
, давая последовательные целые числа, которые отличаются на 1. Следовательно f(4) = 0
.
Контрольные примеры
f(6) = 2
f(4) = 0
f(8) = 68
f(13) = 4462848
Критерий победы
Это код-гольф, самый короткий ответ выигрывает.
источник
[2..n-1]
не содержат дельт1
или-1
, вы также должны проверить, что ни одна из них не начинается2
или не заканчиваетсяn-1
...Q_ser:=z + 2 z^6 + 10 z^7 + 68 z^8 + 500 z^9 + 4174 z^10 + 38774 z^11 + 397584z^12 + 4462848 z^13 + 54455754 z^14
я сейчас провожу некоторое время, пытаясь использовать формулы, но я не могу составить тот, который генерирует последовательность. Удивительно, что показатель степени z является входом формулы, а результат - коэффициентом умножения. Тот, кто может вывести формулу из этого, может быть один с самым коротким ответом в байтахОтветы:
MATL , 16 байт
Попробуйте онлайн!
Для входов, превышающих
12
его, не хватает памяти.объяснение
источник
Mathematica, 58 байт, полиномиальное ( n ) время
Как это устроено
Вместо того, чтобы перебирать перестановки с помощью грубой силы, мы используем принцип включения-исключения для подсчета их комбинаторно.
Пусть S - множество всех перестановок из [1,…, n] с σ 1 = 1, σ n = n , и пусть S i - множество перестановок σ ∈ S, таких что | σ i - σ i + 1 | = 1. Тогда искомый счет
| S | - | S 1 ∪ ⋯ ∪ S n - 1 | = ∑ 2 ≤ k ≤ n + 1; 1 ≤ i 2 <⋯ < i k - 1 < n (−1) k - 2 | S i 2 ∩ ⋯ ∩ S i k - 1 |.
Теперь | S i 2 ∩ ⋯ ∩ S i k - 1 | зависит только от k и от числа j серий последовательных индексов в [ i 1 , i 2 ,…, i k - 1 , i k ], где для удобства мы фиксируем i 1 = 0 и i k = n . В частности,
| S i 2 ∩ ⋯ ∩ S i k - 1 | = 2 Дж - 2 ( н - К ) !, для 2 ≤ j ≤ k ≤ n ,
| S i 2 ∩ ⋯ ∩ S i k - 1 | = 1, для j = 1, k = n + 1.
Число таких наборов индексов [ i 1 , i 2 ,…, i k - 1 , i k ] с j пробегами равно
( k - 1 C j - 1 ) ( n - k C j - 2 ), для 2 ≤ j ≤ k ≤ n ,
1, для j = 1, k = п + 1.
Результат тогда
(−1) n - 1 + ∑ 2 ≤ k ≤ n ∑ 2 ≤ j ≤ k (−1) k - 2 ( k - 1 C j - 1 ) ( n - k C j - 2 ) 2 j - 2 ( н - к )!
Внутренняя сумма по J можно записать с помощью гипергеометрический 2 F 1 функцию :
(−1) n - 1 + ∑ 2 ≤ k ≤ n (−1) k ( k - 1) 2 F 1 (2 - k , k - n ; 2; 2) ( n - k )!
к которому мы применяем преобразование Пфаффа, которое позволяет нам убрать степени -1, используя абсолютное значение:
(−1) n - 1 + ∑ 2 ≤ k ≤ n (−1) n ( k - 1) 2 F 1 ( k , k - n ; 2; 2) ( n - k )!
= | −1 + ∑ 1 ≤ k ≤ n ( k - 1) 2 F 1 ( k , k - n ; 2; 2) ( n - k )! |.
демонстрация
источник
Желе ,
1716 байтМонадическая ссылка.
Попробуйте онлайн!
Как?
источник
IỊṀ
является действительным. В частности, что, если, например,-2
есть одна из дельт? Вы можете исправить с помощьюIAỊṀ
+1.x <= 1
.Japt ,
1918 байтПроверьте это онлайн!Я бы не рекомендовал тестировать что-либо большее, чем
10
.объяснение
источник
1
.n > 1
.05AB1E , 17 байт
Попробуйте онлайн!
источник
¹1Š)˜
сохраняет байт.Haskell,
7665 байтСохранено 11 байт благодаря @xnor.
Используя результат
Q_rec
поиска на странице 7 из @ ChristiaanWesterbeek, мы получимЯ не понимаю, как их следующий результат
ha
связан с этим, но после ускорения (сначала по запоминанию, см. Более ранние версии, затем, как показано ниже), я получаю их числа.Хотя вышесказанное вполне подходит
n=20
, это, в сущности, пример того, как не делать рекурсию. Вот более быстрая версия (только дляn>=6
), которая также будет нуждаться только в постоянной памяти - если бы только цифры не продолжали увеличиваться ...Что дает
Это тоже не проблема,
f 5000
но я не хочу вставлять результат ...Кстати, можно не использовать причудливую математику и все же не использовать (ультра) грубую силу. Во-первых, вместо просмотра всех перестановок, посмотрите на частичные перестановки и расширяйте их только тогда, когда они еще не являются недействительными. Бесполезно смотреть на все перестановки, начиная с
1 6 5
. Во-вторых, некоторые частичные перестановки похожи1 3 5 7
и1 5 3 7
имеют одинаковые действительные продолжения, поэтому обрабатывайте их вместе. Используя эти идеи, я мог вычислить значения доn=16
0,3 с.источник
f n=sum$zipWith((*).f)[n-5..][n-4,1,10-2*n,4,n-2]
.Python, 125 байт
источник
Mathematica, 66 байт
объяснение
Function
с первым аргументом#
.источник
Javascript (ES6),
100747260 байтНиже приведена версия до гольф-мастерства @PeterTaylor
Благодаря ответу @ChristianSievers, которому удалось написать решение Haskell из бумаги которую я нашел после поиска в Google '0, 2, 10, 68, 500, 4174, 38774, 397584', вот версия Javascript, которая также не переставляет.
использование
источник
f(n)
когдаn>1
, поэтому не имеет значения, за что вы возвращаетесьn=1
. Тоже считаюf(1)=1
правильным.n<6?n==1|0:
для дальнейшего сохранения двух символов.f=n=>n--<6?!n|0:f(n)*--n+4*f(n--)-2*f(n--)*--n+f(n)*++n+f(n)
Брахилог , 26 байт
Попробуйте онлайн!
объяснение
источник
Python 3 ,
109107102 байтаПопробуйте онлайн!
Удалил четыре байта, не пытаясь поставить в одну строку функцию (как предложено @shooqie) и другой байт, заменив
abs
квадрат. (Требуется Python 3.5+)источник
Python 2 , 136 байт
-10 байт благодаря @ovs.
Попробуйте онлайн!
источник
Mathematica, 134 байта
контрольные примеры от 2 до 12
источник
Python 2 , 105 байт
Попробуйте онлайн!
Это основано на статье Филиппа Флажоле, обнаруженной @Christiaan Westerbeek ; это намного быстрее и на два байта короче моего решение Python 3, которое перечисляет возможные перестановки. (В Python 3
reduce
был досадно перенесен вfunctools
.)Существует гораздо более короткая версия, использующая точечный продукт numpy, но она переполняется довольно быстро и требует импорта numpy. Но для чего это стоит:
источник