Цель
Сортируйте список элементов, убедившись, что каждый элемент указан после указанных зависимостей.
вход
Массив массивов целых чисел, где каждое целое число указывает на индекс 0 или 1 другого элемента, за которым должен следовать этот элемент. Входные данные могут быть массивом или строкой или чем-либо еще, удобочитаемым человеком.
Например, ввод на основе 0:
[
[ 2 ], // item 0 comes after item 2
[ 0, 3 ], // item 1 comes after item 0 and 3
[ ], // item 2 comes anywhere
[ 2 ] // item 3 comes after item 2
]
Предположим, что нет циклических зависимостей, всегда есть хотя бы один действительный порядок.
Выход
Числа в порядке зависимости. Неоднозначный порядок не должен быть детерминированным. Вывод может быть массивом или текстом или чем-либо еще, удобочитаемым для человека.
На выходе должен быть указан только один заказ, даже если существует несколько действительных заказов.
Возможные выходы для вышеуказанного ввода включают в себя:
[ 2, 3, 0, 1 ]
[ 2, 0, 3, 1 ]
счет
Функция или программа, которая завершает это за наименьшее количество байтов, завоевывает славу принятия. Срок - 6 дней.
Ответы:
Желе, 8 байт
Это основано на (не реализованном) подходе глубины из ответа Python @ xnor .
Попробуйте онлайн!
Как это устроено
источник
Pyth, 21 байт
Тестовое задание:
источник
Python 2, 73 байта
Сортирует вершины по их количеству потомков, которое
f
вычисляется рекурсивно. Если вершина указывает на другую вершину, ее потомки включают остроконечную вершину и всех потомков этой вершины, поэтому у нее строго больше потомков. Таким образом, он размещается позже, чем указанная вершина в порядке, по желанию.Счетчик потомков вершины один для себя, плюс счетчик потомков каждого из его дочерних элементов. Обратите внимание, что потомок может быть подсчитан несколько раз, если к нему ведут несколько путей.
Это также помогло бы использовать глубину, а не счетчик потомков.
кроме того
max
, нужно будет дать0
пустой список.источник
Pyth, 19 байт
Попробуйте онлайн: демонстрация
Объяснение:
источник
Баш, 35 байт
Пример запуска
Ввод / вывод 1-индексирован. Каждый массив идет в отдельной строке с пробелами в качестве разделителя элементов.
Как это устроено
tsort
- о котором я узнал в ответе @ DigitalTrauma - читает пары токенов, разделенные пробелами, которые указывают на частичное упорядочение, и печатает общее упорядочение (в виде отсортированного списка всех уникальных токенов), которое расширяет вышеупомянутый частичный упорядочивание.Все числа в определенной строке сопровождаются либо пробелом, либо переводом строки.
s/\s/ $. /g
Часть команды Perl заменяет пробельные символы с пробелом, номер строки и другое пространство, таким образом , убедившись , что каждый п на линии к предшествует к .Наконец, если строка пустая (то есть состоит только из перевода строки),
s/^$/ /
к ней добавляется пробел. Таким образом, вторая подстановка превращает пустую строку k вk k
, гарантируя, что каждое целое число встречается хотя бы один раз в строке, по которой передаетсяtsort
.источник
tsort
лучше / быстрее, чем я :) Спасибо за дополнительное объяснение.Bash + coreutils,
2080Ввод в виде разделенных пробелами строк, например:
nl
добавляет нулевые индексы ко всем строкамsed
разбивает списки зависимостей на простые пары зависимостей и делает незавершенные зависимости зависимыми от самих себя.tsort
делает необходимый топологический видtac
ставит вывод в обратном порядкеIdeone. Ideone с тестовым набором @Dennis
источник
Python 2,
143118116 байтНемного более случайный подход.
Редактирование:
источник