Pembalikan daftar daftar indeks

14

Terinspirasi oleh pos StackOverflow ini .

pengantar

Tugas Bob adalah membuat spreadsheet dan mengaturnya. Cara dia mengaturnya diketahui sangat sedikit kecuali untuk Bob, tetapi dia membuat daftar masing-masing spreadsheet yang termasuk dalam kelompok yang sama. Ada banyak data dalam spreadsheet yang ia buat, tetapi hanya ada satu data yang sedang kami lihat saat ini: Jumlah hari antara hari ia memulai pekerjaan ini dan hari ia membuat spreadsheet. Hari pertama ia membuat dua spreadsheet, mencatat keduanya sebagai 0dan mengurutkannya ke lokasi yang tepat.

Sekarang, bosnya meminta ulasan tentang jenis spreadsheet apa yang terjadi setiap hari, dan tugas Anda untuk menulis beberapa kode yang akan mencari tahu apa yang terjadi pada Bob; dia memiliki terlalu banyak spreadsheet untuk melakukannya dengan tangan.

Memasukkan

Info Bob yang ia berikan kepada Anda datang dalam bentuk array bergerigi (0-atau-1) di mana setiap datum berbentuk x = a[i][j]. aadalah apa yang saya sebut array bergerigi itu sendiri, iadalah jenis spreadsheet, dan xmerupakan tanggal array dibuat. jtidak penting.

Tugas

Diberikan array bergerigi dari hari pembuatan spreadsheet yang disusun berdasarkan jenisnya, kembalikan array bergerigi dari tipe spreadsheet yang diatur oleh hari pembuatan spreadsheet.

Contohnya

Bob tidak akan hanya meninggalkan Anda dengan data abstrak ini. Dia memberi saya bagian dari beberapa spreadsheet untuk membantu Anda mencari tahu apa yang seharusnya terjadi.

Input contoh (0-diindeks):

a = [
[3,2,5,0], # Bob doesn't necessarily sort his lists
[1,3],
[2,1,0,4],
[4,5,3],
[6,6]
]

Contoh output (dengan komentar, yang tentu saja tidak diperlukan):

output = [
[0,2] # On day 0, Bob made one type 0 and one type 2 spreadsheet
[1,2] # On day 1, Bob made one type 1 and one type 2 spreadsheet
[0,2] # On day 2, Bob made one type 0 and one type 2 spreadsheet
[0,1,3] # On day 3, Bob made one type 0, one type 1, and one type 3 spreadsheet
[2,3] # On day 4, Bob made one type 2 and one type 3 spreadsheet
[0,3] # On day 5, Bob made one type 0 and one type 3 spreadsheet   
[4,4] # On day 6, Bob made two type 4 spreadsheets
]

Perhatikan bahwa Bob tidak selalu membuat dua spreadsheet setiap hari, dan hasilnya mungkin juga bergerigi. Tapi dia selalu membuat setidaknya satu spreadsheet setiap hari, jadi outputnya tidak perlu mengandung array kosong - walaupun jika output Anda memiliki array kosong di akhir, Anda tidak perlu menghapusnya.

Lebih banyak kasus uji:

[[3,5,6,2],[0,0,0],[1,0,3,4]] -> [[1,1,1,2],[2],[0],[0,2],[2],[0],[0]]
[[-1]] -> Undefined behavior, as all input numbers will be non-negative integers. 
[[0],[0],[],[0]] -> [[0,1,3]]

Daftar bagian dalam output tidak perlu disortir.

Seperti biasa, tidak ada celah standar, dan tentu saja kode terpendek menang.

(Karena ini adalah pertanyaan pertama saya, beri tahu saya apa pun yang dapat saya lakukan untuk memperbaikinya.)

