Su trabajo será escribir una función o un programa, que tomará un número entero n>0
como entrada y salida de una lista de los bordes del hipercubon
tridimensional . En la teoría de grafos, un borde se define como una tupla de 2 vértices (o esquinas, si lo prefiere), que están conectadas.
Ejemplo 1
Un hipercubo unidimensional es una línea y presenta dos vértices, que llamaremos a
y b
.
Por lo tanto, la salida será:
[[a, b]]
Ejemplo 2
El hipercubo de 4 dimensiones (o tesseract) consta de 32 bordes y su gráfico se ve así
y la salida podría verse así
[[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]]
Reglas
- Puede nombrar los vértices de la forma que desee, siempre que el nombre sea único.
- Los bordes no están dirigidos, es decir,
[a, b]
y[b, a]
se consideran el mismo borde. - Su salida no debe contener bordes duplicados.
- La salida puede estar en cualquier formato sensible.
- Las lagunas estándar están prohibidas.
Puntuación
El código más corto gana.
code-golf
math
graph-theory
murphy
fuente
fuente
Respuestas:
Jalea, 13 bytes
Pruébalo aquí. Para la entrada
3
, la salida es:Espero que
[1, 1, 1]
etc. sea un "nombre" correcto.Explicación
La primera línea es un "predicado" en un par de aristas:
[A, B] ạ/S’
es igual asum(abs(A - B)) - 1
, que es cero (falso-y) iffA
yB
difiere exactamente en una coordenada.La segunda línea es el programa principal:
2ṗ
(poder cartesiano de[1, 2]
).œc2
(combinaciones de tamaño dos sin reemplazo).ÐḟÇ
).fuente
ạ/S’
y2ṗœc2ÇÐḟ
guardar un par de bytes.c/P=2
,2ṗṗ2ÇÐf
funciona también.Python 2, 54
5662bytesLos bordes duplicados se eliminan haciendo un conjunto de conjuntos, excepto que Python requiere que los elementos del conjunto sean hashables, por lo que se convierten en tuplas. Tenga en cuenta que los conjuntos
{a,b}
y{b,a}
son iguales y convertir a la misma tupla. xsot guardó 2 bytes conn<<n
.Esto se puede reducir a 49 bytes si las cadenas de conjuntos son un formato de salida correcto
que da salida como
Primero, veamos una versión anterior de la solución.
Cada número en el intervalo
[0,2^n)
corresponde a un vértice con coordenadas dadas por susn
cadenas binarias de bits. Los vértices son adyacentes si difieren en un solo bit, es decir, si uno se obtiene del otro al multiplicar una potencia de 2.Esta función anónima genera todos los bordes posibles al voltear cada vértice y cada posición de bit. Para evitar duplicar un borde en ambas direcciones, solo los 1 se cambian a 0.
En la solución más golfizada,
k
se usa para codificar ambosi
yj
víak=n*i+j
, de los cuales(i,j)
se puede extraer como(k/n,k%n)
. Esto ahorra un bucle en la comprensión. Los poderes de2
se realizan1<<
para tener la prioridad de operador correcta.Un enfoque alternativo para generar cada par de vértices y verificar si están un poco volteados parece más largo (70 bytes):
fuente
n*2**n
es solon<<n
lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}
guarda un byte. (La expresión destacada ahorra tres, pero la sintaxis de división pierde dos). Sin embargo, estoy bastante seguro de que la solución de 49 bytes que tiene está bien.Mathematica,
4824 bytesSolo una función anónima que utiliza elementos integrados.
fuente
FromLetterNumber
. Incluso creo queEdgeList@*HypercubeGraph
es una respuesta válida.JavaScript (SpiderMonkey 30+),
6964 bytesEsto comenzó como un puerto de la solución Python 2 de @ xnor, pero pude guardar 9 bytes reescribiendo el código para usar un solo bucle. Editar: ahorró otros 5 bytes al dividirse
i
al revés, según la solución actualizada de @ xnor, que ahora también usa un solo bucle.fuente
MATL , 20 bytes
Esto funciona con la versión actual (14.0.0) del lenguaje / compilador.
Pruébalo en línea!
Explicación
Esto usa más o menos la misma idea que la respuesta de @ xnor .
fuente
Pyth, 13 bytes
Salida en la entrada 3 :
Explicación:
fuente
Python 2: 59 bytes
fuente