Objetivo
Te dan un entero n
( n > 1
). Debe salida cuántas permutaciones de los enteros 1
a n
hay 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_n
y elimina los bordes del camino 1-2-3-...-n
, debe contar los caminos hamiltonianos desde 1
hasta n
en el gráfico restante.
Los ejemplos se usarán f(n)
para una función que incorpore n
y 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-4
no 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-6
es la otra).
Por lo tanto f(6) = 2
.
Porque n = 4
las únicas permutaciones que comienzan 1
y terminan en 4
son 1-2-3-4
y 1-3-2-4
. En ambos, el 2
es 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 ,1
o-1
también deben verificar que ninguno de ellos comience2
o 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^14
Ahora 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
12
se 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é-2
pasa 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_rec
página 7 del hallazgo de @ ChristiaanWesterbeek, obtenemosNo entiendo cómo se relaciona su próximo resultado
ha
con 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 5000
pero 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 7
y1 5 3 7
tienen exactamente las mismas continuaciones válidas, por lo que deben manejarse juntas. Usando estas ideas, podría calcular los valores hastan=16
en 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
Function
con 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)=1
es 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
abs
con 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,
reduce
se 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