Задний план
На момент написания этой статьи проблема P против NP все еще не решена, но вы, возможно, слышали о новой статье Норберта Блюма, в которой утверждается, что P! = NP, что уже считается ошибочным (но мы увидим).
Проблема, обсуждаемая в этой статье, является проблемой клики . По крайней мере, это то, что я прочитал в газетной статье, так что поправьте меня, если я ошибаюсь, но в любом случае я бы хотел, чтобы вы написали программу, которая решает следующий вариант:
Задание
Предположим, у нас большая школа с большим количеством учеников. У каждого из этих учеников есть друзья в этой школе. Клика студентов представляет собой группа , состоящая только из студентов , которые являются друзьями с каждым другим членом .
Ваша программа будет получать пары студентов, которые являются друзьями в качестве входных данных. Исходя из этой информации, программа должна найти размер самой большой клики . Студенты идентифицируются целочисленными идентификаторами .
Если вы предпочитаете математические термины, это означает, что вы задаете ребра неориентированного графа, каждый из которых идентифицируется двумя узлами.
вход
Ваш вход будет непустым списком положительных целых пар, например [[1,2],[2,5],[1,5]]
. Вы можете использовать этот ввод в любой разумной форме, например, как массив массивов, как строки текста, содержащие по два числа в каждой и т. Д.
Выход
Ожидаемый результат - одно число n >= 2
: размер самой большой клики. С приведенным выше примером ввода, результат будет 3
, как и все студенты ( 1
,2
и 5
) являются друзьями друг с другом.
Контрольные примеры
[[1,2]]
=> 2
[[1,2],[3,1],[3,4]]
=> 2
[[1,2],[2,5],[1,5]]
=> 3
[[2,5],[2,3],[4,17],[1,3],[7,13],[5,3],[4,3],[4,1],[1,5],[5,4]]
=> 4 (the largest clique is [1,3,4,5])
[[15,1073],[23,764],[23,1073],[12,47],[47,15],[1073,764]]
=> 3 (the largest clique is [23,764,1073])
[[1296,316],[1650,316],[1296,1650],[1296,52],[1650,711],[711,316],[1650,52],
[52,711],[1296,711],[52,316],[52,1565],[1565,1296],[1565,316],[1650,1565],
[1296,138],[1565,138],[1565,711],[138,1650],[711,138],[138,144],[144,1860],
[1296,1860],[1860,52],[711,1639]]
=> 6 (the largest clique is [52,316,711,1296,1565,1650])
Вы можете использовать эту (глупую) ссылочную реализацию (печатает дополнительный вывод с -d
флагом) для проверки результатов других тестовых случаев.
Правила
- Ваша программа не требует определенного результата при неверном вводе. Таким образом, вы можете предположить, что:
- вы всегда получите хотя бы одну пару идентификаторов
- каждая пара состоит из двух разных идентификаторов
- пара не появляется дважды (поменять местами идентификаторы все равно будет та же пара)
- Вашему алгоритму не разрешено устанавливать верхнюю границу размера ввода. Чисто технические ограничения и ограничения, установленные вашим языком / средой (например, размер стека, время вычислений и т. Д.), Конечно, неизбежны.
- Стандартные лазейки запрещены.
- Это код-гольф , поэтому выигрывает самый короткий код в байтах.
- Если ваш алгоритм имеет сложность за полиномиальное время, вы
-1
сразу получаете оценку независимо от размера вашего кода, но в этом случае вы можете отправить свое решение куда-нибудь еще. ;)
источник
-1
это вполне заслуженно ;)Ответы:
Желе ,
15 1816 байт+3 байта, чтобы исправить ошибки в моем методе.
-2 байта благодаря милям (учитывая, что n × (n-1) ÷ 2 = nC2 )
Монадическая ссылка, берущая список дружеских связей (ребер) и возвращающая целое число.
Попробуйте онлайн! формирует набор мощностей ребер в памяти, поэтому неэффективен как в пространстве, так и во времени (да, это O (2 n ) человек )!
Как?
источник
Mathematica, 34 байта
В основном FindClique выполняет свою работу и «находит самую большую клику в графе g».
Все остальное - преобразование входного списка в граф
вход
Выход
вход
Выход
спасибо @Kelly Lowder за -10 байтов
источник
Tr[1^#&@@FindClique[#<->#2&@@@#]]&
FindClique
ಠ ___ ಠЖеле , 20 байт
Попробуйте онлайн!
Конечно, это не заслуживает миллиона: p
Это бы победило Pyth, если бы не
µ(...)µ
2-байтовыйÐf
.источник
J , 36 байт
Попробуйте онлайн!
Работает за время O (2 n ), где n - количество пар.
Более быстрое решение для 65 байтов
Попробуйте онлайн!
объяснение
источник
Pyth, 19 байт
Попробуй это здесь.
источник
Python 2 , 180 байт
Попробуйте онлайн!
-2 благодаря shooqie .
-1 спасибо мистеру Xcoder .
-3 благодаря рекурсивному .
источник
len
переменную(x not in y)
значит0**(x in y)
.0**
на-~-
.Pyth, 28 байт
Попробуйте онлайн
объяснение
источник
Python 3 ,
162159 байтПопробуйте онлайн!
Функция c принимает вершины в виде набора
отсортированныхкортежей ({(x, y), ...}, где x меньше y).Функция под названием «запись» находится в заголовке TIO для проверки данных в формате списка несортированных списков. Если клик, возвращает длину. Если не клика, возвращает максимальный размер клики вершин, минус вершина для каждой вершины в вершинах. Превышает время последнего теста в TIOОбновление: добавлена часть "или (z, y) в x" для удаления зависимости от сортировки "f = lambda x: {i для s в x для i в s}" вместо itertools.chain, обернутого в набор.
минус 3 байта благодаря @ Джонатану Аллену
источник
c
, поэтому вы можете удалить егоc=
(вам нужно поместитьc=\
в конец заголовка и поместитьlambda
верхнюю часть блока кода для TIO)s
и заменитьs(...)
с{*...}
позволяя удаление некоторых пространств тоже.05AB1E , 19 байтов
Попробуйте онлайн!
источник
Желе , 28 байт
Попробуйте онлайн!
Более быстрое решение, способное решить последний контрольный пример за секунду на TIO.
источник
n
май может появиться только на базах :)Java + Гуава 23,0, 35 + 294 = 329 байт
Этот алгоритм не строит графики, а генерирует все комбинации пар определенного размера. Я передаю все парные комбинации в мультимножество и проверяю, все ли они имеют ожидаемый размер (количество уникальных записей - 1). Если они это сделают, я нашел клику и пойду искать большую.
Из библиотеки Guava я использую новый
combinations
метод и тип набора инструментовMultiset
.Ungolfed
источник
x
- это полином » <- вы уверены? Я полагаю, что этот метод используется . Возвращаемое значение -AbstractSet
с итератором, и следующийfor
цикл вызовет этот итераторx!
раз, если я не ошибаюсь ...x < n
(сn
учетом полного размера входного набора) оно всеn!/(x!(n-x)!)
еще не является полиномом :)combinations
метод, которыйX^n
(что вполне возможно), я могу получить его? Тем временем я снимаю свою претензию с «-1».Python 2 , 102 байта
Попробуйте онлайн!
источник
6502 машинный код (C64),
774703 байта(Я только что был сделать это, мой C64 может сделать все ... хе-хе)
HexDump:
Онлайн демо
Использование: Начните с
sys49152
, затем введите пары по одной в строке, например, напримерBacksapce не обрабатывается во время ввода (но если вы используете
vice
, просто скопируйте и вставьте свой ввод в эмулятор). Введите пустую строку, чтобы начать расчет.Это слишком велико, чтобы опубликовать пояснительный лист разборки здесь, но вы можете просмотреть исходный код сборки в стиле ca65 . Алгоритм очень неэффективен, он генерирует каждую возможную перестановку узлов и с каждым из них жадно строит клику, проверяя все ребра. Это позволяет пространство эффективности из O (N) (рода важно на машине с этой небольшой ОЗУ), но имеет попали эффективность выполнения (*) . Теоретические пределы - до 256 узлов и до 8192 ребер.
Там больше (
883805 байт) версия с улучшенными функциями:Онлайн демо
Просмотр источника
(*) Последний тест занимает от 12 до 20 часов (я спал, когда он наконец закончился). Другие тестовые случаи заканчиваются в худшем случае в течение нескольких минут.
источник