Имея список индексов и ноль или более списков целых чисел, выведите списки целых чисел, отсортированные в порядке возрастания, с приоритетом ключа из первого ввода.
пример
Пусть будет ввод ключей [1, 0, 2]
, а ввод списков будет [[5, 3, 4], [6, 2, 1], [5, 2, 1]]
. Эти списки должны быть отсортированы по их второму элементу, затем первому элементу, затем третьему элементу в порядке возрастания:
- Сначала мы сортируем значения по индексу
1
:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
- Далее мы разрываем любые связи из первой сортировки, используя значения в индексе
0
:[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
- Наконец, мы разрываем все оставшиеся связи с индексами в индексах
2
(это на самом деле ничего не меняет, потому что связей не осталось).
Детали
- Сортировка стабильна: если два элемента сравниваются равными по отношению к заданным ключам сортировки, они должны оставаться в одном и том же относительном порядке в выходных данных. Например, если
A
иB
при заданных ключах сортировки равны, а вход был[..., A, ..., B, ...]
,A
должен быть помещен передB
в выводе. - Ключ сортировки никогда не будет ссылаться на несуществующий элемент в одном из списков ввода.
- Ключ сортировки не будет повторяться. Таким образом,
[1, 2, 1]
неверный список ключей сортировки. - Любые элементы, на которые не ссылаются ключи сортировки, не учитываются в порядке сортировки. Только начальный относительный порядок и значения элементов, на которые ссылаются ключи сортировки, определяют порядок вывода.
- Вы можете выбрать, будут ли ключи сортировки с нулевой или одной индексацией.
- В ключах сортировки не будет отрицательных значений. Если вы решите использовать одноиндексирование, в ключах сортировки также не будет нулей.
- Целочисленные значения не будут превышать естественного представления вашего языка. Если выбранный вами язык обладает способностью к целым числам произвольной точности (например, Python), тогда любое целочисленное значение может присутствовать во входных данных с учетом ограничений памяти.
Реализация ссылок (Python 2)
#!/usr/bin/env python
keys = input()
lists = input()
print sorted(lists, key=lambda l:[l[x] for x in keys])
Тестовые случаи
Формат: keys lists -> output
. Все ключи сортировки имеют нулевую индексацию.
[1, 0, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[5, 2, 1], [6, 2, 1], [5, 3, 4]]
[1, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[6, 2, 1], [5, 2, 1], [5, 3, 4]]
[0, 1] [[1, 2], [2, 1]] -> [[1, 2], [2, 1]]
[1, 0] [[1, 2], [2, 1]] -> [[2, 1], [1, 2]]
[0] [[4], [10, 11, -88], [-2, 7]] -> [[-2, 7], [4], [10, 11, -88]]
[2] [[-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6]] -> [[-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2]]
[2, 1] [[9, 2, -2, -10, -6], [3, -4, -2]] -> [[3, -4, -2], [9, 2, -2, -10, -6]]
[2, 4, 8] [[5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5], [-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3]] -> [[-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3], [5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5]]
[1, 2, 3, 4, 5] [[-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [5, 3, -6, -5, -4, -4, -8, 2], [9, -4, 1, -1, -3, -2], [-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [1, -5, -3, -10, -7, 9, -8, -5, -1], [-9, 4, -1, -1, 2, 4]] -> [[-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -5, -3, -10, -7, 9, -8, -5, -1], [9, -4, 1, -1, -3, -2], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [5, 3, -6, -5, -4, -4, -8, 2], [-9, 4, -1, -1, 2, 4]]
[8, 7, 3, 2, 4, 9, 1] [[8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9]] -> [[10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5]]
Ответы:
Желе , 4 байта
Попробуйте онлайн!
источник
Þ
«сортировать по указанному ключу сортировки»,⁴ị
использует второй аргумент командной строки для изменения порядка массива (создает ключ сортировки, который работает как вопрос) и$
переопределяет приоритет, так что программа анализирует правильно.CJam , 13 байтов
Безымянный блок, который ожидает список списков и список приоритетов сверху стека и заменяет их отсортированным списком списков.
Попробуйте онлайн! (Как набор тестов.)
объяснение
Сортировка с помощью прерывателей связей может быть реализована путем многократной сортировки всего списка, стабильно переходя от ключа с самым низким приоритетом к ключу с самым высоким приоритетом.
источник
Рубин, 35 байт
Смотрите это на eval.in: https://eval.in/652574
источник
Haskell, 38 байт
Пример использования:
( sortOn.flip(map.(!!)) ) [2,1] [[9,2,-2,-10,-6], [3,-4,-2]]
->[[3,-4,-2],[9,2,-2,-10,-6]]
.Non-pointfree:
f k v=sortOn(\x->map(\y->x!!y)k)v
.источник
Mathematica,
2219 байтовИспользует индексы на основе 1. Эта безымянная функция каррируется , поэтому соглашение о вызовах:
Mathematica
SortBy
может взять список функций, и в этом случае отдельные функции используются как последовательные прерыватели связей, так что это именно то, что мы хотим. Все, что нам нужно сделать, это создать список функций, которые возвращают соответствующий элемент списка. Это можно сделать с помощьюExtract
.Extract
обычно это двоичная функция,Extract[list, index]
которая возвращает элемент списка. Однако, если используется не по назначению, тоExtract[index]
возвращает функцию, которая извлекает элементindex
из списка, переданного ему. Другими словами,index
параметрExtract
может быть карри. Мы используем это, отображаяExtract
список заданных нами индексов, который создает список необходимых нам функций.источник
Extract/@#
бытьExtract/@(#+1)
? Индекс ввода начинается с 0.[{1, 0, 2}]
быть[{2, 1, 3}]
в вашем примере? Действительно, в настоящее время сортировка выполняется по первому элементу, затем по заголовку, затем по второму элементу.Python, 50 байт
Это тривиальная версия эталонной реализации.
l
является параметром списков и параметромk
ключей сортировки.l
может быть любым итеративным, при условии, что его элементы подписываются целыми числами (такими как списки, кортежи или подсказки с внутренним ключом).k
может быть любым повторяемым.источник
Брахилог , 29 байт
Попробуйте онлайн!
объяснение
Мы используем тот факт, что
o - Order
можно использовать с дополнительным предикатом в качестве входных данных: мы упорядочиваем списки, используя для каждого[Keys, a list]
список элементов,a list
которые находятся в индексеa key
в порядке их появленияKeys
.источник
CJam (12 байт)
Демо онлайн . Это анонимный блок (функция), который принимает аргументы в порядке, заданном для тестовых случаев, и оставляет отсортированное значение в стеке. Он полагается на
$
стабильность встроенной сортировки , но официальный интерпретатор гарантирует это.рассечение
источник
J, 6 байт
Ключи с нулевой индексацией. LHS - это список ключей, а RHS - это массив значений. Поскольку J не поддерживает рваные массивы, каждый массив должен быть в штучной упаковке.
использование
объяснение
источник
JavaScript (ES6), 55 байт
Стандарт ECMAscript не гарантирует, что базовая сортировка стабильна, поэтому следующий 68-байтовый код не делает такого предположения:
источник
Pyth,
54 байтаПопробуйте онлайн: демонстрация или тестовый набор
Спасибо @Maltysen за один байт.
Объяснение:
Я был очень удивлен, что это сработало. Это действительно странный синтаксис.
источник
QE
наF
JavaScript (ES6) 46
При каждом сравнении во время сортировки сканируйте ключевые индексы, чтобы найти правильный порядок
Тестовое задание
источник
PHP,
212170 байтВ PHP больше нет встроенной стабильной сортировки ; При выборе более старой версии невозможно выполнить рекурсивный обратный вызов с необходимой спецификацией. Но не берите в голову: использование рекурсивного итератора обратного вызова обойдется в тонны; так что я даже не проверил, может ли это сделать.
Внутренний цикл может быть заменен другим
foreach
; это сэкономило бы несколько байтов при обмене. Но без проверки$b<$a
(или$b<count($i)
) это приведет к бесконечному циклу. И с этой проверкойforeach
стоит столько же, сколько выигрывает обмен.Сначала я сделал сравнение рекурсивно; но итерация экономит тонны байтов:
сломать
источник
if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}
может быть записано как$r>0&&$i[$b+1]^=$i[$b]^=$i[$b+1]^=$i[$b];
, экономя вам 7 байтов. При этом используется подкачка XOR со злоупотреблением оценкой короткого замыкания для эмуляцииif(){ ... }
. Обмен выполняется только тогда и только тогда, когда$r>0
. Это использует тот же прием, который (иногда) используется с базами данных. Часто вы увидитеmysqli_connect( ... ) or die('Cannot connect');
.$b
цикла. ;)m($i,$k);
перед тем, какvar_dump
и Ваша версия будет выдавать мусор.R 40 байт
Объяснение:
Список списков лучше всего представить в виде data.frame в R:
Если список индексов равен il (индексирование от 1):
Сортировка может быть выполнена с помощью следующего кода:
Выход:
источник
Perl 6
23 2019 байтовисточник
Ракетка 218 байт
Ungolfed (il = индексный список; ll = список списков; qsl = быстрая сортировка для списка списков; h = голова (первый элемент); t = хвост (остальные или оставшиеся элементы); g = модифицируемый фильтр fn):
Тестирование:
Выход:
источник
PHP, 139 байт
используйте новый оператор космического корабля и usort
Вместо
$x[$k[$i]]<=>$y[$k[$i]]
вас можно использовать$x[$k[$i]]-$y[$k[$i]]
под версией PHP больше 7 - 2 байтаверсия с созданием собственного индекса 197 байт, как в реальной библиотеке
источник
<?function c($x,$y,$i=0){$k=$_GET[k];return $x[$k[$i]]<=>$y[$k[$i]]?:($k[++$i]?c($x,$y,$i):0);}usort($a=$_GET[a],c);echo json_encode($a);
.$_GET
это суперглобальный: это означает, что он уже глобален везде. Удалитеglobal$k;
, переместите назначение внутри функции, и все готово. Кроме того, так как это использует$_GET
, вы должны использовать<?
. При этом вы экономите 10 байтов. Это будет (надеюсь) работать.sort
функции используют быструю сортировку; это не стабильно. Кроме того, вы можете сохранить два байта с-
вместо<=>
и два с анонимным обратным вызовом дляusort
.c($x,$y,$i)
конца тела функции.Clojure, 29 байт
Nicely
sort-by
стабильна и умеет сортировать векторы, и векторы могут работать как функции.([4 6 9 7] 2)
есть9
(индексирование на основе 0).источник