задача
Вам будет дано положительное целое число, и вы должны вывести « самодополняющий граф » с таким количеством узлов. Если вы не знаете, что такое самодополняющий граф, статья Википедии не сильно вам поможет, поэтому ниже приведены два объяснения: техническое и нетехническое.
Нетехническое
График - это набор узлов, соединенных линиями. Каждая пара точек может быть соединена одной линией или ни одной. «Дополнение» графа является результатом взятия графа и соединения всех узлов, которые не связаны, и отсоединения всех узлов, которые есть.
Самодополняющий граф - это граф, дополнение которого может быть преобразовано в форму оригинала. Ниже приведен пример самодополняющего графа и демонстрация того, как.
Вот график с 5 узлами:
Мы выделим все места, где соединения могут идти с красными пунктирными линиями:
Теперь мы найдем дополнение графа, поменяв местами красный и черный края:
Это не похоже на исходный график, но если мы переместим узлы вокруг так (каждый шаг заменяет два узла):
Мы получаем оригинальный график! График и его дополнение - это тот же граф
технический
Самодополняющий граф - это граф, изоморфный своему дополнению.
Характеристики
Вы получите положительное целое число любым удобным для вас способом. И вы будете выходные график в какой бы метод вы считаете целесообразным, это включает в себя , но не ограничивается матрицей смежности формы , смежности списка Форма , и, конечно , фотографии! Выводимый граф должен быть его собственным дополнением и иметь столько же узлов, сколько и целочисленный ввод. Если такого графа не существует, вы должны вывести ложное значение.
Это код-гольф, и вы должны стремиться минимизировать количество байт.
Тестовые случаи
Ниже приведены изображения возможных выходов для нескольких н
4
5
9
источник
GraphData@{"SelfComplementary",{#,1}}&
, я полагаю, что он просто загружает некоторые примеры для низкого уровняn
из базы данных Wolfram, поэтому это не сработает для произвольно больших входных данных.Ответы:
Haskell , 77 байт
Попробуйте онлайн!
При этом используется простой для вычисления явный критерий, чтобы решить,
(a,b)
принадлежит ли ребро графу. Реализует этот алгоритм с циклической перестановкой значений по модулю 4Мы включаем ребра, две вершины конечных точек которых добавляются к 0 или 1 по модулю 4. Обратите внимание, что циклические вершины согласно этой перестановке добавляют 2 по модулю 4 к сумме вершин каждого из них, и, таким образом, меняются ребра и не ребра. Это дает перестановку вершин, которая дополняет ребра.
Если у графа есть дополнительный узел, кратный 4, он помещается в один цикл. К ним добавляются ребра, когда другая вершина четна. Перестановка вершин переворачивает четность, и поэтому граф остается самодополняющим.
Если число вершин не равно 0 или 1 по модулю 4, самодополняющий граф невозможен, поскольку в полном графе имеется нечетное число ребер
В целом, вот условия:
(a,b)
с помощьюa<b
иa+b
равным 0 или 1 по модулю 4.(a,n)
когда a чётно.Код объединяет второй и третий случаи, заменяя условие
mod(a+b)4<2
наmod(a+a)4<2
когдаodd n
иb==n
.источник
Brachylog 2 , 24 байта
Попробуйте онлайн!
Эта функция возвращает пару, состоящую из двух списков смежности: один для графа, другой для графа дополнения. (В интерпретаторе Brachylog на TIO вы можете попросить его оценить функцию, а не полную программу, передавая
Z
в качестве аргумента командной строки.) Например, выходные данные для ввода5
:Вот как это выглядит как изображение (показывает два графика):
Как обычно в языках на основе Пролога, функция поддерживает более одного шаблона вызова. В частности, если вы попытаетесь использовать его как генератор, он выведет все возможные самодополняющие графы с заданным количеством вершин (хотя я не приложил никаких усилий, чтобы сделать этот случай пригодным для использования, и, в частности, он выведет каждый из графики много раз каждый).
объяснение
По сути, это всего лишь описание проблемы, в результате чего реализация Пролога найдет лучший способ ее решения. (Тем не менее, я сомневаюсь, что в этом конкретном случае он будет использовать алгоритм лучше, чем грубая сила, поэтому он, вероятно, довольно неэффективен, и тестирование, похоже, подтверждает это, показывая, что производительность становится все хуже, чем больше график.)
Между прочим, мне пришлось потратить целых 6 байт (¼ программы, символы
(∨?<2)
) на особые случаи 0 и 1. Разочарование, но это характер особых случаев.Этот
\\ᵐcdl?
раздел немного сложен для понимания, так что вот рабочий пример. Его цель - проверить, является ли что-то графом и его дополнением, причем соответствующие ребра в графе и дополнении находятся в одном и том же порядке в списках. Пара граф / дополнение становится возможным выходом программы. Вот пример случая:Транспонирование этого дает нам список пар соответствующих ребер между графом и дополнением:
Далее мы транспонируем элементы списка и выравниваем один уровень; это дает нам список пар соответствующих элементов между графом и дополнением:
Ясно, что мы хотим, чтобы здесь было не более 1 пары, начиная с каждого элемента (таким образом, доказывая, что элементы графа и дополнения находятся в соответствии 1-к-1). Мы можем почти убедиться в этом, просто указав, что список содержит ровно
?
разные элементы (т. Е. Количество разных элементов равно числу вершин). В этом случае тест проходит успешно; Отличительными элементами являются:Однако это оставляет место для потенциальной проблемы; если вершина полностью отключена в исходном графе, ее соответствие не будет упомянуто, оставляя место для дубликата соответствия от какой-либо другой вершины. Если это так, дополнение график должен иметь границу между этой вершиной (без ограничения общности, допустим , что это
1
), и каждая другая вершина, и поэтому список соответствий будет содержать[1,2]
,[1,3]
, ...,[1, ?]
. Когда?
он большой, это приведет к большему количеству соответствий, чем было бы в противном случае, так что проблем нет. Единственная проблема возникает, когда значение?
равно 3 или ниже, и в этом случае мы добавляем только одну дополнительную корреспонденцию (удаляя ее из1
не появляется на входе); однако на практике это не является проблемой, поскольку на 3-элементном графе имеется 3 возможных ребра, что является нечетным числом (аналогично, 1 возможное ребро на 2-элементном графе также является нечетным числом), и, таким образом, на\
шаге тест завершится неудачей (вы не можете транспонировать рваный список, то есть те, чьи элементы имеют разную длину).источник
z
и\
заключается в том, чтоz
это циклический почтовый индекс, что означает, что в[[1,2,3],["a"]]
конечном итоге будет[[1,"a"],[2,"a"],[3,"a"]]
сz
, в то время как он потерпит неудачу\
.\
сейчас работает только на квадратных матрицах; будущая реализация заставит это работать какz
, кроме не циклически.BBC BASIC, 161 байт
Токенизированный размер файла 140 байт
Скачать переводчик можно по адресу http://www.bbcbasic.co.uk/bbcwin/bbcwin.html.
Код без правил
объяснение
Он использует тот же алгоритм, что и Xnor, но выдает схематический вывод.
Где
n
форма4x+2
или4x+3
нет решения, так как число ребер нечетное.Где
n
это имеет форму 4x, мы размещаем все вершины в окружности и рисуем те ребра, где(a+b) mod 4
2 или 3 (не 0 или 1, как в случае с Xnor, по соображениям игры в гольф. Поэтому это дополнение к решению, данному Xnor.)Чтобы увидеть это в более наглядном смысле, мы берем каждую вторую вершину и отводим ребра к вершинам 1 и 2 мест в направлении против часовой стрелки. Это определяет
n
параллельные направления, половину от общего. Затем мы добавляем все остальные ребра, параллельные этим.Дополнение можно найти, добавив 1 к a и b в каждой спецификации ребра, или пиктограмму, повернув диаграмму на один
1/n
оборот.Где
n
это имеет форму 4x + 1, мы добавляем еще одну вершину, которая связана с каждой второй вершиной графа 4x. Если бы это было помещено в центр, симметрия диаграммы была бы сохранена, но я решил поместить это вне основного круга точек для ясности.Выход
Ниже приведены первые несколько случаев для 4x + 1. случаи 4x можно увидеть, удалив вершину внизу справа и связанные с ней ребра.
источник
JavaScript (ES6), 191 байт
Эта функция возвращает список смежности. Он использует два алгоритма и различает пустые дополнительные графы и не выходные данные, возвращая
0
вместо того,[]
когда ни один не существует. Первый алгоритм основан на графах Rado, построенных с использованием предиката BIT , и создает действительные дополнительные графы 0-, 1-, 4- и 5-го порядка. Другой алгоритм, найденный нашими друзьями по математике , создает действительный V + 4 вершинный дополнительный граф, применяя 4-путевое сложение к действительному V вершинному дополнительному графу.Он начинается с проверки входных данных, чтобы подтвердить существование допустимого дополнительного графа (используя
n*~-n/4%1
), и, если это не удается, возвращает0
. Затем он проверяет, еслиn>5
и возвращается кn-4
случаю, чтобы построить правильное решение более низкого порядка, затем применяет 4-дополнение к возвращенному списку смежности на пути обратно вверх по цепочке рекурсии. Наконец, еслиn>5
это не так, он выполняет итерацию от0
кn-1
дляx
иy
и проверяет,(y>>x)&1
это правдой. Если это так, то эти узлы являются парными.Вот более читаемый формат функции, в котором троичные операторы расширены до операторов if-else и
eval()
встроены:демонстрация
источник