Dizi Verilerini Gruplama


13

Bir tamsayı matrisi ave negatif olmayan bir tamsayı verildiğinde , th sütunundaki farklı değerleri th sütununda bu değere sahip olan satırlarla eşleyen ibir eşleme çıktılayın .biaai

Bunun iyarı açık aralıkta olduğunu [0, num_cols(a))(veya [1, num_cols(a)]1 tabanlı indeksleri kullanmayı seçerseniz) ve tüm tam sayıların diliniz için temsil edilebilir aralıkta olduğunu varsayabilirsiniz . Giriş ve çıkış, zorluğun temel gereksinimlerini karşıladığı sürece makul bir şekilde yapılabilir (2D dizi -> int'lerden 2D int dizilerine eşleme). Eşleme açık ve tutarlı olduğu sürece, tuşların çıktıya dahil edilmesi gerekmez.

Örnekler

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

Bu , bu yüzden bayttaki en kısa cevap kazanır.



Sadece kontrol etmek için haritalama bir fonksiyon olabilir mi? Bunun bir varsayılan olup olmadığının farkında değilim, ancak izin vermeyi düşündüğünüz bir şey gibi görünüyor.
FryAmTheEggman

@FryAmTheEggman Evet, her zamanki gereksinimlerimizi karşılayan bir işleve izin verilir. G / Ç son derece esnektir.
Mego

3
Bu G / Ç biçimini çok seviyorum çünkü çıktının girişi kendi içinde içermesi gerekmiyor. İşlev bir eşleme olduğu sürece girdiye başvuru ile erişen bir işlevi döndürmek tamamen iyidir.
JungHwan Min

@JungHwanMin Memnun oldum. Çok gevşek bir I / O formatını denemek istedim ve şu ana kadar iyi gidiyor
Mego

Yanıtlar:


4

Oktav , 24 bayt

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

Çevrimiçi deneyin!

Bu, satırları ölçütlerle eşleşen bir matris döndüren anonim bir işlev oluşturur. Oktav indeksleri sıfırdan değil 1'de diziler ve bir matrisin satırları a ile ayrılır ;.

Matrisler Octave'ın en iyi yaptığı şeydir - aslında, bu meydan okuma, yerleşik işlevler olmadan saf sözdizimi kullanılarak çözülebilir.

açıklama

@(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 Dili (Mathematica) , 21 bayt

#~GroupBy~Extract@#2&

1 endeksli. Bir Associationeşleme döndürür .

Çevrimiçi deneyin!

Bu, daha uzun bir işlevin ( Extract) bayt sayısını azalttığı (daha kısa olanı Partveya [[ ... ]]) Extractköri oluşturabildiği nadir bir durumdur . Sonuç, bu son derece özlü iki işlevli çözümdür.

açıklama

Extract@#2

Bu <second input>öğeyi ayıklayan işlev .

#~GroupBy~ ...

Grup <first input>farklı tuşları ile ilişkili listeler halinde <above function>[element].



2

Temiz , 40 bayt

import StdEnv

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

Çevrimiçi deneyin!

:: Int [[Int]] Int -> [[Int]]Sadece ilk iki argümanın kısmi bir uygulamasının üçüncü argüman üzerinde bir eşleme verdiği lambda ( ).


2

J , 16 bayt

FrownyFrog sayesinde -3 bayt!

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

Çevrimiçi deneyin!

Açıklama:

iSol argüman aolarak ve sağ argüman olarak alan bir fiil .

] doğru argüman, a

{"1iher satırdaki inci sütundaki sayıları bulur

</. sol argüman tarafından sağlanan, anahtarlar tarafından seçilen sağ argümandaki kutuları gruplandırır

~.@[ benzersiz anahtarları bulur

;"0 tuşları seçilen gruplara bağlar


;"0yerine ,:3 kaydeder
FrownyFrog

@FrownyFrog Elbette! Sanırım denedim, ama görünüşe göre doğru yol değil.
Galen Ivanov

2

jq, 100 bayt

çıktı için bir nesne kullanır, bir komut satırı argümanı $fve standart girdi üzerinde bir dizi alır

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

gizlemesi:

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

bu kullandığınız dil?
Οurous




0

JavaScript (Node.js) , 29 bayt

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

Çevrimiçi deneyin!

Gevşek çıktı gereksinimlerini fark ettiğim için şimdi güncellendi. Bu, köpürmeyi bir golf tekniği olarak kullanır ve ayrıca bir girdi alan nve bunu uygun dizilere eşleyen bir işlev döndürür .


0

Jöle , 5 bayt

ịⱮ⁹¹ƙ

Çevrimiçi deneyin!

Anahtarları atlar, ancak açık olmalıdır.

Bağımsız değişken 1: i + 1
Bağımsız değişken 2: a


Bunun anahtarlar olmadan bir eşleme olarak nitelendirileceğini sanmıyorum.
Dennis

@Dennis Hm, bu konuda yorumlarda sormuştum ve OP, anahtarları (tam olarak soruya düzenlediğim şeyi) atlayabileceğimizi ve bu çözümü de orada bağlamış olduğumu söyledi (belki de bu kadar erken işaretlememeliydim ... ). Anahtarları bu cevabın önceki bir revizyonuna ekledim (bir cevap bekliyorum), bu yüzden sadece başka bir yorum göndereceğim ve OP'nin ne dediğini görelim.
Outgolfer Erik

0

Java 10, 135 64 bayt

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

Döndürür Function<Integer, List<int[]>>bir tamsayıdır-giriş kabul ndiziler (matris-satırlar) bir listesini verir i'inci değerleri aşağıda verilmektedir eşit n.

Çevrimiçi deneyin.

Açıklama:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.