Seu trabalho será escrever uma função ou um programa que aceitará um número inteiro n>0
como entrada e produzirá uma lista das bordas do hipercubon
dimensional . Na teoria dos grafos, uma aresta é definida como duas tuplas de vértices (ou cantos, se você preferir), que estão conectados.
Exemplo 1
Um hipercubo unidimensional é uma linha e apresenta dois vértices, que chamaremos de a
e b
.
Portanto, a saída será:
[[a, b]]
Exemplo 2
O hipercubo 4-dimensional (ou tesseract) consiste em 32 arestas e seu gráfico se parece com este
e a saída pode ficar assim
[[a, b], [a, c], [a, e], [a, i], [b, d], [b, f], [b, j], [c, d], [c, g], [c, k], [d, h], [d, l], [e, f], [e, g], [e, m], [f, h], [f, n], [g, h], [g, o], [h, p], [i, j], [i, k], [i, m], [j, l], [j, n], [k, l], [k, o], [l, p], [m, n], [m, o], [n, p], [o, p]]
Regras
- Você pode nomear os vértices da maneira que quiser, desde que o nome seja exclusivo.
- As arestas são não dirigida, ou seja,
[a, b]
e[b, a]
são consideradas a mesma vantagem. - Sua saída não deve conter arestas duplicadas.
- A saída pode estar em qualquer formato sensível.
- As brechas padrão são proibidas.
Pontuação
O menor código vence.
code-golf
math
graph-theory
Murphy
fonte
fonte
Respostas:
Gelatina, 13 bytes
Experimente aqui. Para entrada
3
, a saída é:Espero que
[1, 1, 1]
etc. seja um bom "nome".Explicação
A primeira linha é um "predicado" em um par de arestas:
[A, B] ạ/S’
é igual asum(abs(A - B)) - 1
, que é zero (falso-y) seA
eB
difere exatamente em uma coordenada.A segunda linha é o programa principal:
2ṗ
(potência cartesiana de[1, 2]
).œc2
(combinações de tamanho dois sem substituição).ÐḟÇ
).fonte
ạ/S’
e2ṗœc2ÇÐḟ
salve alguns bytes.c/P=2
,2ṗṗ2ÇÐf
Funciona também.Python 2, 54
5662bytesAs arestas duplicadas são removidas através da criação de um conjunto de conjuntos, exceto que o Python exige que os elementos do conjunto sejam laváveis, para que sejam convertidos em tuplas. Observe que os conjuntos
{a,b}
e{b,a}
são iguais e convertem na mesma tupla. O xsot salvou 2 bytes comn<<n
.Isso pode ser reduzido para 49 bytes se as sequências de conjuntos forem um formato de saída OK
o que dá saída como
Primeiro, vejamos uma versão mais antiga da solução.
Cada número no intervalo
[0,2^n)
corresponde a um vértice com coordenadas dadas por suasn
cadeias binárias de bits. Os vértices são adjacentes se diferirem em um único bit, ou seja, se um é obtido do outro xorando uma potência de 2.Essa função anônima gera todas as arestas possíveis, usando todos os vértices e todas as posições de bits para inverter. Para evitar duplicar uma aresta nas duas direções, apenas 1 é invertido para 0.
Na solução mais golfe,
k
é usado para codificar tantoi
ej
viak=n*i+j
, a partir do qual(i,j)
pode ser extraído como(k/n,k%n)
. Isso economiza um loop na compreensão. Os poderes de2
são feitos1<<
para ter a precedência correta do operador.Uma abordagem alternativa de gerar cada par de vértices e verificar se estão um pouco afastados parece mais longa (70 bytes):
fonte
n*2**n
é apenasn<<n
lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}
salva um byte. (A expressão estrelada salva três, mas a sintaxe da divisão perde dois.) No entanto, tenho certeza de que a solução de 49 bytes que você possui está correta.Mathematica,
4824 bytesApenas uma função anônima que usa built-ins.
fonte
FromLetterNumber
. Eu até acho queEdgeList@*HypercubeGraph
é uma resposta válida.JavaScript (SpiderMonkey 30+),
6964 bytesIsso começou como uma porta da solução Python 2 do @ xnor, mas consegui salvar 9 bytes reescrevendo o código para usar um único loop. Editar: salvou mais 5 bytes dividindo
i
o contrário, conforme a solução atualizada do @ xnor, que agora também usa um único loop.fonte
MATL , 20 bytes
Isso funciona com a versão atual (14.0.0) do idioma / compilador.
Experimente online!
Explicação
Isso usa mais ou menos a mesma idéia que a resposta do @ xnor .
fonte
Pitão, 13 bytes
Saída na entrada 3 :
Explicação:
fonte
Python 2: 59 bytes
fonte