配列データのグループ化


13

整数行列aと非負の整数を指定すると、番目の列の個別の値を、その列の値を持つ人の行にiマッピングするマッピングbを出力します。iaai

あなたはそれiが半開の範囲内にある[0, num_cols(a))か(または[1, num_cols(a)]1ベースのインデックスを使用することを選択した場合)、すべての整数が言語の表現可能な範囲内にあると仮定することができます。入力と出力は、チャレンジの基本的な要件(2D配列-> intから2D配列のintへのマッピング)を満たす限り、合理的な方法で実行できます。マッピングが明確で一貫している限り、キーを出力に含める必要はありません。

[[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はい、通常の要件を満たす関数が許可されています。I / Oは非常に柔軟です。
Mego

3
出力には実際に入力を含める必要がないため、このI / O形式が非常に気に入っています。関数がマッピングである限り、参照によって入力にアクセスする関数を返すことはまったく問題ありません。
ジョンファンミン

@JungHwanMin嬉しいです。私は非常に緩やかなI / O形式を試してみたかった、それは今のところ順調に進んだ
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

Wolfram言語(Mathematica)、21バイト

#~GroupBy~Extract@#2&

1インデックス付き。Associationマッピングを返します。

オンラインでお試しください!

これは、カレーが発生する可能性があるため、長い関数(Extract)がバイトカウント(Partまたは短いバイト)を減らすまれなケースです。その結果、この非常に簡潔な2機能ソリューションが実現します。[[ ... ]]Extract

説明

Extract@#2

<second input>th要素を抽出する関数。

#~GroupBy~ ...

<first input>を個別のキーに関連付けられたリストにグループ化します<above function>[element]




2

J、16バイト

FrownyFrogのおかげで-3バイト!

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

オンラインでお試しください!

説明:

i左の引数とa右の引数としての二項動詞。

] は正しい議論です a

{"1i各行のth列で数値を検索します

</. ボックスでグループ化され、右側の引数から選択され、左側のキーで選択

~.@[ 一意のキーを見つけます

;"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

あるこれはあなたが使用している言語?
18年





0

ゼリー、5バイト

ịⱮ⁹¹ƙ

オンラインでお試しください!

キーを省略しますが、明確にする必要があります。

引数1:i + 1
引数2:a


これは、キーなしのマッピングとして適格とは思わない。
デニス

@Dennis Hm、私はそれについてのコメントで尋ねましたが、OPはキーを省略することができます(正確に質問に編集したもの)、そしてそこにこのソリューションをリンクしました(おそらく早めにフラグを立てるべきではなかったでしょう... )。この回答の以前のリビジョン(回答を待っている)にキーを含めたので、別のコメントを投稿して、OPのコメントを見てみましょう。
エリックアウトゴルファー

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.