Bộ dữ liệu bằng cách tuần tự từng bước thông qua các mục trong danh sách danh sách


9

Thử thách:

Đưa ra một danh sách các danh sách số nguyên không trống, trả về một danh sách các bộ dữ liệu có dạng sau: Các bộ danh sách đầu tiên bắt đầu với mỗi phần tử của danh sách đầu tiên theo sau là phần tử đầu tiên của mỗi danh sách tiếp theo, do đó, bộ dữ liệu thứ i sẽ là [ith element of first list, first element of second list, ... , first element of last list]. Ví dụ:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => [[1, 4, 7], [2, 4, 7], [3, 4, 7], ...

Sau đó, làm bộ dữ liệu của biểu mẫu [last element of first list, ith element of second list, first element of third list, ..., first element of last list], vì vậy trong ví dụ của chúng tôi sẽ là:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] =>  ..., [3, 4, 7], [3, 5, 7], [3, 6, 7], ...

Tiếp tục với từng danh sách còn lại, cho đến khi bạn nhận được [last element of first list, ..., last element of second to last list, ith element of last list]:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 6, 7], [3, 6, 8], [3, 6, 9]]

Đầu ra đầy đủ như sau:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => 
        [[1, 4, 7], [2, 4, 7], [3, 4, 7], [3, 5, 7], [3, 6, 7], [3, 6, 8], [3, 6, 9]]

Một số nồi hơi cho biện pháp tốt:

  • Nếu bạn muốn đầu vào là danh sách các chuỗi hoặc danh sách các số nguyên dương, thì tốt. Câu hỏi là về thao túng danh sách, không phải về những gì trong danh sách.
  • Đầu vào và đầu ra có thể ở bất kỳ định dạng chấp nhận được .
  • Một chương trình hoặc chức năng đầy đủ được cho phép.
  • Các sơ hở tiêu chuẩn không được phép theo mặc định.
  • Câu hỏi này là mã golf, vì vậy, số byte thấp nhất sẽ thắng.

Ví dụ:

[] => [[]] (or an error, thanks to ngn for correcting the output in this case)

[[1]] => [[1]]

[[1, 2], [3, 4], [5]] => [[1, 3, 5], [2, 3, 5], [2, 4, 5]]

[[1], [2], [5, 6], [3], [4]] => [[1, 2, 5, 3, 4], [1, 2, 6, 3, 4]]

[[1, 2, 3], [4, 5]] => [[1, 4], [2, 4], [3, 4], [3, 5]]

[[1, 2, 3], []] => unspecified behavior (can be an error)

[[3, 13, 6], [9, 2, 4], [5, 10, 8], [12, 1, 11], [7, 14]] => 
     [[3, 9, 5, 12, 7], [13, 9, 5, 12, 7], [6, 9, 5, 12, 7], [6, 2, 5, 12, 7], 
      [6, 4, 5, 12, 7], [6, 4, 10, 12, 7], [6, 4, 8, 12, 7], [6, 4, 8, 1, 7], 
      [6, 4, 8, 11, 7], [6, 4, 8, 11, 14]]  

[[16, 8, 4, 14, 6, 7, 10, 15], [11, 1, 12, 2, 19, 18, 9, 3], [13, 5, 17]] =>
    [[16, 11, 13], [8, 11, 13], [4, 11, 13], [14, 11, 13], [6, 11, 13], 
     [7, 11, 13], [10, 11, 13], [15, 11, 13], [15, 1, 13], [15, 12, 13], [15, 2, 13], 
     [15, 19, 13], [15, 18, 13], [15, 9, 13], [15, 3, 13], [15, 3, 5], [15, 3, 17]]

Nếu bất cứ ai có một tiêu đề tốt hơn, cho tôi biết.


1
Tôi có một cảm giác [] => []thực sự nên [] => [[]]nhưng không thể tìm thấy những từ để giải thích tại sao.
ngn

