Вступление
В этом задании вам дается ориентированный граф с самоконтролями, и ваша задача - преобразовать его в неориентированный граф без самопетлей.
вход
Вы вводите ориентированный граф с установленной вершиной {0, 1, ..., n-1}
для некоторого натурального числа n ≥ 0
(или {1, 2, ..., n}
если вы используете индексирование на основе 1). Граф задается в виде n
списка длин, L
где L[i]
находится список соседей вершины i
. Например, список [[0,1],[0],[1,0,3],[]]
представляет график
.-.
| v
'-0<--2-->3
^ |
| |
v |
1<--'
Обратите внимание, что списки соседей не обязательно упорядочены, но они гарантированно не содержат дубликатов.
Выход
Ваш вывод - это другой график в том же формате, что и вход, полученный из него следующим образом.
- Удалить все петли.
- Для каждого оставшегося ребра
u -> v
добавьте перевернутое ребро,v -> u
если его еще нет.
Как и при вводе, списки соседей выходного графа могут быть неупорядоченными, но они не могут содержать дубликаты. Для приведенного выше графика будет правильным вывод [[1,2],[0,2],[0,1,3],[2]]
, который представляет график
0<->2<->3
^ ^
| |
v |
1<--'
правила
Вы можете использовать индексирование на основе 0 или 1 на графиках. Обе функции и полные программы являются приемлемыми. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Тестовые случаи
В этих тестах используется индексирование на основе 0; увеличивайте каждое число в случае с 1. Эти списки соседей отсортированы в порядке возрастания, но это не обязательно.
[] -> []
[[0]] -> [[]]
[[],[0,1]] -> [[1],[0]]
[[0,1],[]] -> [[1],[0]]
[[0,1],[0],[1,0,3],[]] -> [[1,2],[0,2],[0,1,3],[2]]
[[3],[],[5],[3],[1,3],[4]] -> [[3],[4],[5],[0,4],[1,3,5],[2,4]]
[[0,1],[6],[],[3],[3],[1],[4,2]] -> [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]]
[[6],[0,5,1],[5,4],[3,5],[4],[5,6],[0,3]] -> [[1,6],[0,5],[4,5],[5,6],[2],[1,2,3,6],[0,3,5]]
[[1,0],[5,1],[5],[1],[5,7],[7,1],[],[1]] -> [[1],[0,3,5,7],[5],[1],[5,7],[1,2,4,7],[],[1,4,5]]
[[2,8,0,9],[5,2,3,4],[0,2],[3,7,4],[8,1,2],[5,1,9,2],[6,9],[6,5,2,9,0],[9,1,2,0],[3,9]] -> [[2,7,8,9],[2,3,4,5,8],[0,1,4,5,7,8],[1,4,7,9],[1,2,3,8],[1,2,7,9],[7,9],[0,2,3,5,6,9],[0,1,2,4,9],[0,3,5,6,7,8]]
.e
просто был переключен сk,Y
наk,b
, так что для запуска, используйте.e-.|f}k@QTUQbkQ
CJam,
4340353433 байта2 байта сохранены Sp3000.
Это началось как действительно элегантное решение, а затем становилось все более отвратительным, когда я пытался исправить некоторые дыры, которые я пропустил. Я еще не уверен, что оригинальная идея все еще может быть спасена, но я буду стараться изо всех сил ...
Проверьте это здесь.Или же запустите весь тестовый жгут .
Я добавлю объяснение, как только я уверен, что пациент мертв.
источник
Python 2, 107 байт
Все еще пытаюсь понять, смогу ли я играть в гольф больше, но сейчас это лучшее, что я могу сделать.
Я использую наборы для предотвращения дублирования; Кроме того, в отличие от
list.remove(i)
,{S}-{i}
не выдает ошибку, еслиi
не вS
.источник
Рубин, 78 байт
Наконец, некоторые используют операторы множеств ruby (
[1,2]&[2]==[2]
и[3,4,5]-[4]==[3,5]
).ideone , включая все тестовые случаи, которые он проходит.
источник
CJam, 26 байтов
Не очень коротко ...
объяснение
источник
JavaScript (ES6), 96
110Создание наборов смежности из списка смежности, что помогает избежать дубликатов. Наконец, он перестраивает списки, начиная с наборов.
источник
Ява, 150
Расширенный, исполняемый код:
источник
Groovy - 87
Полный скрипт для запуска тестов:
источник
Математика,
846664 байтаИспользование индексации на основе 1.
источник
Python 3, 127 байт
Попробуй онлайн
Не моя лучшая попытка ...
источник