Ваша задача будет написать функцию или программу, которая будет принимать целое число в n>0
качестве входных данных и выводить список ребер n
-мерного гиперкуба . В теории графов ребро определяется как два набора вершин (или углов, если вы предпочитаете), которые связаны между собой.
Пример 1
1-мерный гиперкуб представляет собой прямую и содержит две вершины, которые мы будем называть a
и b
.
Поэтому на выходе будет:
[[a, b]]
Пример 2
4-мерный гиперкуб (или тессеракт) состоит из 32 ребер, и его график выглядит следующим образом
и результат может выглядеть следующим образом
[[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]]
правила
- Вы можете называть вершины любым удобным вам способом, если имя уникально.
- Ребра являются ненаправленными, то есть
[a, b]
и[b, a]
считаются одним ребром. - Ваш вывод не должен содержать дубликаты ребер.
- Вывод может быть в любом разумном формате.
- Стандартные лазейки запрещены.
счет
Самый короткий код выигрывает.
code-golf
math
graph-theory
Murphy
источник
источник
Ответы:
Желе, 13 байт
Попробуй это здесь. Для ввода
3
вывод:Я надеюсь, что
[1, 1, 1]
и т. Д. Это хорошее имя.объяснение
Первая строка представляет собой «предикат» на паре ребер:
[A, B] ạ/S’
она равнаsum(abs(A - B)) - 1
нулю (false-y) тогдаA
и только тогда, когдаB
отличается только одной координатой.Вторая строка - основная программа:
2ṗ
(декартовой степени[1, 2]
).œc2
(комбинации размера два без замены).ÐḟÇ
).источник
ạ/S’
и2ṗœc2ÇÐḟ
сохранить пару байтов.c/P=2
,2ṗṗ2ÇÐf
Тоже работает.Python 2, 54
5662байтаДублирующие ребра удаляются путем создания набора наборов, за исключением того, что Python требует, чтобы элементы набора были хэшируемыми, поэтому они преобразуются в кортежи. Обратите внимание, что множества
{a,b}
и{b,a}
равны и конвертируются в один и тот же кортеж. xsot сохранил 2 байта сn<<n
.Это может быть сокращено до 49 байт, если строки наборов имеют формат вывода OK
который дает вывод как
Сначала давайте посмотрим на старую версию решения.
Каждое число в интервале
[0,2^n)
соответствует вершине с координатами, заданными ееn
-битными двоичными строками. К вершинам примыкают, если они отличаются одним битом, т. Е. Если один получен из другого путем xor степени 2.Эта анонимная функция генерирует все возможные ребра, переворачивая каждую вершину и каждую битовую позицию. Чтобы избежать дублирования ребра в обоих направлениях, только 1 переворачиваются на 0.
В более удобном решении
k
используется для кодирования какi
иj
черезk=n*i+j
, из которого(i,j)
можно извлечь как(k/n,k%n)
. Это сохраняет цикл в понимании. Полномочия2
сделаны так,1<<
чтобы иметь правильный приоритет оператора.Альтернативный подход к генерации каждой пары вершин и проверке, немного ли они разошлись, кажется длиннее (70 байт):
источник
n*2**n
простоn<<n
lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}
сохраняет байт. (Звездное выражение сохраняет три, но синтаксис деления теряет два.) Однако я вполне уверен, что 49-байтовое решение, которое у вас есть, подходит.Mathematica,
4824 байтаПросто анонимная функция, которая использует встроенные модули.
источник
FromLetterNumber
. Я даже думаю, чтоEdgeList@*HypercubeGraph
это правильный ответ.JavaScript (SpiderMonkey 30+),
6964 байтаЭто началось как порт решения @ xnor Python 2, но я смог сэкономить 9 байт, переписав код для использования одного цикла. Изменить: Сохранение еще 5 байтов путем разделения
i
на части в соответствии с обновленным решением @ xnor, которое теперь также использует один цикл.источник
MATL , 20 байтов
Это работает с текущей версией (14.0.0) языка / компилятора.
Попробуйте онлайн!
объяснение
Это использует более или менее ту же идею, что и ответ @ xnor .
источник
Pyth, 13 байт
Выход на вход 3 :
Объяснение:
источник
Python 2: 59 байт
источник