การจัดกลุ่มข้อมูลอาร์เรย์


13

ให้เมทริกซ์จำนวนเต็มaและจำนวนเต็มไม่ใช่ค่าลบiเอาท์พุทการแมปbที่แมปค่าที่แตกต่างในiคอลัมน์ th ของaกับแถวของaผู้ที่มีค่านั้นในiคอลัมน์ th

คุณอาจสันนิษฐานว่าiอยู่ในช่วงเปิดครึ่ง[0, num_cols(a))(หรือ[1, num_cols(a)]ถ้าคุณเลือกที่จะใช้ดัชนีที่อิง 1) และจำนวนเต็มทั้งหมดอยู่ในช่วงที่สามารถแทนได้สำหรับภาษาของคุณ อินพุตและเอาท์พุตอาจทำได้ในลักษณะที่สมเหตุสมผลตราบใดที่มันตอบสนองความต้องการขั้นพื้นฐานของความท้าทาย (การทำแผนที่สองมิติ -> การทำแผนที่จาก int ไปยังอาร์เรย์ 2 มิติของ 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 นี้มากเพราะเอาต์พุตไม่จำเป็นต้องมีอินพุตในตัวเอง เป็นการดีที่จะส่งคืนฟังก์ชันที่เข้าถึงอินพุตโดยการอ้างอิงตราบใดที่ฟังก์ชันนั้นเป็นการจับคู่
JungHwan Min

@JungHwanMin ฉันดีใจ ฉันต้องการที่จะทดสอบด้วยรูปแบบ I / O ที่หลวมมากและมันไปได้ดีจนถึงวันนี้
Mego

คำตอบ:


4

อ็อกเทฟ 24 ไบต์

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

ลองออนไลน์!

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่ระบุชื่อที่ส่งกลับเมทริกซ์ซึ่งแถวนั้นตรงกับเกณฑ์ อาร์เรย์ดัชนีคู่ที่ 1, ;ไม่เป็นศูนย์และแถวของเมทริกซ์จะถูกแยกออกโดย

เมทริกซ์คือสิ่งที่อ็อฟเทฟทำได้ดีที่สุด - จริง ๆ แล้วความท้าทายนี้สามารถแก้ไขได้โดยใช้ไวยากรณ์ที่บริสุทธิ์ไม่มีฟังก์ชันในตัว

คำอธิบาย

@(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หรือ[[ ... ]]) เพราะExtractสามารถทำแกงได้ ผลลัพธ์คือโซลูชันสองฟังก์ชันที่กระชับที่สุด

คำอธิบาย

Extract@#2

ฟังก์ชั่นที่แยก<second input>องค์ประกอบที่

#~GroupBy~ ...

กลุ่ม บริษัทเป็นรายการที่เกี่ยวข้องกับคีย์ที่แตกต่างกัน<first input><above function>[element]




2

J , 16 ไบต์

-3 ไบต์ขอบคุณ FrownyFrog!

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

ลองออนไลน์!

คำอธิบาย:

คำกริยา dyadic ใช้iเป็นอาร์กิวเมนต์ซ้ายและaขวาหนึ่ง

] เป็นอาร์กิวเมนต์ที่ถูกต้อง a

{"1ค้นหาตัวเลขที่iคอลัมน์ th ของแต่ละแถว

</. กลุ่มกล่องจากอาร์กิวเมนต์ด้านขวาที่เลือกโดยคีย์ที่มีให้โดยด้านซ้าย

~.@[ ค้นหาคีย์ที่ไม่ซ้ำกัน

;"0 เชื่อมโยงกุญแจไปยังกลุ่มที่เลือก


;"0แทนการ,:บันทึก 3
FrownyFrog

@FrownyFrog แน่นอน! ฉันคิดว่าฉันลองแล้ว แต่ดูเหมือนจะไม่ใช่วิธีที่ถูกต้อง
Galen Ivanov

2

jq, 100 ไบต์

ใช้วัตถุสำหรับการส่งออกรับอาร์กิวเมนต์บรรทัดคำสั่ง$fบวกอาร์เรย์ในอินพุตมาตรฐาน

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

คือนี้ภาษาที่คุณกำลังใช้?
Οurous

2

R , 79 55 ไบต์

function(a,i)for(z in unique(a[,i]))print(a[a[,i]==z,])

ลองออนไลน์!

24 ไบต์ถูกโกนโดย @JayCe


บันทึกไบต์บางส่วนโดยแยกขึ้นโดยตรง คุณสามารถเพิ่ม a cat(z)ก่อนการพิมพ์เพื่อพิมพ์คีย์ (ฉันไม่ชัดเจนหากจำเป็นต้องใช้)
JayCe


1

โปรตอน , 29 ไบต์

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

ลองออนไลน์!

-3 ไบต์ขอบคุณ Mr. Xcoder ที่ใช้การแกงและfilter(TBH ฉันประหลาดใจที่filterใช้งานได้จริง)


การ currying และการใช้filterช่วยให้คุณประหยัดสามไบต์
Mr. Xcoder

@ Mr.Xcoder Cool ขอบคุณ: D
HyperNeutrino

0

JavaScript (Node.js)ขนาด 29 ไบต์

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

ลองออนไลน์!

อัปเดตทันทีที่ฉันตระหนักถึงข้อกำหนดเอาต์พุตหลวม สิ่งนี้ใช้การ currying เป็นเทคนิคการเล่นกอล์ฟและยังส่งคืนฟังก์ชันที่รับอินพุตnและแผนที่ไปยังอาร์เรย์ที่เหมาะสม


0

เยลลี่ 5 ไบต์

ịⱮ⁹¹ƙ

ลองออนไลน์!

ละเว้นคีย์ แต่ควรมีความชัดเจน

อาร์กิวเมนต์ 1: i + 1
อาร์กิวเมนต์ 2: a


ฉันไม่คิดว่านี่จะเป็นคุณสมบัติในการทำแผนที่หากไม่มีกุญแจ
เดนนิส

@Dennis Hm ฉันได้ถามความคิดเห็นเกี่ยวกับเรื่องนี้และ OP บอกว่าเราสามารถละเว้นคีย์ได้ (เหมือนกับที่ฉันได้แก้ไขในคำถาม) และฉันเชื่อมโยงโซลูชันนี้ที่นั่นด้วย (อาจไม่ควรตั้งค่าให้เร็วเกินไป ... ) ฉันใส่รหัสในการแก้ไขคำตอบก่อนหน้านี้ (รอคำตอบ) ดังนั้นฉันจะเพียงแค่โพสต์ความคิดเห็นอื่นแล้วเราจะเห็นสิ่งที่ OP พูด
Erik the Outgolfer

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ซึ่งจะส่งกลับรายการของอาร์เรย์ (เมทริกซ์แถว) ที่'ค่าเท่ากับวันที่กำหนดin

ลองออนไลน์

คำอธิบาย:

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.