1
@ngn Bạn nói đúng, nên [[]]có một tuple trống duy nhất với một mục nhập từ mỗi danh sách con (không). Có lẽ thật khó chịu khi yêu cầu các chương trình xuất ra chính xác điều này, vì vậy tôi sẽ nói rằng điều đó là không cần thiết.
Hood

1
Đúng [], nói đúng ra là một danh sách trống các danh sách không trống nhưng đầu ra không rõ ràng giữa [][[]]nếu đó là đầu vào được phép. ( "Danh sách đầu tiên các bộ bắt đầu với mỗi phần tử của danh sách đầu tiên ..." - không có danh sách đầu tiên, vì vậy chúng tôi đang thực hiện -> [])
Jonathan Allan

1
@Jonathan ALLan Bây giờ tôi tin chắc rằng đầu ra "chính xác" []phải là [[]]. Ví dụ, số lượng bộ dữ liệu đầu ra là sum(inner list lengths) - length of outer list + 1trong trường hợp trống 1, đó là độ dài [[]]nhưng không phải là độ dài của []. Đây là một chút vấn đề về phạm vi mặc dù ...
Hood

1
Chúng ta có thể giả định tất cả các mục là khác biệt? Hoặc, mạnh mẽ hơn, một hoán vị trên 1..n như trong ví dụ của bạn?
xnor

Câu trả lời:


5

JavaScript (ES6), 59 byte

Hy vọng một danh sách liệt kê của dương số nguyên.

f=a=>[a.map(a=>a[0]),...a.some(a=>a[1]&&a.shift())?f(a):[]]

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

Làm sao?

Ở mỗi lần lặp:

  • Chúng tôi đưa ra một danh sách mới bao gồm các yếu tố đầu tiên của mỗi danh sách.
  • Chúng tôi xóa phần tử đầu tiên của danh sách đầu tiên chứa ít nhất 2 phần tử và lặp lại quy trình. Hoặc chúng tôi dừng đệ quy nếu không có danh sách đó.

1
a.someThủ thuật đó thật tuyệt vời!
Sản phẩm ETH

1
@ETHproductions Bây giờ tìm kiếm một thách thức trong đó việc sử dụng awe.somesẽ không lãng phí byte ... :)
Arnauld

2

Python 2 , 62 byte

lambda M:[zip(*M)[l.pop(0)*0]for l in M+[[1,1]]for _ in l[1:]]

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

Sử dụng ý tưởng nhạc pop của Chas Brown lấy cảm hứng từ bài nộp JS của Arnauld .


Python 2 , 68 byte

M=input()
for l in[[0,0]]+M:
 for x in l[1:]:l[0]=x;print zip(*M)[0]

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

Đột biến các yếu tố đầu tiên của danh sách để giữ các giá trị mong muốn. Đây [[0,0]]+là một hack xấu xí để in các giá trị đầu tiên ban đầu.


2

Thạch , 15 byte

ẈṚṪ×€PƊƤFQṚCịŒp

Hãy thử trực tuyến! (chân trang hiển thị danh sách trả về thực tế thay vì đại diện Jelly)

Làm sao?

Lập chỉ mục vào sản phẩm của Cartesian trong danh sách tại các điểm bắt buộc ...

