Objetivo
Você recebe um número inteiro n
( n > 1
). Você deve imprimir quantas permutações dos números inteiros 1
para n
há que começar no 1
, final na n
, e não têm dois inteiros consecutivos que diferem em 1.
Como alternativa, se você pegar o gráfico completo K_n
e remover as bordas do caminho, 1-2-3-...-n
deverá contar os caminhos hamiltonianos de 1
para n
no gráfico restante.
Os exemplos serão usados f(n)
para uma função que recebe n
e gera o número de permutações válidas, mas sua submissão pode ser uma função ou um programa.
Exemplos
Pois n = 6
, uma possível solução é1-3-5-2-4-6
No entanto, 1-3-5-2-6-4
não é uma solução válida, pois não termina com 6
.
De fato, pois n = 6
existem apenas 2 soluções ( 1-4-2-5-3-6
é a outra).
Por isso f(6) = 2
.
Pois n = 4
as únicas permutações que começam 1
e terminam em 4
são 1-2-3-4
e 1-3-2-4
. Em ambos, o 2
é adjacente ao 3
, fornecendo números inteiros consecutivos que diferem por 1. Portanto f(4) = 0
.
Casos de teste
f(6) = 2
f(4) = 0
f(8) = 68
f(13) = 4462848
Critério de vitória
Isso é código-golfe, a resposta mais curta vence.
fonte
[2..n-1]
não contêm deltas de1
ou-1
, você tem que verificar também que nenhum deles começar com2
ou terminar comn-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
, passo algum tempo agora tentando usar as fórmulas, mas não consigo compor uma que gere a sequência. É incrível ver que o expoente de z é a entrada da fórmula e o resultado é o fator de multiplicação. A um como se pode deduzir a partir da fórmula pode haver uma com a resposta mais curto em bytesRespostas:
MATL , 16 bytes
Experimente online!
Para entradas excedentes
12
, fica sem memória.Explicação
fonte
Mathematica, 58 bytes, tempo polinomial ( n )
Como funciona
Em vez de iterar sobre permutações com força bruta, usamos o princípio de inclusão-exclusão para contá-las combinatoriamente.
Seja S o conjunto de todas as permutações de [1,…, n] com σ 1 = 1, σ n = n , e seja S i o conjunto de permutações σ ∈ S tal que | σ i - σ i + 1 | = 1. Então a contagem que estamos procurando é
| 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 |.
Agora, | S i 2 ∩ ⋯ S i k - 1 | depende apenas de k e do número j de execuções de índices consecutivos em [ i 1 , i 2 ,…, i k - 1 , i k ] onde, por conveniência, fixamos i 1 = 0 e i k = n . Especificamente,
| 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.
O número desses conjuntos de índices [ i 1 , i 2 ,…, i k - 1 , i k ] com j execuções é
( k - 1 C j - 1 ) ( n - k C j - 2 ), para 2 ≤ j ≤ k ≤ n ,
1, para j = 1, k = n + 1.
O resultado é então
(−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 )!
A soma interior sobre j pode ser escrito usando o hipergeométrico 2 F uma função :
(−1) n - 1 + ∑ 2 ≤ k ≤ n (−1) k ( k - 1) 2 F 1 (2 - k , k - n ; 2; 2) ( n - k )!
à qual aplicamos uma transformação Pfaff que nos permite desviar os poderes de -1 usando um 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 )! |.
Demo
fonte
Geléia ,
1716 bytesUm link monádico.
Experimente online!
Quão?
fonte
IỊṀ
é válido. Especificamente, e se-2
houver um dos deltas lá, por exemplo? Você pode corrigir comIAỊṀ
+1.x <= 1
.Japonês ,
1918 bytesTeste online! Eu não recomendaria testar em algo maior que
10
.Explicação
fonte
1
.n > 1
.05AB1E , 17 bytes
Experimente online!
fonte
¹1Š)˜
salva um byte.Haskell,
7665 bytesEconomizou 11 bytes graças a @xnor.
Usando o resultado da
Q_rec
página 7 da descoberta de @ ChristiaanWesterbeek, obtemosNão entendo como o próximo resultado
ha
se relaciona a isso, mas depois de acelerar (primeiro por memorização, veja versões anteriores e depois abaixo), recebo seus números.Embora o acima seja bom
n=20
, é essencialmente um exemplo de como não fazer recursão. Aqui está uma versão mais rápida (apenas paran>=6
) que também precisaria apenas de memória constante - se apenas os números não continuassem aumentando ...Isso dá
Também não há problema em obter,
f 5000
mas não quero colar o resultado ...BTW, é possível não usar matemática sofisticada e ainda não usar força (ultra) bruta. Primeiro, em vez de examinar todas as permutações, observe as permutações parciais e apenas as estenda quando elas ainda não são inválidas. Não adianta olhar para todas as permutações que começam com
1 6 5
. Segundo, algumas permutações parciais gostam1 3 5 7
e1 5 3 7
têm exatamente as mesmas continuações válidas; portanto, manuseie-as juntas. Usando essas idéias, eu poderia calcular os valoresn=16
em 0,3s.fonte
f n=sum$zipWith((*).f)[n-5..][n-4,1,10-2*n,4,n-2]
.Python, 125 bytes
fonte
Mathematica, 66 bytes
Explicação
Function
com o primeiro argumento#
.fonte
Javascript (ES6),
100747260 bytesAbaixo está a versão anterior ao domínio do golfe de @ PeterTaylor
Graças à resposta de @ChristianSievers que conseguiu redigir uma solução Haskell a partir de um artigo que eu encontrei após pesquisar '0, 2, 10, 68, 500, 4174, 38774, 397584', aqui está uma versão Javascript que também não permuta.
Uso
fonte
f(n)
quandon>1
, portanto, não importa para o que você retornan=1
. Também acho quef(1)=1
está correto.n<6?n==1|0:
para uma economia adicional de dois caracteres.f=n=>n--<6?!n|0:f(n)*--n+4*f(n--)-2*f(n--)*--n+f(n)*++n+f(n)
Braquilog , 26 bytes
Experimente online!
Explicação
fonte
Python 3 ,
109107102 bytesExperimente online!
Removido quatro bytes por não tentar alinhar a função (como sugerido por @shooqie) e outro byte, substituindo-o
abs
por um quadrado. (Requer Python 3.5 ou superior)fonte
Python 2 , 136 bytes
-10 bytes graças a @ovs.
Experimente online!
fonte
Mathematica, 134 bytes
casos de teste n: 2 a 12
fonte
Python 2 , 105 bytes
Experimente online!
Isso é baseado no artigo de Philippe Flajolet descoberto por @Christiaan Westerbeek ; é muito mais rápido e dois bytes mais curto que minha solução Python 3, que enumera as possíveis permutações. (No Python 3,
reduce
foi movido irritantemente parafunctools
.)Existe uma versão muito mais curta usando o produto de pontos da numpy, mas ela transborda rapidamente e requer que a numpy tenha sido importada. Mas pelo que vale a pena:
fonte