Учитывая двумерный массив целых чисел, давайте отсортируем его строки и столбцы по блокам. Это означает, что вам нужно только отсортировать заданную строку или столбец, но применить преобразования, необходимые для сортировки, для каждой другой строки или столбца в двумерном массиве.
правила
- Входными данными будут двумерный массив целых чисел и целое число с 1 индексом. Это целое число будет представлять строку, подлежащую сортировке, если число положительное, или столбец, подлежащий сортировке, если число отрицательное (или наоборот, если вы хотите). Пример: учитывая
4x3
массив (строки х столбцов), вы можете отсортировать второй столбец с помощью-2
аргументом или третью строку с3
аргументом. Этот второй аргумент никогда не будет нулевым, и его абсолютное значение никогда не будет больше соответствующего измерения массива. - Выходными данными будет также двумерный массив целых чисел с необходимыми преобразованиями, примененными для сортировки заданной строки или столбца. В качестве альтернативы вы можете просто записать массив в STDOUT.
- В выходном массиве указанная строка или столбец будут отсортированы в порядке возрастания. Просто обратите внимание, что когда вам нужно поменять местами два числа, будут поменяны все столбцы, в которых лежат числа. И когда вам нужно поменять местами два числа в столбце, все строки, где лежат числа, будут поменяны местами.
- В случае, когда одно и то же число появляется в сортируемой строке / столбце несколько раз, будет возможно несколько решений в зависимости от того, как вы меняете значения, просто сделайте это с остальными строками / столбцами, которые нужно поменять местами.
Примеры
Positive indices for rows and negative indices for columns
[5 8 7 6 [1 3 2 4
1 3 2 4 order by -3 (3rd column) --> 9 6 3 0
9 6 3 0] 5 8 7 6]
[5 8 7 6 [9 6 3 0
1 3 2 4 order by -4 (4th column) --> 1 3 2 4
9 6 3 0] 5 8 7 6]
[5 8 7 6 [5 7 8 6
1 3 2 4 order by 2 (2nd row) --> 1 2 3 4
9 6 3 0] 9 3 6 0]
[5 8 7 6 [6 7 8 5
1 3 2 4 order by 3 (3rd row) --> 4 2 3 1
9 6 3 0] 0 3 6 9]
[1 2 [1 2 [3 2
3 2] order by -2 (2nd column) --> 3 2] or 1 2] (both are valid)
[7 5 9 7 [5 7 7 9 [5 7 7 9
1 3 2 4 order by 1 (1st row) --> 3 1 4 2 or 3 4 1 2
9 6 3 0] 6 9 0 3] 6 0 9 3]
Это код-гольф , поэтому может выиграть самый короткий код для каждого языка!
Ответы:
R , 55 байт
Попробуйте онлайн!
Переназначает
+
оператор (фактически функцию в R) наorder
функцию, которая возвращает индексы вектора от наименьшего к наибольшему. Тогда это просто манипулирование массивом.источник
R , 55 байт
Попробуйте онлайн!
Альтернатива ответу НГМ ; рекурсивная функция, вдохновленная ответом Димча
источник
Матлаб,
736247 байтПопробуйте онлайн!
-11 байт благодаря @Giuseppe.
-15 байт благодаря @LuisMendo.
источник
Japt ,
1817 байтотрицательный для строк и положительный для столбцов
Попробуйте онлайн!
источник
U
отрицательно - предыдущая 17-байтовая версия работает, хотя.ß
этого автоматически применяется кU
. Это может создать проблемы с попыткой передать буквальные строки, но в любом случае опубликовать предложение в репозитории GitHub для дальнейшего изучения.05AB1E ,
252414 байтовКолоссальные 10 байт благодаря @Emigna .
Использует положительный целочисленный ввод для сортировки строк, отрицательный для столбцов.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
diø}Σ¹Ä<è]¹diø
что является подмножеством вашего, поэтому я не публикую отдельный ответ.JavaScript (ES6), 90 байт
Попробуйте онлайн!
Как?
У JS нет собственного метода транспонирования, поэтому нам нужно определить его:
Основная функция:
Пример с :к = 2
источник
MATL , 17 байт
Попробуйте онлайн!
Или проверьте все тестовые случаи
объяснение
источник
APL (Dyalog Classic) , 23 байта
Попробуйте онлайн!
источник
Python 2 ,
7170 байтПопробуйте онлайн!
Если
n
отрицательное, строки сортируются по столбцуn
.В противном случае матрица транспонируется, сортируется таким же образом и транспонируется обратно.
источник
Желе , 12 байт
Попробуйте онлайн!
источник
C # (.NET Core) , 186 байт
Попробуйте онлайн!
Ungolfed:
Функция сдвига мы будем использовать дважды, поэтому переменная функции сэкономит место. Функция выполняет итерацию по горизонтальному измерению массива по индексу и добавляет каждый элемент по этому индексу каждого горизонтального массива в новый выходной массив (по горизонтали) - почти так же, как в решении JS от Arnoud.
Теперь упорядочение простое, упорядочить горизонтальный массив по номеру при индексе (аргумент -1), опционально сдвигая массив до и после сортировки.
Если посмотреть, как конкретно вопрос говорит о массивах, мы конвертируем в массив несколько раз (очень, очень расточительно). Чувствовать себя немного глупо, чтобы использовать такой многословный язык в коде гольф хе-хе.
источник
C # (.NET Core) ,
142/139138/135 байт (и еще один -1 Кевина)Попробуйте онлайн!
Ungolfed:
Новый всесторонний подход; отрицательный ответ по-прежнему упорядочивает массивы по элементам по индексу. В противном случае создается коллекция пара-значение-индекс из массива-по-индексу и сортируется по значению. Это эффективно создает коллекцию индексов в порядке необходимости добавления. Затем для каждого массива выбираются элементы в заранее определенных позициях. Немного подрезания кода и безобразного, безобразного, безобразного ** тихого рыдания ** повторного использования входных параметров, и вот, пожалуйста, 142 байта.
Опять же, аргумент массива строго соблюдается, добавляя довольно много накладных расходов для вызовов .ToArray ().
135 байтов утверждают, а ?! Подсказанные значения-кортежи C # 7.2 обрезали бы дополнительные три байта, но tio.run не позволяет. Таким образом, это ответ, который я решил опубликовать для легкой проверки.
источник
(a,s)=>
может быть карриa=>s=>
.(s<0)?
не нуждается в скобках, и-s-1
может быть~s
. Попробуйте онлайн: 137 байтовJava (OpenJDK 8) , 326 байт
Попробуйте онлайн!
Ну, ребята, этот вопрос был очень расстраивающим для меня, и я отправил свой ответ, Зная, что я что-то забыл, к счастью, у нас есть легенды, такие как Кевин Круйссен , чтобы помочь нам :)
Java (OpenJDK 8) , 281 байт
Попробуйте онлайн!
источник
a->b->
вместо(a,b)->
и удалитьreturn
-statement, так как вы изменяете массив ввода. 281 байт. Тем не менее, хороший ответ. +1 от меня. Я выполнил задание в 05AB1E, но на этот раз даже не попробовал бы его на Java. ;)Чисто , 95 байт
Попробуйте онлайн!
источник
Котлин , 192 байта
Попробуйте онлайн!
источник
Рубин , 69 байт
Попробуйте онлайн!
источник
красный ,
190185 байтПопробуйте онлайн!
Объяснение:
Мое реальное решение имеет длину 175 байт, но оно не работает в TIO. Вот он, работает нормал в красной консоли:
Красный , 175 байт
источник
VBA (Excel), 205 байтов
Ура! 2-й длинный отсчет байтов! Я не совсем проиграл: D
Golfed:
Это сортирует все данные на открытом (активном) рабочем листе, используя UsedRange ..., который может содержать ошибки, но должен содержать только отредактированные ячейки.
UnGolfed:
источник
Sub d(a)
With Sheet1.Sort
.SortFields.Clear
.SortFields.Add IIf(a<0,Columns(Abs(a)),Rows(Abs(a)))
.SetRange Sheet1.UsedRange
.Orientation=(a<0)+2
.Apply
End With
End Sub
.SortFields
определено, поэтому вы также можете удалить.Sortfields.Clear
строку.Perl 6 , 43 байта
Попробуйте онлайн!
Функция карри.
объяснение
источник
Physica , 45 байт
Очень похоже на ответ Арно .
Попробуйте онлайн!
Как это устроено?
Более подробное и наглядное объяснение можно найти в связанном ответе.
источник
J , 32 байта
Попробуйте онлайн!
Обратите внимание
g=.
главный глагол не считается.Явная версия для тех же байтов
J , 32 байта
Попробуйте онлайн!
источник
Clojure, 91 байт
Argh,
apply map list
* 2.источник