Gruppieren von Array-Daten

13

Geben Sie bei einer Ganzzahlmatrix aund einer nichtnegativen Ganzzahl ieine Zuordnung aus b, die die unterschiedlichen Werte in der ith-Spalte aden Zeilen zuordnet a, die diesen Wert in der ith-Spalte haben.

Sie können davon ausgehen, dass dies iim halboffenen Bereich liegt [0, num_cols(a))(oder [1, num_cols(a)]wenn Sie 1-basierte Indizes verwenden) und dass alle Ganzzahlen innerhalb des für Ihre Sprache darstellbaren Bereichs liegen. Die Ein- und Ausgabe kann auf jede vernünftige Weise erfolgen, sofern sie die grundlegenden Anforderungen der Herausforderung erfüllt (2D-Array -> Zuordnung von Ints zu 2D-Arrays von Ints). Solange die Zuordnung klar und konsistent ist, müssen die Schlüssel nicht in die Ausgabe einbezogen werden.

Beispiele

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

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Mego
quelle
1
Sandbox
Mego
Nur um zu überprüfen, kann das Mapping eine Funktion sein? Mir ist nicht bekannt, ob dies eine Standardeinstellung ist, aber es scheint etwas zu sein, das Sie zulassen möchten.
FryAmTheEggman
@FryAmTheEggman Ja, eine Funktion, die unseren üblichen Anforderungen entspricht, ist zulässig. Die E / A ist äußerst flexibel.
Mego
3
Ich mag dieses E / A-Format sehr, da die Ausgabe die Eingabe nicht in sich selbst enthalten muss. Es ist völlig in Ordnung, eine Funktion zurückzugeben, die über einen Verweis auf die Eingabe zugreift, solange es sich bei der Funktion um eine Zuordnung handelt.
JungHwan Min
@ JungHwanMin Ich bin froh. Ich wollte mit einem sehr losen I / O-Format experimentieren, und es läuft soweit gut
Mego

Antworten:

4

Oktave , 24 Bytes

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

Probieren Sie es online!

Dadurch wird eine anonyme Funktion erstellt, die eine Matrix zurückgibt, deren Zeilen den Kriterien entsprechen. Oktave indiziert Arrays bei 1, nicht bei Null, und Zeilen einer Matrix werden durch ein getrennt ;.

Matrizen sind das, was Octave am besten kann - und zwar so gut, dass diese Herausforderung mit reiner Syntax und ohne eingebaute Funktionen gelöst werden kann.

Erläuterung

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

Wolfram Language (Mathematica) , 21 Byte

#~GroupBy~Extract@#2&

1-indiziert. Gibt eine AssociationZuordnung zurück.

Probieren Sie es online!

Dies ist ein seltener Fall, in dem eine längere Funktion ( Extract) die Anzahl der Bytes verringert (die kürzere Funktion ist Partoder [[ ... ]]), weil Extractsie Curry erzeugen kann. Das Ergebnis ist diese äußerst übersichtliche Lösung mit zwei Funktionen.

Erläuterung

Extract@#2

Funktion, die das <second input>th-Element extrahiert .

#~GroupBy~ ...

Gruppieren Sie die <first input>in Listen, die unterschiedlichen Schlüsseln zugeordnet sind <above function>[element].

JungHwan min
quelle
2

Sauber , 40 Bytes

import StdEnv

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

Probieren Sie es online!

Ein Lambda ( :: Int [[Int]] Int -> [[Int]]), bei dem eine teilweise Anwendung nur der ersten beiden Argumente eine Zuordnung zum dritten Argument ergibt.

Οurous
quelle
2

J , 16 Bytes

-3 Bytes dank FrownyFrog!

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

Probieren Sie es online!

Erläuterung:

Ein dyadisches Verb, das ials linkes und aals rechtes Argument verwendet wird .

] ist das richtige argument, a

{"1Findet die Zahlen in ider Spalte in jeder Zeile

</. Kästchen Gruppen aus dem rechten Argument, ausgewählt durch die Tasten, bereitgestellt durch das linke

~.@[ findet die eindeutigen Schlüssel

;"0 verknüpft die Schlüssel mit den ausgewählten Gruppen

Galen Ivanov
quelle
;"0statt ,:spart 3
FrownyFrog
@FrownyFrog Natürlich! Ich denke, ich habe es versucht, aber anscheinend nicht den richtigen Weg.
Galen Ivanov
2

jq, 100 Bytes

Verwendet ein Objekt für die Ausgabe, verwendet ein Befehlszeilenargument $fund ein Array für die Standardeingabe

([.[]|.[$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
quelle
Ist dies die Sprache, die Sie verwenden?
Freitag,
1

Proton , 29 Bytes

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

Probieren Sie es online!

-3 Bytes dank Mr. Xcoder mit Currying und filter(TBH Ich bin ein bisschen überrascht, dass filtertatsächlich funktioniert hat)

HyperNeutrino
quelle
Durch das Einrichten und Verwendenfilter sparen Sie drei Bytes.
Mr. Xcoder
@ Mr.Xcoder Cool, danke: D
HyperNeutrino
0

JavaScript (Node.js) , 29 Byte

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

Probieren Sie es online!

Aktualisiert jetzt, da ich die losen Ausgabeanforderungen erkenne. Dabei wird Curry als Golftechnik verwendet und es wird eine Funktion zurückgegeben, die eine Eingabe entgegennimmt nund diese den richtigen Arrays zuordnet.

NinjaBearMonkey
quelle
0

Gelee , 5 Bytes

ịⱮ⁹¹ƙ

Probieren Sie es online!

Lässt die Tasten aus, sollte aber klar sein.

Argument 1: i + 1
Argument 2: a

Erik der Outgolfer
quelle
Ich denke nicht, dass dies als Zuordnung ohne die Schlüssel qualifizieren würde.
Dennis
@Dennis Hm, ich hatte in den Kommentaren dazu gefragt und OP gesagt, wir können die Schlüssel weglassen (genau das, was ich in der Frage bearbeitet habe), und ich hatte diese Lösung auch dort verlinkt (sollte vielleicht nicht so früh markiert sein ... ). Ich habe die Schlüssel in eine frühere Überarbeitung dieser Antwort aufgenommen (auf eine Antwort gewartet), also werde ich einfach einen weiteren Kommentar posten und sehen, was OP sagt.
Erik der Outgolfer
0

Java 10, 135 64 Bytes

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

Gibt eine Function<Integer, List<int[]>>akzeptierende Ganzzahleingabe zurück n, die eine Liste von Arrays (Matrixzeilen) zurückgibt, bei denen die i'ten Werte gleich den angegebenen sind n.

Probieren Sie es online aus.

Erläuterung:

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
quelle