Nhóm dữ liệu mảng


13

Cho một ma trận số nguyên avà một số nguyên không âm i, xuất ra ánh xạ ánh xạ bcác giá trị riêng biệt trong icột thứ ađến các hàng acó giá trị đó trong icột thứ.

Bạn có thể cho rằng đó ilà trong phạm vi nửa mở [0, num_cols(a))(hoặc [1, num_cols(a)]nếu bạn chọn sử dụng các chỉ số dựa trên 1) và tất cả các số nguyên nằm trong phạm vi có thể biểu thị cho ngôn ngữ của bạn. Đầu vào và đầu ra có thể được thực hiện theo bất kỳ cách hợp lý nào, miễn là nó thỏa mãn các yêu cầu cơ bản của thử thách (mảng 2D -> ánh xạ từ ints sang mảng 2D của ints). Miễn là ánh xạ rõ ràng và nhất quán, các phím không cần được đưa vào đầu ra.

Ví dụ

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

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.



Chỉ cần kiểm tra, ánh xạ có thể là một chức năng? Tôi không biết nếu đây là một mặc định, nhưng có vẻ như một cái gì đó bạn dự định cho phép.
FryAmTheEggman

@FryAmTheEggman Có, một chức năng đáp ứng các yêu cầu thông thường của chúng tôi được cho phép. I / O cực kỳ linh hoạt.
Mego

3
Tôi rất thích định dạng I / O này vì đầu ra thực sự không cần phải chứa đầu vào. Hoàn toàn ổn khi trả về một hàm truy cập đầu vào bằng tham chiếu miễn là hàm đó là ánh xạ.
JungHwan Min

@JungHwanMin Tôi rất vui. Tôi muốn thử nghiệm với định dạng I / O rất lỏng lẻo và nó sẽ tiến triển tốt cho đến nay
Mego

Câu trả lời:


4

Octave , 24 byte

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

Hãy thử trực tuyến!

Điều này tạo ra một hàm ẩn danh trả về một ma trận có các hàng khớp với các tiêu chí. Octave lập chỉ mục các mảng ở 1, không phải 0 và các hàng của ma trận được phân tách bằng a ;.

Ma trận là những gì Octave thực hiện tốt nhất, trên thực tế, rằng thách thức này có thể được giải quyết bằng cú pháp thuần túy, không có các hàm dựng sẵn.

Giải trình

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

Ngôn ngữ Wolfram (Mathicala) , 21 byte

#~GroupBy~Extract@#2&

1 chỉ mục. Trả về một Associationánh xạ.

Hãy thử trực tuyến!

Đây là một trường hợp hiếm hoi trong đó hàm dài hơn ( Extract) làm giảm số byte (hàm ngắn hơn Parthoặc [[ ... ]]) vì Extractcó thể cà ri. Kết quả là giải pháp hai chức năng cực kỳ súc tích này.

Giải trình

Extract@#2

Chức năng trích xuất <second input>phần tử thứ.

#~GroupBy~ ...

Nhóm các <first input>danh sách liên kết với các khóa riêng biệt <above function>[element].



2

Sạch , 40 byte

import StdEnv

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

Hãy thử trực tuyến!

Một lambda ( :: Int [[Int]] Int -> [[Int]]) trong đó một ứng dụng một phần của chỉ hai đối số đầu tiên đưa ra ánh xạ trên đối số thứ ba.


2

J , 16 byte

-3 byte nhờ FrownyFrog!

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

Hãy thử trực tuyến!

Giải trình:

Một động từ dyadic, lấy ilàm đối số bên trái của nó và anhư là một bên phải của nó.

] là lý lẽ đúng a

{"1tìm các số ở icột thứ trên mỗi hàng

</. hộp nhóm từ đối số bên phải, được chọn bởi các phím, được cung cấp bởi bên trái

~.@[ tìm các phím duy nhất

;"0 liên kết các phím với các nhóm được chọn


;"0thay vì ,:tiết kiệm 3
FrownyFrog

@FrownyFrog Tất nhiên rồi! Tôi nghĩ rằng tôi đã thử nó, nhưng dường như không đúng cách.
Galen Ivanov

2

jq, 100 byte

sử dụng một đối tượng cho đầu ra, lấy một đối số dòng lệnh $fcộng với một mảng trên đầu vào tiêu chuẩn

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

khử mùi:

.fieldnum as $field |
.input as $input |
([$input[] | .[$field]] | unique) as $categories |
[
    $categories[] as $category |
    {
        ($category | tostring) :
            ([$input[] | [select(.[$field]==$category)]] | add)
    }
] | add

này ngôn ngữ mà bạn đang sử dụng?
Οurous




0

JavaScript (Node.js) , 29 byte

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

Hãy thử trực tuyến!

Cập nhật bây giờ tôi nhận ra các yêu cầu đầu ra lỏng lẻo. Điều này sử dụng currying như một kỹ thuật chơi gôn và nó cũng trả về một hàm lấy đầu vào nvà ánh xạ tới các mảng thích hợp.


0

Thạch , 5 byte

ịⱮ⁹¹ƙ

Hãy thử trực tuyến!

Bỏ qua các phím, nhưng nên rõ ràng.

Đối số 1: i + 1
Đối số 2: a


Tôi không nghĩ rằng điều này sẽ đủ điều kiện như một bản đồ mà không có các phím.
Dennis

@Dennis Hừm, tôi đã hỏi trong các bình luận về nó và OP nói rằng chúng tôi có thể bỏ qua các khóa (chính xác là những gì tôi đã chỉnh sửa trong câu hỏi) và tôi cũng đã liên kết giải pháp này ở đó (có lẽ không nên gắn cờ sớm như vậy ... ). Tôi đã bao gồm các khóa trong bản sửa đổi trước của câu trả lời này (chờ câu trả lời), vì vậy tôi sẽ chỉ đăng một bình luận khác và hãy xem OP nói gì.
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);}}

Trả về một Function<Integer, List<int[]>>chấp nhận đầu vào số nguyên n, trả về Danh sách các mảng (hàng ma trận) trong đó các igiá trị 'bằng với giá trị đã cho n.

Hãy thử trực tuyến.

Giải trình:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.