Групування даних масиву


13

З огляду на цілочисельну матрицю aта невід’ємне ціле число i, виведіть відображення, bяке відображає окремі значення у iстовпці у aрядках тих, aхто має це значення у цьому iстовпці.

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

Приклади

[[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]]}

Це , тому найкоротша відповідь у байтах виграє.



Просто для перевірки, чи відображення може бути функцією? Я не знаю, чи це дефолт, але це здається чимось, що ви маєте намір дозволити.
FryAmTheEggman

@FryAmTheEggman Так, функція, яка відповідає нашим звичайним вимогам, дозволена. Введення / вивід надзвичайно гнучкий.
Мего

3
Мені дуже подобається цей формат вводу / виводу, оскільки насправді висновок не повинен містити вхід у собі. Повністю повернути функцію, яка отримує доступ до вхідного посилання за допомогою посилання, поки функція є відображенням.
JungHwan Min

@JungHwanMin Я радий. Я хотів поекспериментувати з дуже нещільним форматом вводу-виводу, і це все іде добре
Mego

Відповіді:


4

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

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

Спробуйте в Інтернеті!

Це створює анонімну функцію, яка повертає матрицю, рядки якої відповідають критеріям. Масиви індексів октави на рівні 1, а не нуль, а рядки матриці розділені а ;.

Матриці - це те, що найкраще робить 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


3

Мова Вольфрама (Mathematica) , 21 байт

#~GroupBy~Extract@#2&

1-індексований. Повертає Associationвідображення.

Спробуйте в Інтернеті!

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

Пояснення

Extract@#2

Функція, яка витягує <second input>th елемент.

#~GroupBy~ ...

Згрупуйте <first input>в списки, пов'язані з різними клавішами <above function>[element].




2

J , 16 байт

-3 байти завдяки FrownyFrog!

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

Спробуйте в Інтернеті!

Пояснення:

Діадичне дієслово, беручи iза лівий аргумент і aяк правове.

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

{"1знаходить числа в iстовпці в кожному рядку

</. групи з правого аргументу, виділених ключами, наданими лівим

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

;"0 пов'язує ключі до вибраних груп


;"0замість ,:заощаджень 3
FrownyFrog

@FrownyFrog Звичайно! Я думаю, я спробував це, але, мабуть, не правильний шлях.
Гален Іванов

2

jq, 100 байт

використовує об'єкт для виведення, приймає аргумент командного рядка $fплюс масив на стандартному вході

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

знешкоджений:

.fieldnum as $field |
.input as $input |
([$input[] | .[$field]] | unique) as $categories |
[
    $categories[] as $category |
    {
        ($category | tostring) :
            ([$input[] | [select(.[$field]==$category)]] | add)
    }
] | add

Є чи це мова ви використовуєте?
Οurous



1

Протон , 29 байт

a=>i=>n=>filter(r=>r[i]==n,a)

Спробуйте в Інтернеті!

-3 байти, дякуючи містеру Xcoder, що використовує каррі та filter(TBH, я здивований, що filterнасправді спрацював)



@ Mr.Xcoder Класно, дякую: D
HyperNeutrino

0

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

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

Спробуйте в Інтернеті!

Оновлено зараз, коли я усвідомлюю невисокі вимоги до випуску. Це використовує currying як техніку для гольфу, і він також повертає функцію, яка приймає введення nта відображає їх до відповідних масивів.


0

Желе , 5 байт

ịⱮ⁹¹ƙ

Спробуйте в Інтернеті!

Пропускає ключі, але має бути чітким.

Аргумент 1: i + 1
Аргумент 2: a


Я не думаю, що це було б кваліфіковано як відображення без ключів.
Денніс

@Dennis Гм, я запитав у коментарях до цього, і ОП сказав, що ми можемо опустити ключі (саме те, що я відредагував у питанні), і я також пов’язав це рішення там (можливо, я не повинен був би відзначати так рано ... ). Я включив ключі в попередній редакції цієї відповіді (чекаю на відповідь), тому я просто опублікую ще один коментар і подивимось, що говорить ОП.
Ерік Аутгольфер

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.