Objectif
Vous obtenez un entier n
( n > 1
). Vous devez sortie le nombre de permutations des nombres entiers 1
à n
il y a qui commencent à la 1
fin à n
, et n'ont pas deux entiers consécutifs qui diffèrent par 1.
Alternativement, si vous prenez le graphique complet K_n
et supprimez les bords du chemin, 1-2-3-...-n
vous devez compter les chemins hamiltoniens de 1
à n
dans le graphique restant.
Les exemples utiliseront f(n)
pour une fonction qui accepte n
et génère le nombre de permutations valides, mais votre soumission peut être une fonction ou un programme.
Exemples
Pour n = 6
, une solution possible est1-3-5-2-4-6
Cependant, ce 1-3-5-2-6-4
n'est pas une solution valable car elle ne se termine pas par 6
.
En fait, pour n = 6
, il n'y a que 2 solutions ( 1-4-2-5-3-6
c'est l'autre).
Par conséquent f(6) = 2
.
Car n = 4
les seules permutations qui commencent 1
et se terminent par 4
sont 1-2-3-4
et 1-3-2-4
. Dans les deux, le 2
est adjacent au 3
, ce qui donne des entiers consécutifs qui diffèrent de 1. Par conséquent f(4) = 0
.
Cas de test
f(6) = 2
f(4) = 0
f(8) = 68
f(13) = 4462848
Critère gagnant
C'est le code-golf, la réponse la plus courte l'emporte.
la source
[2..n-1]
ne contiennent pas de deltas de1
ou-1
, vous devez également vérifier qu'aucun d'entre eux ne commence2
ou ne se termine parn-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
Je passe un peu de temps à essayer d'utiliser les formules, mais je ne peux pas en composer une qui génère la séquence. Étonnant de voir l'exposant de z est l'entrée de la formule et le résultat est le facteur de multiplication. Celui qui peut en déduire la formule peut être celui avec la réponse la plus courte en octetsRéponses:
MATL , 16 octets
Essayez-le en ligne!
Pour les entrées supérieures,
12
il manque de mémoire.Explication
la source
Mathematica, 58 octets, temps polynomial ( n )
Comment ça fonctionne
Plutôt que d'itérer sur les permutations avec force brute, nous utilisons le principe d'inclusion-exclusion pour les compter de manière combinatoire.
Soit S l'ensemble des permutations de [1,…, n] avec σ 1 = 1, σ n = n , et soit S i l'ensemble des permutations σ ∈ S telles que | σ i - σ i + 1 | = 1. Ensuite, le nombre que nous recherchons est
| 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 |.
Maintenant, | S i 2 ∩ ⋯ ∩ S i k - 1 | dépend uniquement de k et du nombre j de séries d'indices consécutifs dans [ i 1 , i 2 ,…, i k - 1 , i k ] où pour des raisons de commodité nous fixons i 1 = 0 et i k = n . Plus précisément,
| S i 2 ∩ ⋯ ∩ S i k - 1 | = 2 j - 2 ( n - k ) !, pour 2 ≤ j ≤ k ≤ n ,
| S i 2 ∩ ⋯ ∩ S i k - 1 | = 1, pour j = 1, k = n + 1.
Le nombre de ces ensembles d'index [ i 1 , i 2 ,…, i k - 1 , i k ] avec j exécutions est
( k - 1 C j - 1 ) ( n - k C j - 2 ), pour 2 ≤ j ≤ k ≤ n ,
1, pour j = 1, k = n + 1.
Le résultat est alors
(−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 ( n - k )!
La somme intérieure sur j peut être écrit à l' aide du hypergeometric 2 F 1 fonction :
(−1) n - 1 + ∑ 2 ≤ k ≤ n (−1) k ( k - 1) 2 F 1 (2 - k , k - n ; 2; 2) ( n - k )!
auquel nous appliquons une transformation Pfaff qui nous permet de jouer au golf les puissances de -1 en utilisant une valeur absolue:
(−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 )! |.
Démo
la source
Gelée ,
1716 octetsUn lien monadique.
Essayez-le en ligne!
Comment?
la source
IỊṀ
soit valide. Plus précisément, que se passe-t-il si l'-2
un des deltas s'y trouve par exemple? Vous pouvez corriger avecIAỊṀ
pour +1.x <= 1
.Japt ,
1918 octetsTestez-le en ligne! Je ne recommanderais pas de tester sur quelque chose de plus grand que
10
.Explication
la source
1
.n > 1
.05AB1E , 17 octets
Essayez-le en ligne!
la source
¹1Š)˜
enregistre un octet.Haskell,
7665 octetsEnregistré 11 octets grâce à @xnor.
En utilisant le résultat de la
Q_rec
page 7 de la découverte de @ ChristiaanWesterbeek, nous obtenonsJe ne comprends pas comment leur prochain résultat
ha
lié à cela, mais après avoir accéléré (d'abord par mémorisation, voir les versions antérieures, puis comme ci-dessous), j'obtiens leurs chiffres.Bien que ce qui précède soit acceptable
n=20
, c'est un exemple essentiel pour ne pas faire de récursivité. Voici une version plus rapide (uniquement pourn>=6
) qui n'aurait également besoin que d'une mémoire constante - si seulement les chiffres ne continuaient pas d'augmenter ...Ça donne
Ce n'est pas un problème pour obtenir également
f 5000
mais je ne veux pas coller le résultat ...BTW, il est possible de ne pas utiliser de mathématiques fantaisistes et de ne pas utiliser de force (ultra) brute. Tout d'abord, au lieu de regarder toutes les permutations, regardez les permutations partielles et ne les étendez que lorsqu'elles ne sont pas déjà invalides. Il est inutile de regarder toutes les permutations en commençant par
1 6 5
. Deuxièmement, certaines permutations partielles aiment1 3 5 7
et1 5 3 7
ont exactement les mêmes continuations valides, alors gérez-les ensemble. En utilisant ces idées, j'ai pu calculer les valeurs jusqu'àn=16
0,3 s.la source
f n=sum$zipWith((*).f)[n-5..][n-4,1,10-2*n,4,n-2]
.Python, 125 octets
la source
Mathematica, 66 octets
Explication
Function
avec le premier argument#
.la source
Javascript (ES6),
100747260 octetsVoici la version avant la maîtrise du golf de @PeterTaylor
Merci à la réponse de @ChristianSievers qui a réussi à rédiger une solution Haskell à partir d'un document que j'ai trouvé après avoir googlé '0, 2, 10, 68, 500, 4174, 38774, 397584', voici une version Javascript qui ne permutait pas trop.
Usage
la source
f(n)
quandn>1
, donc peu importe ce que vous retournezn=1
. Je pense aussi quef(1)=1
c'est correct.n<6?n==1|0:
pour une autre économie de deux caractères.f=n=>n--<6?!n|0:f(n)*--n+4*f(n--)-2*f(n--)*--n+f(n)*++n+f(n)
Brachylog , 26 octets
Essayez-le en ligne!
Explication
la source
Python 3 ,
109107102 102 octetsEssayez-le en ligne!
Suppression de quatre octets en n'essayant pas de mettre une ligne sur la fonction (comme suggéré par @shooqie) et d'un autre octet en le remplaçant
abs
par un carré. (Nécessite Python 3.5+)la source
Python 2 , 136 octets
-10 octets grâce à @ovs.
Essayez-le en ligne!
la source
Mathematica, 134 octets
cas de test n: 2 à 12
la source
Python 2 , 105 octets
Essayez-le en ligne!
Ceci est basé sur l'article de Philippe Flajolet découvert par @Christiaan Westerbeek ; c'est beaucoup plus rapide et deux octets plus court que ma solution Python 3 qui énumère les permutations possibles. (Dans Python 3,
reduce
a été déplacé de façon agaçantefunctools
.)Il existe une version beaucoup plus courte utilisant le produit scalaire de numpy, mais qui déborde assez rapidement et nécessite que numpy ait été importé. Mais pour ce que ça vaut:
la source