Вы должны написать программу или функцию, которая сортирует вложенный список. Вот правила сортировки вложенного списка:
Давайте возьмем этот список в качестве примера:
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Каждый элемент в этом списке имеет «приоритет». Элемент считается числом или подсписком. Во-первых, получите приоритет каждого элемента на той же глубине. Если элемент является просто числом, его приоритет совпадает с самим числом. Если элемент является подсписком, его приоритет - это сумма всех чисел в нем, не включая подсписки.
Итак, приоритетами всех элементов глубины 1 являются:
( 7 ) 2 7 ( 3 ) 9
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Сортировка каждого элемента по приоритету. Если есть связь, вы должны сохранить тот же порядок, что и в первоначальном списке.
2 ( 3 ) ( 7 ) 7 9
(2, (2, 1, (3, 4)), (5, 2), 7, 9)
Повторите для каждого подсписка. Так что в этом списке
(2, 1, (3, 4))
Наши приоритеты выглядят так:
2 1 ( 7 )
(2, 1, (3, 4))
Так отсортировано, это выглядит так:
(1, 2, (3, 4))
(3, 4)
уже отсортировано, так что мы сделали. Повторите для (5, 2)
чего приводит, (2, 5)
и мы сделали! Наш окончательный список:
(2, (1, 2, (3, 4)), (2, 5), 7, 9)
Правила:
Весьма сомнительно, но на тот случай, если в Mathematica есть что-то для этого, встроенные функции сортировки вложенных списков не допускаются. Регулярные функции сортировки будут разрешены.
Ввод / вывод может быть в любом разумном формате.
Каждый подсписок будет содержать хотя бы один номер или список. Кроме того, подсписки могут быть вложены в несколько уровней. Например, в имеет приоритет 0, так как она имеет только подсписки в нем.
(1, 2, (((3))))
(((3)))
Неверные списки (несоответствующие скобки, не числа, неправильные типы скобок, отрицательные числа и т. Д.) Приводят к неопределенному поведению.
Тестовый ввод / вывод:
(1, 2, 3) ---> (1, 2, 3)
(1, 2, 6, 3, 9, 8) ---> (1, 2, 3, 6, 8, 9)
(4, 3, (2), (1)) ---> ((1), (2), 3, 4)
(4, 3, (2), ((1))) ---> (((1)), (2), 3, 4)
(5, (1, 2, (9, 8))) ---> ((1, 2, (8, 9)), 5)
(3, (1, 2), (2, 1)) ---> (3, (1, 2), (1, 2))
(3, (1, 2, (99)), (2, 1, (34))) ---> (3, (1, 2, (99)), (1, 2, (34)))
(7, 2, (1, (9, 12)), (4, 3, 2, (1, 2))) ---> ((1, (9, 12)), 2, 7, (2, 3, (1, 2), 4))
Кратчайший ответ в байтах побеждает.
источник
Ответы:
Желе, 13 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
Сравнение (
<
) числа с самим собой дает 0 (ложь), но сравнение непустого списка с самим собой приводит к списку 0 (правда), поэтому<
может использоваться для различения чисел от списков.источник
Python 2,
114101787362 байтаЯ знал, что есть лучший способ отфильтровать списки.
Сортирует список Python (и его подсписки) на месте.
https://eval.in/540457 благодарим @tac за сообщение о том, что решения на месте приемлемы, и @xnor + @feersum за дальнейшую оптимизацию!
источник
k=lambda t:t*(t<[])or sum(z for z in t if[t.sort(key=k)]>z)
.z
из него начальное значение 5. Затем в условном выражении мы сортируем список, по которому мы перебираем (!), Поэтому, когда мы получаем следующий z, это ТАКЖЕ 5, приводя к сумме 10. Затем мы сортируем внешний список с этими ключами и получаем [6, [1, 5]], что неверно: «Если есть связь, вы должны сохранить тот же порядок, что и у исходного списка. " Интересно то, что мы вызываемsort
оба списка дважды, поэтому это происходит только при одинаковых ключах: если бы подсписок был меньше, он бы сортировался обратно.None
результатовt.sort(key=k)
, но я этого не вижу.False
0 для целей+
и расширением,sum
. Не могу думать о том, как это экономит байты, хотя.list.sort
возвращаетсяNone
, а неFalse
.Lua, 172 байта
Функция
s
сортирует таблицу Lua (структуру данных, которая среди прочего используется в Lua) в соответствии с правилами.источник
type(a)
возвращает строкуMathematica, 50 байтов
Простой рекурсивный метод, который использует
SortBy
. Игнорировать сообщения.источник
Haskell,
160151135 байтовПервая проблема - вложенные списки. Haskell требует, чтобы все элементы списка имели одинаковый тип; в частности, целое число и список целых чисел не одного типа. Другими словами, вложенный в переменную список - это не список, а розовое дерево!
Итак, во-первых, мы должны определить тип данных для розовых деревьев:
(Строго говоря,
deriving Show
это необходимо, только если вы хотите увидеть результаты. Но это техническая сложность.) Имея это определение, мы можем написать список, такой(1, 2, (3, 4))
какчто значительно менее читабельно. Но что угодно; это тривиальный механический перевод. Префикс каждого числа с
N
и каждого поддерева сT
.Теперь нам нужно вычислить приоритеты. Это было бы легко, если бы приоритет поддерева был просто суммой всех элементов, которые он содержит. Это было бы тривиальным рекурсивным циклом. Но так как это не так, нам нужно определить две функции: одну, которая повторяется, и другую, которая этого не делает.
Если бы мы суммировали все подэлементы, то
q
не было бы необходимости существовать, сохраняя огромное количество символов. Ну что ж!Edit: На самом деле, несколько commentors указывают на то , что вы можете избежать с
q
помощью списка понимание:[ x | N x <- t]
. Хороший звонок, ребята!(На самом деле,
p
и не нужно было бы существовать; у нас мог бы быть компилятор, автоматически генерирующийOrd
для нас экземпляр в несколько символов, и эта реализация по умолчанию будет соответствовать спецификации.)Наконец, нам нужно выполнить рекурсивную проверку всех поддеревьев и отсортировать их:
То есть
f
сортирует дерево, рекурсивно применяя его ко всем элементам (map f
), а затем вызываяsortBy
функцию для сортировки верхнего уровня. Первая строка говорит, что сортировка числа ничего не делает, и это необходимо для завершения рекурсии.источник
sortBy (\ x y -> compare (p x) (p y))
это простоsortOn p
. Используйте версию инфиксной карт вp
:sum$q<$>t
.sortOn
определяется? Я всегда хотел знать ...p(T t)=sum[x|N x<-t]
иdata T=N Int|T[T]deriving Show
. :)$
вsum$[x|N x<-t]
. Итак, 135-5-1 = 129. :)CLISP, 380 байт
Вызовите функцию q со списком.
Я шучу, пожалуйста, не убивай меня ^^
источник
Pyth, 15 байт
Тестирование
Рекурсивная функция, которая работает следующим образом:
источник
Java, 219 байт
С переносами строк:
Происходит много кастингов, которые действительно увеличивают количество байтов. :П
Целочисленные значения подаются в компаратор, а вложенные списки сортируются в первую очередь, прежде чем сумма только целых значений передается компаратору. Эти значения определяют то, как Компаратор определяет свою позицию в списке при его сортировке.
Попробуй это здесь .
источник
int f(List l){l.sort(Comparator.comparing(o->o instanceof Integer?(int)o:f((List)o)));return l.stream().mapToInt(o->o instanceof Integer?(int)o:0).sum();}
Object
вint
подобное, и проблема, похоже, требует вывода списка.JavaScript (ES6), 86 байт
Проверка всего этого массива :-(
источник
map.map.map.map.map.map.map.map.map