ẈṚṪ×€PƊƤFQṚCịŒp - Link: list of lists  e.g. [[6,8,4,9],[7,1,5],[3,2]]
Ẉ               - length of each            [4,3,2]
 Ṛ              - reverse                   [2,3,4]
       Ƥ        - for each prefix:             [2]      [2,3]      [2,3,4]
      Ɗ         -   last 3 links as a monad:
  Ṫ             -     tail (pop rightmost)     2        3          4
     P          -     product (of remaining)   1        2          6
    €           -     for €ach (range tail)    [1,2]    [1,2,3]    [1,2,3,4]   
   ×            -       multiply               [1,2]    [2,4,6]    [6,12,18,24]
        F       - flatten                   [1,2,2,4,6,6,12,18,24]
         Q      - de-duplicate              [1,2,4,6,12,18,24]
          Ṛ     - reverse                   [24,18,12,6,4,2,1]
           C    - complement (1-x)          [-23,-17,-11,-5,-3,-1,0]
             Œp - Cartesian product (of the input)
                -         -> [[6,7,3],[6,7,2],[6,1,3],[6,1,2],[6,5,3],[6,5,2],[8,7,3],[8,7,2],[8,1,3],[8,1,2],[8,5,3],[8,5,2],[4,7,3],[4,7,2],[4,1,3],[4,1,2],[4,5,3],[4,5,2],[9,7,3],[9,7,2],[9,1,3],[9,1,2],[9,5,3],[9,5,2]]
            ị   - index into (1-based & modular)
                -   indexes:      -23,                                            -17,                                            -11,                                             -5,             -3,             -1,     0
                -    values: [[6,7,3],                                        [8,7,3],                                        [4,7,3],                                        [9,7,3],        [9,1,3],        [9,5,3],[9,5,2]]
                -         -> [[6,7,3],[8,7,3],[4,7,3],[9,7,3],[9,1,3],[9,5,3],[9,5,2]]

ẈṚ’ṣ1T$¦ƬUṚị"€(14 byte) không thành công cho các đầu vào có một danh sách dài (không theo dõi); Nhưng có lẽ ṣ1T$có thể được thay thế bằng một cái gì đó khác?


2

K (ngn / k) , 40 21 19 18 byte

{x@'/:?|\+|!|#:'x}

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

sử dụng ý tưởng từ câu trả lời của @ H.PWiz

{ } chức năng với đối số x

#:' chiều dài của mỗi

| đảo ngược

! tất cả các bộ chỉ mục cho một mảng với các kích thước đó là các cột trong một ma trận (danh sách các danh sách)

| đảo ngược

+ hoán vị

|\ chạy cực đại

? độc nhất

x@'/: sử dụng mỗi bộ dữ liệu bên phải như các chỉ số trong danh sách tương ứng từ x


1

Than , 33 byte

IE⊕ΣEθ⊖LιEθ§λ⌈⟦⁰⌊⟦⊖Lλ⁻ι∧μΣE…θμ⊖Lν

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Truyền các số nguyên thành chuỗi trước khi in ngầm bằng cách sử dụng định dạng đầu ra mặc định cho các danh sách, đó là mỗi mục trên một dòng riêng và các danh sách lồng nhau cách nhau hai lần.

E⊕ΣEθ⊖Lι

Lấy tổng độ dài của danh sách và trừ đi độ dài của danh sách. Sau đó lặp từ 0 đến giá trị này.

Eθ§λ

Bản đồ trên danh sách các danh sách và chỉ mục vào mỗi danh sách.

⌈⟦⁰⌊⟦⊖Lλ

Kẹp chỉ số về 0 và chỉ mục cuối cùng trong danh sách. (Dấu ngoặc đóng được ngụ ý.)

⁻ι∧μΣE…θμ⊖Lν

Sau danh sách đầu tiên, trừ độ dài giảm dần của tất cả các danh sách trước đó khỏi chỉ mục ngoài cùng. (Điều này không hoạt động cho danh sách đầu tiên vì độ dài của danh sách trống và tổng không phải là một số.)



1

APL (Dyalog Classic) , 32 30 27 byte

1↓¨∪⊃{(⍵,¨⊃⍺),⍺,¨⍨⊢/⍵}/⌽0,⎕

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

hoàn thành chương trình, đầu vào là từ bàn phím ( )

cho đầu []ra đầu vào [[]](tương đương APL của chúng là 0⍴⊂⍬,⊂⍬)

giả định tính duy nhất của các số trong đầu vào


1
Không phải là nó tạo ra sự khác biệt cho đầu ra, nhưng tôi nghĩ rằng đầu vào cho thử nghiệm thứ hai nên là,⊂,1
H.PWiz

