Pengelompokan Data Array

13

Diberikan matriks integer adan integer nonnegatif i, menghasilkan pemetaan byang memetakan nilai yang berbeda di ikolom th ake baris ayang memiliki nilai di ikolom th.

Anda dapat berasumsi bahwa iberada dalam kisaran setengah terbuka [0, num_cols(a))(atau [1, num_cols(a)]jika Anda memilih untuk menggunakan indeks berbasis 1), dan bahwa semua bilangan bulat berada dalam kisaran yang dapat direpresentasikan untuk bahasa Anda. Input dan output dapat dilakukan dengan cara yang masuk akal, selama memenuhi persyaratan dasar tantangan (array 2D -> pemetaan dari ints ke array array ints 2D). Selama pemetaannya jelas dan konsisten, kunci tidak perlu dimasukkan dalam output.

Contohnya

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

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Mego
sumber
1
Sandbox
Mego
Hanya untuk memeriksa, apakah pemetaan bisa berfungsi? Saya tidak tahu apakah ini default, tapi sepertinya Anda bermaksud memperbolehkannya.
FryAmTheEggman
@FryAmTheEggman Ya, fungsi yang memenuhi persyaratan biasa kami diizinkan. I / O sangat fleksibel.
Mego
3
Saya suka format I / O ini karena output sebenarnya tidak perlu mengandung input itu sendiri. Tidak apa-apa untuk mengembalikan fungsi yang mengakses input dengan referensi selama fungsinya adalah pemetaan.
JungHwan Min
@JungHwanMin aku senang. Saya ingin bereksperimen dengan format I / O yang sangat longgar, dan sejauh ini berjalan dengan baik
Mego

Jawaban:

4

Oktaf , 24 byte

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

Cobalah online!

Ini menciptakan fungsi anonim yang mengembalikan matriks yang barisnya cocok dengan kriteria. Array indeks oktaf pada 1, bukan nol, dan baris matriks dipisahkan oleh a ;.

Matriks adalah yang terbaik yang dilakukan Octave — dengan sangat baik, sehingga tantangan ini dapat diselesaikan menggunakan sintaksis murni, tanpa fungsi bawaan.

Penjelasan

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

Ruby , 26 byte

->a,i{a.group_by{|x|x[i]}}

Cobalah online!

Kirill L.
sumber
3

Bahasa Wolfram (Mathematica) , 21 byte

#~GroupBy~Extract@#2&

1-diindeks. Mengembalikan Associationpemetaan.

Cobalah online!

Ini adalah kasus yang jarang terjadi di mana fungsi yang lebih panjang ( Extract) mengurangi jumlah byte (yang lebih pendek menjadi Partatau [[ ... ]]) karena Extractdapat kari. Hasilnya adalah solusi dua fungsi yang sangat ringkas ini.

Penjelasan

Extract@#2

Fungsi yang mengekstrak <second input>elemen th.

#~GroupBy~ ...

Kelompokkan <first input>daftar ke dalam yang terkait dengan kunci berbeda <above function>[element].

JungHwan Min
sumber
3

Haskell , 64 60 byte

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

Cobalah online!

Angs
sumber
2

Bersih , 40 byte

import StdEnv

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

Cobalah online!

Sebuah lambda ( :: Int [[Int]] Int -> [[Int]]) di mana aplikasi parsial hanya dari dua argumen pertama memberikan pemetaan pada argumen ketiga.

Suram
sumber
2

J , 16 byte

-3 byte terima kasih kepada FrownyFrog!

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

Cobalah online!

Penjelasan:

Kata kerja diad, dengan iargumen kiri dan argumen akanan.

] adalah argumen yang tepat, a

{"1menemukan angka-angka di ikolom th di setiap baris

</. kotak grup dari argumen kanan, dipilih oleh tombol, disediakan oleh yang kiri

~.@[ menemukan kunci unik

;"0 menautkan kunci ke grup yang dipilih

Galen Ivanov
sumber
;"0bukannya ,:menyimpan 3
FrownyFrog
@FrownyFrog Tentu saja! Saya pikir saya sudah mencobanya, tetapi tampaknya bukan cara yang benar.
Galen Ivanov
2

jq, 100 byte

menggunakan objek untuk output, mengambil argumen baris perintah $fplus array pada input standar

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

dideobfuscated:

.fieldnum as $field |
.input as $input |
([$input[] | .[$field]] | unique) as $categories |
[
    $categories[] as $category |
    {
        ($category | tostring) :
            ([$input[] | [select(.[$field]==$category)]] | add)
    }
] | add
abcq2
sumber
Apakah ini bahasa yang Anda gunakan?
Οurous
1

Python 3 , 45 byte

lambda a,i:lambda n:[r for r in a if r[i]==n]

Cobalah online!

Mengembalikan pemetaan yang direpresentasikan sebagai lambda anonim.

HyperNeutrino
sumber
1

Proton , 29 byte

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

Cobalah online!

-3 byte terima kasih kepada Tn. Xcoder menggunakan currying dan filter(TBH saya agak terkejut karena filterbenar - benar bekerja)

HyperNeutrino
sumber
Menjelajah dan menggunakanfilter menghemat tiga byte.
Tn. Xcoder
@ Mr.Xcoder Cool, terima kasih: D
HyperNeutrino
0

JavaScript (Node.js) , 29 byte

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

Cobalah online!

Diperbarui sekarang setelah saya menyadari persyaratan keluaran yang longgar. Ini menggunakan currying sebagai teknik bermain golf, dan itu juga mengembalikan fungsi yang mengambil input ndan memetakan itu ke array yang tepat.

NinjaBearMonkey
sumber
0

Jeli , 5 byte

ịⱮ⁹¹ƙ

Cobalah online!

Menghilangkan kunci, tetapi harus jelas.

Argumen 1: i + 1
Argumen 2: a

Erik the Outgolfer
sumber
Saya tidak berpikir ini akan memenuhi syarat sebagai pemetaan tanpa kunci.
Dennis
@ Dennis Hm, saya telah bertanya di komentar tentang hal itu dan OP mengatakan kita bisa menghilangkan kunci (persis apa yang saya edit ke dalam pertanyaan), dan saya juga telah menghubungkan solusi ini di sana (mungkin seharusnya tidak ditandai begitu awal ... ). Saya memang memasukkan kunci dalam revisi sebelumnya dari jawaban ini (menunggu jawaban), jadi saya hanya akan mengirim komentar lain dan mari kita lihat apa kata 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);}}

Mengembalikan Function<Integer, List<int[]>>menerima input integer n, yang mengembalikan Daftar array (matriks-baris) di mana nilai ith sama dengan yang diberikann .

Cobalah online.

Penjelasan:

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
sumber