Đảo ngược danh sách các danh sách các chỉ số


14

Lấy cảm hứng từ bài viết StackOverflow này .

Giới thiệu

Công việc của Bob là tạo bảng tính và sắp xếp chúng. Cách anh ta tổ chức chúng được biết đến rất ít ngoại trừ Bob, nhưng anh ta tạo ra một danh sách từng bảng tính nằm trong cùng một nhóm. Có một loạt dữ liệu trong bảng tính mà anh ta tạo ra, nhưng chỉ có một dữ liệu mà chúng tôi đang xem ngay bây giờ: Số ngày giữa ngày anh ta bắt đầu công việc này và ngày anh ta tạo ra bảng tính. Ngày đầu tiên anh ta tạo ra hai bảng tính, ghi chú cả hai 0và sắp xếp chúng vào vị trí thích hợp của chúng.

Bây giờ, ông chủ của anh ta đang yêu cầu xem xét lại các loại bảng tính đã xảy ra mỗi ngày và công việc của bạn là viết một số mã sẽ tìm ra điều đó cho Bob; anh ta có quá nhiều bảng tính để làm điều đó bằng tay.

Đầu vào

Thông tin của Bob mà anh ấy cung cấp cho bạn xuất hiện dưới dạng một mảng răng cưa (được lập chỉ mục 0 hoặc 1) trong đó mỗi mốc dữ liệu có dạng x = a[i][j]. alà cái mà tôi gọi là mảng răng cưa, ilà loại bảng tính và xlà ngày mảng được tạo. jlà không quan trọng.

Nhiệm vụ

Đưa ra một mảng lởm chởm của các ngày tạo bảng tính được sắp xếp theo loại của chúng, trả về một mảng các loại bảng tính lởm chởm được tổ chức theo ngày tạo bảng tính.

Ví dụ

Bob sẽ không để lại cho bạn dữ liệu trừu tượng này. Anh ấy đưa cho tôi một tập hợp con của một số bảng tính của anh ấy để giúp bạn tìm ra mọi thứ được cho là gì.

Ví dụ đầu vào (0-index):

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

Ví dụ đầu ra (với lời bình luận, tất nhiên là không bắt buộc):

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
]

Lưu ý rằng Bob không phải lúc nào cũng tạo hai bảng tính mỗi ngày và do đó, đầu ra cũng có thể bị lởm chởm. Nhưng anh ta luôn tạo ra ít nhất một bảng tính mỗi ngày, do đó, đầu ra sẽ không bao giờ cần chứa các mảng trống - mặc dù nếu đầu ra của bạn có các mảng trống ở cuối, bạn không cần phải loại bỏ chúng.

Nhiều trường hợp thử nghiệm:

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

Danh sách bên trong của đầu ra không cần phải được sắp xếp.

Như mọi khi, không có sơ hở tiêu chuẩn, và tất nhiên mã ngắn nhất sẽ thắng.

(Vì đây là câu hỏi đầu tiên của tôi, xin vui lòng cho tôi biết bất cứ điều gì tôi có thể làm để cải thiện nó.)


Bob có thể làm cho không có bảng tính của một số loại?
xnor

1
@xnor Không, Bob sẽ luôn tạo bảng tính mỗi ngày. Các bảng tính này rất quan trọng đối với hoạt động của công ty đến nỗi nếu Bob phải gọi ốm, một người khác tạm thời được đăng để tạo bảng tính ngày hôm đó và Bob tổ chức chúng vào sáng hôm sau trước khi tạo bảng tính của riêng mình.
Steven H.

1
@Dennis Tôi hơi mệt khi đặt ví dụ đó cùng nhau, và tôi đoán nó đã hiển thị. : P Đã sửa (cả hai)!
Steven H.

6
Trông được. Đây là một thử thách rất hay, đặc biệt là xem đây là lần đầu tiên của bạn. :) Btw, trong trường hợp bạn không biết, chúng tôi có một hộp cát nơi cộng đồng có thể cung cấp phản hồi trước khi "đi vào hoạt động".
Dennis

1
Tôi đã chỉnh sửa trong một tuyên bố dựa trên nhận xét của bạn " Không, Bob sẽ luôn tạo bảng tính mỗi ngày ", nhưng bây giờ tôi đã thử tối ưu hóa câu trả lời của riêng mình Tôi nhận ra rằng nó có thể hạn chế hơn bạn dự định. Là dấu mảng trống được phép? Ví dụ có thể [[0 0]]cho đầu ra [[0 0] []]?
Peter Taylor

Câu trả lời:



5

Bình thường, 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

Dùng thử trực tuyến



4

Brachylog , 28 byte

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

Giải trình

  • Vị ngữ chính, Input ( ?) = danh sách danh sách

    :1f.              Find all valid outputs of predicate 1 with ? as input
    
  • Vị ngữ 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
    
  • Vị ngữ 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]
    


3

JavaScript (ES6), 58 byte

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

3

CJam ( 30 29 byte)

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

Bản demo trực tuyến

Thật kỳ lạ, nó ngắn hơn để hack xung quanh Whơn là sử dụng ee, chủ yếu là vì tôi muốn chỉ mục kết thúc bằng một biến. e]đã lưu hai byte trong lần đầu tiên tìm phần tử tối đa mvà khởi tạo một mảng các mảng m+1trống.

Cảm ơn Martin vì đã tiết kiệm một byte bằng cách lưu trữ một giá trị Xthay vì tung hứng nó xung quanh ngăn xếp.

NB Nếu cho phép các mảng trống được cho phép, có cách tiếp cận 29 byte thay thế bằng cách thay vào đó khởi tạo mảng có nhiều ngày trống như có bảng tính:

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

3

CJam, 20 byte

Cảm ơn Peter Taylor đã cho tôi căn cứ mã này vào giải pháp của anh ấy và tiết kiệm 3 byte.

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

Một khối không tên dự kiến ​​đầu vào trên cùng của ngăn xếp và thay thế nó bằng đầu ra.

Kiểm tra nó ở đây.

Giải trình

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.

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

Kiểm tra nó trên Ideone .


2

Toán học, 35 byte

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

Một chức năng không tên được chấp nhận và trả về một danh sách rách rưới. Sử dụng các chỉ số dựa trên 1.

Rất may Maxtự động làm phẳng tất cả các đầu vào của nó, vì vậy điều này giúp chúng ta có được chỉ số ngày cuối cùng mặc dù đầu vào là một danh sách rách rưới. Sau đó chúng tôi chỉ cần tính toán một danh sách #&@@@#~Position~icho các chỉ số cả ngày i. Biểu thức này tự tìm vị trí ibên trong danh sách rách rưới (trả về dưới dạng một mảng các chỉ số ở độ sâu liên tiếp), vì vậy các giá trị chúng tôi muốn là giá trị đầu tiên của mỗi danh sách đó. #&@@@là một mẹo chơi gôn tiêu chuẩn để lấy phần tử đầu tiên từ mọi danh sách con, bằng cách áp dụng #&cho từng danh sách con đó, đây là một hàm không tên trả về đối số đầu tiên của nó.

Ngoài ra, chúng ta có thể định nghĩa một toán tử đơn nguyên cho cùng một số byte (giả sử tệp nguồn được mã hóa ISO 8859-1):

±n_:=#&@@@n~Position~#&~Array~Max@n

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;

Chi tiết

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;
}

1
Bạn có thực sự cần Map?
Nữ tu bị rò rỉ

0

Perl 5, 48 byte

Một chương trình con:

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

Xem nó trong hành động như thế này:

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])'
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.