@ H.PWiz đúng vậy, đã sửa, chúc mừng
ngn 16/07/18

1

JavaScript (ES6), 58 54 byte

h=(x,s)=>[x.map(y=>s|y?y[0]:s=y.shift()),...s?h(x):[]]

Sau hơn 14 lần thử chơi mã của tôi (loại bỏ tất cả các trường hợp trong khi các vòng lặp, pushconcat), tôi đã đi đến một phép lặp tương tự về mặt thuật toán với câu trả lời của @ Arnauld , không ngạc nhiên khi biết nó ngắn gọn như thế nào!

Chấp nhận một danh sách các danh sách các số nguyên dương. Hãy thử trực tuyến!

58 byte

Để có thêm 1 byte, thay thế s = y.shift()bằng y.shift(s = 1)nên xử lý tất cả các số nguyên (có lẽ, vì tôi chưa kiểm tra cá nhân nó).

h=(x,s)=>[x.map(y=>!s/y[1]?s=y.shift():y[0]),...s?h(x):[]]

58 byte

Phiên bản thưởng, với sự sắp xếp lại nhẹ:

h=x=>[x.map(y=>s&&y[1]?y.shift(s=0):y[0],s=[]),...s||h(x)]

Giải trình

Các phiên bản đầu tiên của mã đã cố gắng sửa đổi một bản sao (một mảng) các phần tử đầu tiên của mỗi mảng, nhưng bước bổ sung để khởi tạo mảng đó rất tốn kém ... cho đến khi tôi nhận ra rằng ánh xạ qua các phần tử đầu tiên của mỗi mảng là khoảng hoạt động "duy nhất" cần thiết nếu tôi thay đổi các mảng ban đầu.

Sử dụng cờ boolean để kiểm tra xem có bất kỳ mảng nào đã được dịch chuyển (tức là rút ngắn) chưa. Đánh dấu kiểm tra có điều kiện xuống hơn nữa bằng cách quan sát rằng JS ép buộc các mảng với một giá trị số là phần tử duy nhất của nó thành số đó, trong khi ép các mảng có nhiều giá trị là NaN.

var
h = (x, s) => 
    [
        x.map(y =>                 // map to first element of each array
            s|y                    // if s == 1 (i.e. an array has been shortened)
                                   // or the current array y has length == 1
                ? y[0]
                : s = y.shift()    // remove first element of y and set s to truthy
        ),
        ...s ? h(x) : []           // only concatenate a recurrence of the function if an array has had a value removed
    ]

1

APL (Dyalog) , 15 byte ( SBCS )

Cảm ơn ngn đã chỉ ra một byte không cần thiết

{∪⌈\,⍉⍳≢¨⍵}⊃¨¨⊂

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

{∪⌈\,⍉⍳≢¨⍵}tạo danh sách để lập chỉ mục vào đầu vào. ví dụ(1 2 3) (4 5 6) (7 8 9) -> (0 0 0) (1 0 0) (2 0 0) (2 1 0) (2 2 0) (2 2 1) (2 2 2)

≢¨⍵: độ dài của mỗi danh sách trong đầu vào

,⍉⍳tạo ra tất cả các kết hợp số cho đến đầu vào của nó. ví dụ2 3 -> (0 0) (1 0) (0 1) (1 1) (0 2) (1 2)

⌈\: quét với mức tối đa. ví dụ như ví dụ trên bây giờ sẽ là(0 0) (1 0) (1 1) (1 1) (1 2) (1 2)

: Loại bỏ các bản sao

⊃¨¨⊂ thực hiện lập chỉ mục, chú ý đến độ sâu của một trong hai đối số


Câu trả lời chính xác! Bạn đánh bại tôi gần một nửa byte của tôi. dường như không cần thiết .
ngn


@ngn Nice, tôi không thể nhớ những gì khiến tôi nghĩ đó là. Cảm ơn!
H.PWiz

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.