Grupowanie danych macierzy


13

Biorąc pod uwagę macierz całkowitą ai nieujemną liczbę całkowitą i, wyprowadzaj odwzorowanie, bktóre odwzorowuje różne wartości w ikolumnie th ana wiersze, aktóre mają tę wartość w ikolumnie th.

Możesz założyć, że ijest w zakresie półotwartym [0, num_cols(a))(lub [1, num_cols(a)]jeśli zdecydujesz się na użycie indeksów 1) i że wszystkie liczby całkowite mieszczą się w reprezentatywnym zakresie dla twojego języka. Dane wejściowe i wyjściowe można wykonać w dowolny rozsądny sposób, o ile spełnia on podstawowe wymagania wyzwania (tablica 2D -> odwzorowanie z int na tablice 2D ints). Dopóki mapowanie jest jasne i spójne, klucze nie muszą być dołączane do wyniku.

Przykłady

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

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.



Aby to sprawdzić, czy mapowanie może być funkcją? Nie wiem, czy jest to ustawienie domyślne, ale wydaje się, że chcesz na to zezwolić.
FryAmTheEggman

@FryAmTheEggman Tak, funkcja spełniająca nasze zwykłe wymagania jest dozwolona. I / O jest niezwykle elastyczny.
Mego

3
Bardzo podoba mi się ten format we / wy, ponieważ dane wyjściowe nie muszą zawierać samego wejścia. Całkowicie dobrze jest zwrócić funkcję, która uzyskuje dostęp do danych wejściowych przez odniesienie, o ile funkcja jest odwzorowaniem.
JungHwan Min

@JungHwanMin Cieszę się. Chciałem eksperymentować z bardzo luźnym formatem We / Wy, a jak dotąd idzie dobrze
Mego

Odpowiedzi:


4

Oktawa , 24 bajty

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

Wypróbuj online!

Tworzy to anonimową funkcję, która zwraca macierz, której wiersze są zgodne z kryteriami. Tablice indeksów oktawowych o wartości 1, a nie zero, a wiersze macierzy są oddzielone znakiem a ;.

Matryce są tym, co Octave robi najlepiej - tak dobrze, że wyzwanie to można rozwiązać za pomocą czystej składni, bez wbudowanych funkcji.

Wyjaśnienie

@(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

Wolfram Language (Mathematica) , 21 bajtów

#~GroupBy~Extract@#2&

1-indeksowany. Zwraca Associationmapowanie.

Wypróbuj online!

Jest to rzadki przypadek, w którym dłuższa funkcja ( Extract) zmniejsza liczbę bajtów (krótsza to Partlub [[ ... ]]), ponieważ Extractmoże curry. Rezultatem jest to niezwykle zwięzłe, dwufunkcyjne rozwiązanie.

Wyjaśnienie

Extract@#2

Funkcja, która wyodrębnia <second input>element th.

#~GroupBy~ ...

Pogrupuj <first input>w listy powiązane z odrębnymi kluczami <above function>[element].



2

Czysty , 40 bajtów

import StdEnv

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

Wypróbuj online!

Funkcja lambda ( :: Int [[Int]] Int -> [[Int]]), w której częściowe zastosowanie tylko dwóch pierwszych argumentów daje odwzorowanie trzeciego argumentu.


2

J , 16 bajtów

-3 bajty dzięki FrownyFrog!

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

Wypróbuj online!

Wyjaśnienie:

Czasownik dynastyczny, ijako lewy argument i aprawy argument .

] jest właściwym argumentem, a

{"1znajduje liczby w ikolumnie w każdym rzędzie

</. grupuje grupy z prawego argumentu, wybranego przez klucze, dostarczonego przez lewy

~.@[ znajduje unikalne klucze

;"0 łączy klucze z wybranymi grupami


;"0zamiast ,:ratuje 3
FrownyFrog

@FrownyFrog Oczywiście! Myślę, że próbowałem, ale najwyraźniej nie we właściwy sposób.
Galen Iwanow

2

jq, 100 bajtów

używa obiektu jako danych wyjściowych, pobiera argument wiersza poleceń $fplus tablicę na standardowym wejściu

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

odszyfrowane:

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

Czy tego używasz języka?
tragiczny




0

JavaScript (Node.js) , 29 bajtów

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

Wypróbuj online!

Zaktualizowano teraz, gdy zdaję sobie sprawę z luźnych wymagań dotyczących wydajności. Wykorzystuje curry jako technikę gry w golfa, a także zwraca funkcję, która pobiera dane wejściowe ni mapuje je do odpowiednich tablic.


0

Galaretka , 5 bajtów

ịⱮ⁹¹ƙ

Wypróbuj online!

Pomija klucze, ale powinno być jasne.

Argument 1: i + 1
Argument 2: a


Nie sądzę, że można by to zakwalifikować jako mapowanie bez kluczy.
Dennis

@Dennis Hm, zapytałem w komentarzach na ten temat, a OP powiedział, że możemy pominąć klucze (dokładnie to, co zredagowałem w pytaniu), a także podłączyłem tam to rozwiązanie (być może nie powinienem oznaczać tak wcześnie ... ). Dołączyłem klucze do poprzedniej wersji tej odpowiedzi (czekam na odpowiedź), więc po prostu opublikuję kolejny komentarz i zobaczymy, co mówi OP.
Erik the Outgolfer

0

Java 10, 135 64 bajtów

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

Zwraca wartość Function<Integer, List<int[]>>akceptującą liczbę całkowitą n, która zwraca Listę tablic (macierzy-wierszy), w których iwartości są równe podanej n.

Wypróbuj online.

Wyjaśnienie:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.