Votre travail consistera à écrire une fonction ou un programme, qui prendra un entier n>0
en entrée et produira une liste des bords de l' hypercuben
dimensionnel . Dans la théorie des graphes, une arête est définie comme un 2-tuple de sommets (ou coins, si vous préférez), qui sont connectés.
Exemple 1
Un hypercube à 1 dimension est une ligne et comporte deux sommets, que nous appellerons a
et b
.
Par conséquent, la sortie sera:
[[a, b]]
Exemple 2
L'hypercube (ou tesseract) à 4 dimensions se compose de 32 arêtes et son graphique ressemble à ceci
et la sortie pourrait ressembler à ceci
[[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]]
Règles
- Vous pouvez nommer les sommets comme vous le souhaitez, tant que le nom est unique.
- Les bords ne sont pas orientés, c'est
[a, b]
-à- dire et[b, a]
sont considérés comme le même bord. - Votre sortie ne doit pas contenir de bords en double.
- La sortie peut être dans n'importe quel format sensible.
- Les failles standard sont interdites.
Notation
Le code le plus court gagne.
code-golf
math
graph-theory
murphy
la source
la source
Réponses:
Gelée, 13 octets
Essayez-le ici. Pour l'entrée
3
, la sortie est:J'espère que
[1, 1, 1]
etc. est un «nom» correct.Explication
La première ligne est un «prédicat» sur une paire d'arêtes:
[A, B] ạ/S’
est égal àsum(abs(A - B)) - 1
, ce qui est zéro (faux-y) ssiA
etB
diffèrent dans exactement une coordonnée.La deuxième ligne est le programme principal:
2ṗ
(puissance cartésienne de[1, 2]
).œc2
(combinaisons de taille deux sans remplacement).ÐḟÇ
).la source
ạ/S’
et2ṗœc2ÇÐḟ
économisez quelques octets.c/P=2
,2ṗṗ2ÇÐf
fonctionne aussi.Python 2, 54
5662octetsLes bords en double sont supprimés en créant un ensemble d'ensembles, sauf que Python exige que les éléments de l'ensemble soient hachables, de sorte qu'ils sont convertis en tuples. Notez que les ensembles
{a,b}
et{b,a}
sont égaux et convertis en le même tuple. xsot a enregistré 2 octets avecn<<n
.Cela peut être réduit à 49 octets si les chaînes d'ensembles sont un format de sortie OK
ce qui donne une sortie comme
Tout d'abord, regardons une ancienne version de la solution.
Chacun un nombre dans l'intervalle
[0,2^n)
correspond à un sommet dont les coordonnées sont données par sesn
chaînes binaires de bits. Les sommets sont adjacents s'ils diffèrent en un seul bit, c'est-à-dire si l'un est obtenu de l'autre en xorant une puissance de 2.Cette fonction anonyme génère tous les bords possibles en prenant chaque sommet et chaque position de bit à inverser. Pour éviter de dupliquer une arête dans les deux sens, seuls les 1 sont inversés en 0.
Dans la solution plus golfée,
k
est utilisé pour coder à la foisi
etj
viak=n*i+j
, à partir desquels(i,j)
peuvent être extraits(k/n,k%n)
. Cela sauve une boucle dans la compréhension. Les pouvoirs de2
sont faits de manière1<<
à avoir la bonne priorité d'opérateur.Une approche alternative de générer chaque paire de sommets et de vérifier s'ils sont un peu inversés semble plus longue (70 octets):
la source
n*2**n
est justen<<n
lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}
enregistre un octet. (L'expression suivie en enregistre trois, mais la syntaxe de division en perd deux.) Cependant, je suis sûr que la solution de 49 octets que vous avez est correcte.Mathematica,
4824 octetsJuste une fonction anonyme qui utilise des fonctions intégrées.
la source
FromLetterNumber
. Je pense même queEdgeList@*HypercubeGraph
c'est une réponse valable.JavaScript (SpiderMonkey 30+),
6964 octetsCela a commencé comme un port de la solution Python 2 de @ xnor mais j'ai pu économiser 9 octets en réécrivant le code pour utiliser une seule boucle. Edit: enregistré 5 octets supplémentaires en se divisant
i
dans l'autre sens, conformément à la solution mise à jour de @ xnor, qui utilise désormais également une seule boucle.la source
MATL , 20 octets
Cela fonctionne avec la version actuelle (14.0.0) du langage / compilateur.
Essayez-le en ligne!
Explication
Cela utilise plus ou moins la même idée que la réponse de @ xnor .
la source
Pyth, 13 octets
Sortie sur entrée 3 :
Explication:
la source
Python 2: 59 octets
la source