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!
a[m]
estava no hipercubo, a[m+1]
também estará. E como você pode assumir a[0]
um vértice válido, praticamente não precisa se preocupar com nada de hipercubo e apenas siga a regra.
a[m+1] = xor(a[m], 2^mod(a[m],n))
, é irrelevante se os vértices pertencerem a um hipercubo, certo?