Steven H.
sumber
Mungkinkah Bob membuat spreadsheet dari beberapa jenis?
xnor
1
@xnor Tidak, Bob akan selalu membuat spreadsheet setiap hari. Spreadsheet ini sangat penting untuk pengoperasian perusahaan sehingga jika Bob harus sakit, orang lain sementara diposkan untuk membuat spreadsheet hari itu dan Bob mengorganisasikannya keesokan paginya sebelum membuat spreadsheet sendiri.
Steven H.
1
@ Dennis Saya sedikit lelah ketika menyatukan contoh itu, dan saya kira itu menunjukkan. : P Tetap (keduanya)!
Steven H.
6
Terlihat bagus. Ini adalah tantangan yang sangat menyenangkan, terutama mengingat ini adalah tantangan pertama Anda. :) Btw, jika Anda tidak sadar, kami memiliki kotak pasir di mana komunitas dapat memberikan umpan balik sebelum "ditayangkan".
Dennis
1
Saya mengedit dalam pernyataan berdasarkan komentar Anda " Tidak, Bob akan selalu membuat spreadsheet setiap hari ", tetapi sekarang setelah saya mencoba mengoptimalkan jawaban saya sendiri, saya menyadari bahwa itu mungkin lebih ketat daripada yang Anda maksudkan. Apakah membuntuti array kosong diizinkan? Misal bisa [[0 0]]memberi output [[0 0] []]?
Peter Taylor

Jawaban:

5

Pyth, 13 byte

eMM.ghkSs,RVU

         ,RV      vectorized right map of pair, over:
            UQ      [0, …, len(input) - 1] and
              Q     input
                  (this replaces each date with a [date, type] pair)
        s         concatenate
       S          sort
   .ghk           group by first element (date)
eMM               last element (type) of each sublist

Cobalah online

Anders Kaseorg
sumber
4

Brachylog , 28 byte

:1f.
cdo:Im:?:2f.
t:.m:Im~h?

Penjelasan

  • Predikat utama, Input ( ?) = daftar daftar

    :1f.              Find all valid outputs of predicate 1 with ? as input
    
  • Predikat 1:

    c                 Concatenate the list of lists into a single list
     do               Remove duplicates and sort
       :Im            Take the Ith element of that sorted list
          :?:2f.      Find all valid outputs of predicate 2 with [Element:?] as input
    
  • Predikat 2:

    t:.m              Take the (Output)th element of the list of lists
        :Im           Take the Ith element of that list
           ~h?        This element is the element of the input [Element:List of lists]
    
Fatalisasi
sumber
3

JavaScript (ES6), 58 byte

a=>a.map((b,i)=>b.map(j=>(r[j]=r[j]||[]).push(i)),r=[])&&r
Neil
sumber
3

CJam ( 30 29 byte)

Mq~{W):W;{:X)Me]_X=W+X\t}/}/`

Demo online

Anehnya lebih pendek untuk di-hack Wdaripada menggunakan ee, terutama karena saya ingin indeks berakhir dalam variabel. e]menyimpan dua byte lebih dulu dari menemukan elemen maksimum mdan menginisialisasi array dari m+1array kosong.

Terima kasih kepada Martin untuk penghematan satu byte dengan menyimpan nilai Xalih-alih menyulapnya di tumpukan.

NB Jika membuntuti array kosong diizinkan, ada pendekatan alternatif 29 byte dengan alih-alih menginisialisasi array hari kosong sebanyak ada spreadsheet:

q~_e_,Ma*\{W):W;{_2$=W+t}/}/`
Peter Taylor
sumber
3

CJam, 20 byte

Terima kasih kepada Peter Taylor karena mengizinkan saya mendasarkan kode ini pada solusinya dan menghemat 3 byte.

{ee::f{S*\+S/}:~:.+}

Blok tanpa nama yang mengharapkan input di atas tumpukan dan menggantinya dengan output.

Uji di sini.

Penjelasan

ee    e# Enumerate the input. E.g. if the input is 
      e#   [[3 5 6 2] [0 0 0] [1 0 3 4]]
      e# this gives:
      e#   [[0 [3 5 6 2]] [1 [0 0 0]] [2 [1 0 3 4]]]
