Raggruppamento dei dati dell'array


13

Data una matrice intera ae un intero non negativo i, genera una mappatura bche associ i valori distinti nella icolonna th aalle righe di achi ha quel valore nella icolonna th.

Si può presumere che isi trovi nell'intervallo semi-aperto [0, num_cols(a))(o [1, num_cols(a)]se si sceglie di utilizzare indici basati su 1) e che tutti gli interi sono compresi nell'intervallo rappresentabile della propria lingua. L'input e l'output possono essere eseguiti in modo ragionevole, purché soddisfino i requisiti di base della sfida (array 2D -> mappatura da ints a array 2D di ints). Finché la mappatura è chiara e coerente, le chiavi non devono essere incluse nell'output.

Esempi

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

Questo è , quindi vince la risposta più breve in byte.



Solo per verificare, la mappatura può essere una funzione? Non so se si tratta di un valore predefinito, ma sembra qualcosa che intendi consentire.
FryAmTheEggman

@FryAmTheEggman Sì, è consentita una funzione che soddisfa i nostri soliti requisiti. L'I / O è estremamente flessibile.
Mego

3
Mi piace molto questo formato I / O perché l'output in realtà non ha bisogno di contenere l'input in sé. È del tutto corretto restituire una funzione che accede all'input per riferimento purché la funzione sia una mappatura.
JungHwan Min

@JungHwanMin Sono contento. Volevo sperimentare un formato I / O molto lento, e sta andando bene finora
Mego

Risposte:


4

Ottava , 24 byte

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

Provalo online!

Ciò crea una funzione anonima che restituisce una matrice le cui righe corrispondono ai criteri. Gli indici di ottava sono allineati a 1, non a zero, e le righe di una matrice sono separate da a ;.

Le matrici sono ciò che Octave fa meglio - così bene, infatti, che questa sfida può essere risolta usando la sintassi pura, senza funzioni integrate.

Spiegazione

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

#~GroupBy~Extract@#2&

1-indicizzati. Restituisce una Associationmappatura.

Provalo online!

Questo è un caso raro in cui una funzione più lunga ( Extract) riduce il conteggio dei byte (essendo quello più corto Parto [[ ... ]]) perché Extractpuò eseguire il curry. Il risultato è questa soluzione a due funzioni estremamente concisa.

Spiegazione

Extract@#2

Funzione che estrae l' <second input>elemento th.

#~GroupBy~ ...

Raggruppa gli <first input>elenchi associati a chiavi distinte <above function>[element].



2

Pulito , 40 byte

import StdEnv

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

Provalo online!

Un lambda ( :: Int [[Int]] Int -> [[Int]]) in cui un'applicazione parziale dei soli primi due argomenti fornisce una mappatura sul terzo argomento.


2

J , 16 byte

-3 byte grazie a FrownyFrog!

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

Provalo online!

Spiegazione:

Un verbo diadico, prendendo icome argomento di sinistra e acome argomento di destra.

] è l'argomento giusto, a

{"1trova i numeri nella icolonna su ogni riga

</. raggruppa i gruppi dall'argomento destro, selezionato dai tasti, fornito da quello sinistro

~.@[ trova le chiavi univoche

;"0 collega le chiavi ai gruppi selezionati


;"0invece di ,:salvare 3
FrownyFrog,

@FrownyFrog Certo! Penso di averlo provato, ma apparentemente non nel modo giusto.
Galen Ivanov,

2

jq, 100 byte

utilizza un oggetto per l'output, accetta un argomento della riga di comando $fpiù un array sull'input standard

([.[]|.[$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

È questa la lingua che stai usando?
Οuroso




0

JavaScript (Node.js) , 29 byte

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

Provalo online!

Aggiornato ora che realizzo i requisiti di output sciolti. Questo utilizza il curry come tecnica di golf e restituisce anche una funzione che accetta un input ne lo mappa sugli array corretti.


0

Gelatina , 5 byte

ịⱮ⁹¹ƙ

Provalo online!

Omette le chiavi, ma dovrebbe essere chiaro.

Argomento 1: i + 1
Argomento 2: a


Non penso che questo si qualificherebbe come una mappatura senza le chiavi.
Dennis,

@Dennis Hm, nei commenti l'avevo chiesto e OP ha detto che possiamo omettere le chiavi (esattamente ciò che ho modificato nella domanda), e avevo anche collegato questa soluzione lì (forse non avrei dovuto contrassegnare così presto ... ). Ho incluso le chiavi in ​​una precedente revisione di questa risposta (in attesa di una risposta), quindi posterò un altro commento e vedremo cosa dice OP.
Erik the Outgolfer,

0

Java 10, 135 64 byte

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

Restituisce Function<Integer, List<int[]>>accettando un input intero n, che restituisce un Elenco di matrici (righe di matrice) in cui i i'valori sono uguali al dato n.

Provalo online.

Spiegazione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.