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.

Mego
źródło
1
Piaskownica
Mego
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
NinjaBearMonkey
źródło
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].

JungHwan Min
źródło
3

Haskell , 64 60 bajtów

import Data.List
i!l=[(k,[a|a<-l,a!!i==k])|k<-nub$map(!!i)l]

Wypróbuj online!

Angs
źródło
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.

Obrzydliwe
źródło
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

Galen Iwanow
źródło
;"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
abcq2
źródło
Czy tego używasz języka?
tragiczny
1

Proton , 29 bajtów

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

Wypróbuj online!

-3 bajty dzięki Panu Xcoderowi korzystającemu z curry i filter(TBH jestem trochę zaskoczony, że filtertak naprawdę działał)

HyperNeutrino
źródło
Curry i korzystaniefilter oszczędzają trzy bajty.
Pan Xcoder,
@ Mr.Xcoder Cool, dzięki: D
HyperNeutrino
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.

NinjaBearMonkey
źródło
0

Galaretka , 5 bajtów

ịⱮ⁹¹ƙ

Wypróbuj online!

Pomija klucze, ale powinno być jasne.

Argument 1: i + 1
Argument 2: a

Erik the Outgolfer
źródło
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
Kevin Cruijssen
źródło