::f{  e# The exact details of how this works are a bit tricky, but in effect
      e# this calls the subsequent block once for every spreadsheet and
      e# its correspond index, so the first time we'll have 0 and 3 on the
      e# stack, the next time 0 5, and at the last iteration 2 and 4.
      e# Note that this is a map operation, so we'll end up with an array
      e# on the stack.
  S*  e#   So the stack holds [... index date] now. We start by creating
      e#   a string of 'date' spaces, so "   " on the first iteration.
  \+  e#   We swap this with the index and append the index.
  S/  e#   Now we split this thing on spaces, which gives us 'date' empty
      e#   lists and a list containing the index, e.g. [[] [] [] [0]].
}
:~    e# This flattens the first level of the result, so that we get a list
      e# of all those lists we just created. This is simply one list for
      e# every spreadsheet with its type in the last element.
:.+   e# Finally we fold pairwise concatenation over this list. All the 
      e# empty lists won't affect the result so we'll just end up with all
      e# the types in lists for the correct date.
Martin Ender
sumber
2

Python 2, 82 byte

r=[];i=0
for t in input():
 for v in t:r+=[()]*-(~v+len(r));r[v]+=i,
 i+=1
print r

Uji di Ideone .

Dennis
sumber
2

Mathematica, 35 byte

Table[#&@@@#~Position~i,{i,Max@#}]&

Fungsi tanpa nama yang menerima dan mengembalikan daftar yang acak-acakan. Menggunakan indeks berbasis 1.

Untungnya Maxsecara otomatis meratakan semua inputnya, jadi ini membuat kami mendapatkan indeks hari terakhir meskipun inputnya adalah daftar acak-acakan. Kami kemudian hanya menghitung daftar #&@@@#~Position~iuntuk indeks sepanjang hari i. Ungkapan ini sendiri menemukan posisi idi dalam daftar kasar (kembali sebagai array indeks pada kedalaman berturut-turut), sehingga nilai yang kita inginkan adalah nilai pertama dari masing-masing daftar tersebut. #&@@@adalah trik standar bermain golf untuk mengambil elemen pertama dari setiap sublist, dengan menerapkan #&ke masing-masing sublists, yang merupakan fungsi tanpa nama yang mengembalikan argumen pertamanya.

Atau, kita dapat mendefinisikan operator unary untuk byte-count yang sama (dengan asumsi file sumber yang disandikan ISO 8859-1):

±n_:=#&@@@n~Position~#&~Array~Max@n
Martin Ender
sumber
2

Java, 314 byte

int[][]f(int[][]n){int w=0;Map<Integer,List<Integer>>m=new TreeMap<>();for(int i=0;i<n.length;i++)for(Integer x:n[i]){if(m.get(x)==null)m.put(x,new ArrayList<>());m.get(x).add(i);w=x>w?x:w;}int[][]z=new int[w+1][];for(int i=0,j;i<w+1;i++){z[i]=new int[m.get(i).size()];j=0;for(int x:m.get(i))z[i][j++]=x;}return z;

Terperinci

public static Integer[][] f(Integer[][]n)
{
    int w=0;
    Map<Integer,List<Integer>>m=new TreeMap<>();

    for(int i=0;i<n.length;i++)
    {
        for(Integer x : n[i])
        {
            if(m.get(x)==null) m.put(x,new ArrayList<Integer>());
            m.get(x).add(i);
            w=x>w?x:w;
        }
    }

    Integer[][]z=new Integer[w+1][];
    for(int i=0,j; i<w+1; i++)
    {
        z[i]=new Integer[m.get(i).size()];
        j=0;for(Integer x : m.get(i))z[i][j++]=x;
    }

    return z;
}
Khaled.K
sumber
1
Apakah Anda benar-benar membutuhkan Map?
Leaky Nun
0

Perl 5, 48 byte

Subrutin:

{for$i(0..@_){map{push@{$b[$_]},$i}@{$_[$i]}}@b}

Lihat dalam aksi seperti ini:

perl -e'print "@$_$/" for sub{for$i(0..@_){map{push@{$b[$_]},$i}@{$_[$i]}}@b}->([3,2,5,0],[1,3],[2,1,0,4],[4,5,3],[6,6])'
msh210
sumber