Objetivo
Te dan un entero n( n > 1). Debe salida cuántas permutaciones de los enteros 1a nhay que comienzan en 1, al final n, y no tienen dos números enteros consecutivos que se diferencian por 1.
Alternativamente, si toma el gráfico completo K_ny elimina los bordes del camino 1-2-3-...-n, debe contar los caminos hamiltonianos desde 1hasta nen el gráfico restante.
Los ejemplos se usarán f(n)para una función que incorpore ny genere el número de permutaciones válidas, pero su envío puede ser una función o un programa.
Ejemplos
Para n = 6, una posible solución es1-3-5-2-4-6
Sin embargo, 1-3-5-2-6-4no es una solución válida ya que no termina con 6.
De hecho, para n = 6, solo hay 2 soluciones ( 1-4-2-5-3-6es la otra).
Por lo tanto f(6) = 2.
Porque n = 4las únicas permutaciones que comienzan 1y terminan en 4son 1-2-3-4y 1-3-2-4. En ambos, el 2es adyacente al 3, dando enteros consecutivos que difieren en 1. Por lo tanto f(4) = 0.
Casos de prueba
f(6) = 2
f(4) = 0
f(8) = 68
f(13) = 4462848
Criterio ganador
Este es el código de golf, gana la respuesta más corta.
fuente

[2..n-1]no contienen deltas de ,1o-1también deben verificar que ninguno de ellos comience2o termine conn-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^14Ahora paso algún tiempo tratando de usar las fórmulas, pero no puedo componer una que genere la secuencia. Es sorprendente ver que el exponente de z es la entrada de la fórmula y el resultado es el factor de multiplicación. El que puede deducir la fórmula a partir de ahí puede ser uno con la respuesta más corta en bytesRespuestas:
MATL , 16 bytes
Pruébalo en línea!
Para entradas que exceden
12se queda sin memoria.Explicación
fuente
Mathematica, 58 bytes, tiempo polinomial ( n )
Cómo funciona
En lugar de iterar sobre permutaciones con fuerza bruta, usamos el principio de inclusión-exclusión para contarlas combinatoriamente.
Sea S el conjunto de todas las permutaciones de [1,…, n] con σ 1 = 1, σ n = n , y sea S i el conjunto de permutaciones σ ∈ S tal que | σ i - σ i + 1 | = 1. Entonces el conteo que estamos buscando es
| 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 |.
Ahora, | S i 2 ∩ ⋯ ∩ S i k - 1 | solo depende de k y del número j de corridas de índices consecutivos en [ i 1 , i 2 , ..., i k - 1 , i k ] donde por conveniencia arreglamos i 1 = 0 e i k = n . Específicamente,
| S i 2 ∩ ⋯ ∩ S i k - 1 | = 2 j - 2 ( n - k ) !, para 2 ≤ j ≤ k ≤ n ,
| S i 2 ∩ ⋯ ∩ S i k - 1 | = 1, para j = 1, k = n + 1.
El número de tales conjuntos de índices [ i 1 , i 2 , ..., i k - 1 , i k ] con j carreras es
( k - 1 C j - 1 ) ( n - k C j - 2 ), para 2 ≤ j ≤ k ≤ n ,
1, para j = 1, k = n + 1.
El resultado es entonces
(−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 suma interior sobre j puede ser escrito utilizando el hipergeométrica 2 F 1 función :
(−1) n - 1 + ∑ 2 ≤ k ≤ n (−1) k ( k - 1) 2 F 1 (2 - k , k - n ; 2; 2) ( n - k )!
a lo que aplicamos una transformación de Pfaff que nos permite eliminar los poderes de −1 usando un valor absoluto:
(−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 )! |.
Manifestación
fuente
Jalea ,
1716 bytesUn enlace monádico.
Pruébalo en línea!
¿Cómo?
fuente
IỊṀsea válido. Específicamente, ¿qué-2pasa si es uno de los deltas allí, por ejemplo? Puedes arreglarlo conIAỊṀ+1.x <= 1.Japt ,
1918 bytes¡Pruébelo en línea! No recomendaría probar en nada más grande que
10.Explicación
fuente
1.n > 1.05AB1E , 17 bytes
Pruébalo en línea!
fuente
¹1Š)˜Guarda un byte.Haskell,
7665 bytesGuardado 11 bytes gracias a @xnor.
Usando el resultado de la
Q_recpágina 7 del hallazgo de @ ChristiaanWesterbeek, obtenemosNo entiendo cómo se relaciona su próximo resultado
hacon esto, pero después de acelerar (primero por memorización, ver versiones anteriores, luego como a continuación) obtengo sus números.Si bien lo anterior está bien
n=20, es esencialmente un ejemplo de cómo no hacer recursión. Aquí hay una versión más rápida (solo paran>=6) que también necesitaría memoria constante, si solo los números no siguieran aumentando ...Eso da
No hay problema para obtener también,
f 5000pero no quiero pegar el resultado ...Por cierto, es posible no usar matemática elegante y aún no usar la fuerza (ultra) bruta. Primero, en lugar de mirar todas las permutaciones, mire las permutaciones parciales y solo extiéndalas cuando aún no sean inválidas. No sirve de nada mirar todas las permutaciones que comienzan con
1 6 5. En segundo lugar, algunas permutaciones parciales les gustan1 3 5 7y1 5 3 7tienen exactamente las mismas continuaciones válidas, por lo que deben manejarse juntas. Usando estas ideas, podría calcular los valores hastan=16en 0.3s.fuente
f n=sum$zipWith((*).f)[n-5..][n-4,1,10-2*n,4,n-2].Python, 125 bytes
fuente
Mathematica, 66 bytes
Explicación
Functioncon el primer argumento#.fuente
Javascript (ES6),
100747260 bytesA continuación se muestra la versión antes del dominio del golf de @PeterTaylor
Gracias a la respuesta de @ChristianSievers que logró redactar una solución de Haskell a partir de un documento que encontré después de buscar en Google '0, 2, 10, 68, 500, 4174, 38774, 397584', aquí hay una versión de Javascript que tampoco se permuta.
Uso
fuente
f(n)cuándon>1, por lo que no importa para qué regresen=1. También creo quef(1)=1es correcto.n<6?n==1|0:para un ahorro adicional de dos caracteres.f=n=>n--<6?!n|0:f(n)*--n+4*f(n--)-2*f(n--)*--n+f(n)*++n+f(n)Brachylog , 26 bytes
Pruébalo en línea!
Explicación
fuente
Python 3 ,
109107102 bytesPruébalo en línea!
Se eliminaron cuatro bytes al no intentar una línea de la función (como lo sugiere @shooqie) y otro byte al reemplazar
abscon un cuadrado. (Requiere Python 3.5+)fuente
Python 2 , 136 bytes
-10 bytes gracias a @ovs.
Pruébalo en línea!
fuente
Mathematica, 134 bytes
casos de prueba n: 2 a 12
fuente
Python 2 , 105 bytes
Pruébalo en línea!
Esto se basa en el artículo de Philippe Flajolet descubierto por @Christiaan Westerbeek ; es mucho más rápido y dos bytes más corto que mi solución Python 3 que enumera las posibles permutaciones. (En Python 3,
reducese ha movido molestamente afunctools).Hay una versión mucho más corta que usa el producto de punto de numpy, pero se desborda rápidamente y requiere que se haya importado numpy. Pero por lo que vale:
fuente