Recentemente, li a teoria dos grafos, especialmente os hipercubos, e pensei em maneiras interessantes de construir caminhos neles. Aqui está o que eu criei.
Como você deve saber, é possível construir um hipercubo n-dimensional pegando todas as n-tuplas que consistem em 1
e 0
como vértices e conectá-las, se elas diferirem em um dígito. Se você interpreta esses dígitos binários como um número inteiro, acaba com um gráfico com vértices bem numerados. Por exemplo para n=3
:
Digamos que você queira dar uma volta neste hipercubo e começar no vértice 0
. Agora, como você determina qual vértice deseja visitar a seguir? A regra que inventei é pegar o número a
do vértice em que você está, virar o mod(a,n)
bit s (indexação baseada em zero) e ir para o vértice resultante. Formalmente, esta regra pode ser definida recursivamente como
a[m+1] = xor(a[m], 2^mod(a[m],n)).
Seguindo essa regra, você sempre permanecerá no cubo e viajará pelas bordas. O caminho resultante se parece com isso
Como você pode ver, você andará em círculo! De fato, em todas as dimensões e em todos os pontos de partida, seu caminho terminará em um loop. Por exemplo, n=14
e a[0]=0
parece com isso
Para o ávido ambler, o comprimento de sua rota planejada é uma informação crucial. Portanto, seu trabalho é escrever uma função ou um programa que leve a dimensão do hipercubo n
e o vértice inicial a[0]
como entradas e produza o número de vértices no loop resultante.
Casos de teste
n a[0] Output
-----------------
3 0 6
14 0 50
5 6 8
17 3 346
Regras
- As brechas padrão são proibidas
- Saída / Entrada pode estar em qualquer formato adequado
- Você pode assumir
a[0]
um vértice válido
Pontuação
O menor código em bytes vence.
Se você tiver mais informações sobre esse tópico, ficarei feliz em ouvir!
fonte
a[m+1] = xor(a[m], 2^mod(a[m],n))
, é irrelevante se os vértices pertencerem a um hipercubo, certo?a[m]
estava no hipercubo,a[m+1]
também estará. E como você pode assumira[0]
um vértice válido, praticamente não precisa se preocupar com nada de hipercubo e apenas siga a regra.Respostas:
Geléia, 9 bytes
Leva dois argumentos de linha de comando.
Experimente aqui .
fonte
Haskell, 124
Ele encontra o círculo pelo algoritmo de dois ponteiros que circula em velocidades diferentes e usa / abusa fortemente da abordagem de Haskell às listas (por exemplo, os dois ponteiros são realmente listas).
g
é a função que calcula a resposta. forneça-on
e, em seguida,a[0]
ele retornará o número para você (observe quen
deve ser definido como do tipoInt
para evitar ambigüidade)fonte
JavaScript (ES6), 69 bytes
Retorna 18812 para (23, 10).
fonte
MATL ,
383728 bytesIsso funciona na versão atual (15.0.0) do idioma.
Experimente online !
Explicação
fonte
Pyth,
2217 bytesExplicação:
Experimente aqui .
fonte