Группировка данных массива

13

Учитывая целочисленную матрицу aи неотрицательное целое число i, выведите отображение, bкоторое отображает различные значения в iстолбце th aна строки a, имеющие это значение в iстолбце th.

Вы можете предположить, что он iнаходится в полуоткрытом диапазоне [0, num_cols(a))(или [1, num_cols(a)]если вы решите использовать индексы на основе 1), и что все целые числа находятся в пределах представимого диапазона для вашего языка. Ввод и вывод могут быть выполнены любым разумным способом, при условии, что он удовлетворяет основным требованиям задачи (2D-массив -> отображение из целых чисел в двумерные массивы целых). До тех пор, пока отображение ясное и последовательное, ключи не нужно включать в вывод.

Примеры

[[1]], 0 -> {1: [[1]]}
[[3, 4, 5], [1, 4, 2], [5, 5, 5], [7, 7, 7], [1, 5, 9]], 1 -> {4: [[3, 4, 5], [1, 4, 2]], 5: [[5, 5, 5], [1, 5, 9]], 7: [[7, 7, 7]]}
[[1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [2, 3, 4, 5, 6], [8, 9, 100, 0, 2]], 4 -> {5: [[1, 2, 3, 4, 5]], 1: [[5, 4, 3, 2, 1]], 6: [[2, 3, 4, 5, 6]], 2: [[8, 9, 100, 0, 2]]}

Это , поэтому выигрывает самый короткий ответ в байтах.

Mego
источник
Просто чтобы проверить, может ли отображение быть функцией? Я не знаю, если это по умолчанию, но кажется, что вы собираетесь разрешить.
FryAmTheEggman
@FryAmTheEggman Да, функция, которая отвечает нашим обычным требованиям, разрешена. Ввод / вывод чрезвычайно гибок.
Мего
3
Мне очень нравится этот формат ввода / вывода, потому что на самом деле вывод не должен содержать сам ввод. Вполне нормально возвращать функцию, которая обращается к входу по ссылке, если функция является отображением.
JungHwan Мин
@JungHwanMin Я рад. Я хотел поэкспериментировать с очень свободным форматом ввода / вывода, и пока все идет хорошо
Mego

Ответы:

4

Октава , 24 байта

@(a,i)@(n)a(a(:,i)==n,:)

Попробуйте онлайн!

Это создает анонимную функцию, которая возвращает матрицу, строки которой соответствуют критериям. Массивы октавных индексов равны 1, а не нулю, а строки матрицы разделены знаком a ;.

Матрицы - это то, что Octave делает лучше всего - настолько хорошо, что фактически эта задача может быть решена с использованием чистого синтаксиса, без встроенных функций.

объяснение

@(a,i)                   % creates an anonymous function that...
      @(n)               % returns another function that takes input n and
                         % maps it to the rows of a.
          a(         ,:) % Return all the columns of a, with the rows filtered by...
            a(:,i)       % whether the ith column of each row of a...
                  ==n    % equals n
NinjaBearMonkey
источник
3

Wolfram Language (Mathematica) , 21 байт

#~GroupBy~Extract@#2&

1-индексироваться. ВозвращаетAssociation сопоставление.

Попробуйте онлайн!

Это редкий случай, когда более длинная функция ( Extract) уменьшает количество байтов (более короткое существо Partили [[ ... ]]), потому что Extractможет карри. Результат - это чрезвычайно краткое решение с двумя функциями.

объяснение

Extract@#2

Функция, извлекающая <second input>элемент th.

#~GroupBy~ ...

Сгруппируйте <first input>в списки, связанные с различными ключами <above function>[element].

Юнг Хван Мин
источник
2

Чисто , 40 байт

import StdEnv

\n l i=filter(\a=a!!n==i)l

Попробуйте онлайн!

Лямбда ( :: Int [[Int]] Int -> [[Int]]), где частичное применение только первых двух аргументов дает отображение на третий аргумент.

Οurous
источник
2

J , 16 байт

-3 байта благодаря FrownyFrog!

{"1(~.@[;"0</.)]

Попробуйте онлайн!

Объяснение:

Диадический глагол, принимающий iза левый аргумент и aза правый.

] это правильный аргумент, a

{"1находит числа в iстолбце th в каждой строке

</. блокирует группы из правого аргумента, выбираемого клавишами, предоставленными левым

~.@[ находит уникальные ключи

;"0 связывает ключи с выбранными группами

Гален Иванов
источник
;"0вместо ,:сохранения 3
FrownyFrog
@FrownyFrog Конечно! Я думаю, что я попробовал, но, видимо, не правильно.
Гален Иванов
2

JQ, 100 байт

использует объект для вывода, принимает аргумент командной строки $fплюс массив на стандартном вводе

([.[]|.[$f]]|unique) as $c|[$c[] as $d|{($d|tostring):([.[]|[select(.[$f]==$d)]]|add)}]|add

deobfuscated:

.fieldnum as $field |
.input as $input |
([$input[] | .[$field]] | unique) as $categories |
[
    $categories[] as $category |
    {
        ($category | tostring) :
            ([$input[] | [select(.[$field]==$category)]] | add)
    }
] | add
abcq2
источник
Является ли это язык вы используете?
августа
0

JavaScript (Node.js) , 29 байт

a=>i=>n=>a.filter(e=>e[i]==n)

Попробуйте онлайн!

Обновленный теперь, когда я понимаю свободные требования к продукции. Это использует карри в качестве техники игры в гольф, а также возвращает функцию, которая принимает входные данные nи отображает их в соответствующие массивы.

NinjaBearMonkey
источник
0

Желе , 5 байт

ịⱮ⁹¹ƙ

Попробуйте онлайн!

Опускает ключи, но должно быть ясно.

Аргумент 1: я + 1
Аргумент 2: а

Эрик Outgolfer
источник
Я не думаю, что это будет квалифицироваться как отображение без ключей.
Деннис
@Dennis Хм, я спросил в комментариях об этом, и OP сказал, что мы можем опустить ключи (именно то, что я отредактировал в вопросе), и я также связал это решение там (возможно, не следовало отмечать так рано ... ). Я включил ключи в предыдущую редакцию этого ответа (ожидая ответа), поэтому я просто оставлю еще один комментарий и посмотрим, что говорит OP.
Эрик Outgolfer
0

Java 10, 135 64 байта

m->i->n->new java.util.Stack(){{for(var a:m)if(a[i]==n)add(a);}}

Возвращает Function<Integer, List<int[]>>принимающий целочисленный ввод n, который возвращает список массивов (строк матрицы), где i'-ые значения равны заданному n.

Попробуйте онлайн.

Объяснение:

m->i->               // Method with int-matrix and int parameters and Function return-type
  n->                //  Return a Function with integer as parameter
    new java.util.Stack(){{
                     //  and List of integer-arrays as return-type
      for(var a:m)   //   Loop over the arrays of the input-matrix
        if(a[i]==n)  //    If the `i`'the value of the current array equals `n`:
          add(a);}}  //     Add it to the return-List
Кевин Круйссен
источник