Tất cả các cặp không theo thứ tự giữa các phần tử của một mảng


11

Bài tập:

Trả về một mảng với tất cả các cặp có thể giữa các phần tử của một mảng.

Thí dụ

Từ a=["a", "b", "c", "d"];trở về b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

Các cặp có thể theo bất kỳ thứ tự nào miễn là tất cả các kết hợp có thể được bao gồm và rõ ràng ["b","d"]là giống nhau ["d","b"].

Đầu vào

Mảng các phần tử chuỗi duy nhất bao gồm các ký tự từ lớp [a-z].

Đầu ra

Mảng 2d chứa tất cả các cặp phần tử của mảng đầu vào có thể.

Các trường hợp thử nghiệm

input=["a","b","c"];
//output=[["a","b"],["a","c"],["b","c"]]

input=["a","b","c","d","e"];
//output=[["a","b"],["a","c"],["a","d"],["a","e"],["b","c"],["b","d"],["b","e"],["c","d"],["c","e"],["d","e"]]

Lưu ý: Tôi không thể tìm thấy bản sao cho thử thách này. Nếu có, hãy cảnh báo tôi bằng một bình luận để bỏ câu hỏi.


2
Tôi không rõ điều gì xảy ra khi các giá trị đầu vào lặp lại hoặc không theo thứ tự được sắp xếp. Một số trường hợp thử nghiệm tổng quát hơn sẽ giúp đỡ ở đó.
xnor

@ Adám Không phải là bản sao, liên quan đến việc có 2 danh sách.
Ông Xcoder

Vấn đề này không bao gồm ghép một phần tử với chính nó, do đó không lặp lại nhiều hơn.
Máy

@xnor chưa nghĩ đến việc lặp lại các giá trị vì vấn đề ban đầu của tôi trong công việc phải làm với một nhóm cá nhân duy nhất. Tôi đoán tôi nên thêm tính độc đáo như một điều kiện?
alexandros84

@ alexandros84 Tính độc đáo sẽ ổn. Nên ["c","b","a"]trả lại cái gì?
xnor

Câu trả lời:



8

Haskell , 29 byte

f(a:b)=map((,)a)b++f b
f _=[]

Hãy thử trực tuyến! Ví dụ sử dụng: f ["a","b","c"]sản lượng [("a","b"),("a","c"),("b","c")].


Với cờ -XTupleSectionsnày, có thể rút ngắn xuống còn 27 byte, tuy nhiên cờ sẽ cần được tính:

f(a:b)=map(a,)b++f b
f _=[]

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


Tôi nghĩ bạn có thể lưu một byte bằng cách sửa đổi trường hợp thành f l=l.
Kritzefitz

@Kritzefitz Tôi sợ điều này sẽ không hoạt động vì hai danh sách trống có một loại khác nhau, vì vậy trình kiểm tra loại của Haskell sẽ khiếu nại.
Laikoni

Điểm tốt. Tôi đã không nghĩ về điều đó.
Kritzefitz


6

Haskell, 25 byte

f l=[(x,y)|x<-l,y<-l,x<y]

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

Vòng lặp ngoài ( x) và bên trong ( y) thông qua danh sách đầu vào và chỉ giữ cặp (x,y)nếu x < y.



5

vim, 50 48

AX<esc>qqYplX@qq@qqrYpllDkxh@rq:g/./norm@r<cr>:g/X/d<cr>dG

Đưa đầu vào theo mẫu

abcd

và đầu ra như

ad
ac
ab
bd
bc
cd

Giải trình

Đầu tiên, AX<esc>gắn thêm một Xđầu vào để xử lý đầu vào 2 chiều dài, điều này cần thiết vì những lý do sẽ sớm trở nên rõ ràng.

Sau đó đến macro đệ quy đầu tiên, của mẫu qq...@qq@q. (Ghi macro q, tự chạy lại ở cuối, kết thúc ghi, sau đó tự chạy một lần.) Trong phần thân của macro, Ypsao chép dòng hiện tại, lthoát khỏi macro nếu dòng này dài một ký tự và Xxóa nhân vật đầu tiên trong dòng. Điều này có kết quả cuối cùng của sản xuất

abcdX
abcX
abX
aX
X
X

Bỏ qua các Xs bây giờ, tất cả những gì chúng ta phải làm là biến abcdX, ví dụ, thành ab / ac / ad / aX. Điều này đạt được với macro đệ quy thứ hai qr...@rq,.

Trong macro này, trước tiên, chúng tôi nhân đôi dòng ( Yp), sau đó xóa mọi thứ trừ hai ký tự đầu tiên bằng cách di chuyển sang phải hai ( ll) và xóa đến cuối dòng ( D). Vì con trỏ hiện đang ở trên charcater thứ hai của dòng, kxsẽ xóa ký tự thứ hai khỏi dòng trước đó, đây là ký tự vừa được ghép với ký tự đầu tiên trên dòng. Quá trình này sau đó được lặp lại bắt đầu lại từ đầu dòng ( h) nhiều lần khi cần thiết do tính chất đệ quy của macro.

Bây giờ chỉ là vấn đề chạy macro trên mọi dòng, có thể đạt được :g/./norm@r(Tôi không chắc tại sao điều này lại hoạt động khác :%norm@r, nhưng đủ để nói, cái sau không hoạt động như dự định.) Các dòng Xbị xóa :g/X/d, và các dòng trống ở cuối bên trái là kết quả của việc xây dựng rmacro được làm sạch với dG.


Câu trả lời chính xác. Sẽ mất thời gian để tôi đi qua nó.
alexandros84





3

Python, 53 byte

Lưu 2 byte nhờ @CalculatorFeline

lambda a:[(x,y)for i,x in enumerate(a)for y in a[:i]]

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


1
a[i+1:]có thểa[:i]
Máy

Có một tên người dùng dài giúp bình luận ngắn dễ dàng bằng cách đề cập đến người dùng đã nói ở trên.
Máy

3

Octave , 49 48 byte

@(x)[imag(y=(y=triu(x+j*x',1))(~~y)) real(y) '']

Hàm ẩn danh tránh tích hợp ( nchoosek).

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

Giải trình

x+j*x'sử dụng phát sóng để xây dựng một ma trận gồm các số phức trong đó phần thực và phần ảo là tất cả các cặp điểm mã từ đầu vào x.

y=triu(...,1)giữ phần tam giác trên không bao gồm đường chéo, làm cho các phần tử còn lại bằng không. Kết quả được gán cho biến y.

y=(...)(~~y)giữ lại các phần tử khác 0 ở dạng vectơ cột, được gán cho biến y.

imag(...)real(...)trích xuất các phần thực và tưởng tượng.

[... ... ''] chuyển đổi trở lại char để xây dựng đầu ra.


Đẹp! Toàn bộ thử thách thực sự thú vị. Tôi mất khoảng một tiếng rưỡi để tìm ra mã es5 của mình (đặc trưng bên dưới). Tôi rất vui vì nó đã tạo ra rất nhiều câu trả lời thú vị ..
alexandros84



2

Perl 6 , 17 byte

*.combinations(2)

Whew, đó là một tên phương pháp dài.





1

JavaScript ES6, 52 byte

a=>a.map((x,i)=>a.slice(0,i).map(y=>[x,y])).slice(1)

Nếu có như thế flatMapsẽ tiết kiệm rất nhiều byte.


Này câu trả lời tốt đẹp! kiểm tra câu trả lời es5 của tôi trong khi tôi học của bạn nếu bạn muốn. mọi phản hồi sẽ được đánh giá cao (tích cực / mang tính xây dựng)
alexandros84

1
Khả năng hiểu mảng của Firefox 30 có thể mô phỏng bản đồ phẳng, ví dụ a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Neil

@Neil, một số cú pháp thực sự tiên tiến ở đó ... Tôi phải google ít nhất ba điều để bắt đầu hiểu biểu thức của bạn. Cụ thể là toán tử trải rộng, cuối cùng là hiểu mảng là gì và [x, y] là gì (vẫn chưa tìm thấy câu trả lời cho điều đó).
alexandros84

1
@ alexandros84 [x,y]Cuối cùng là một chút dễ dàng, nó chỉ là một mảng theo nghĩa đen.
Neil

1
Ngoài ra, toán tử trải chỉ ở đó để sao chép mảng, vì tôi đang biến đổi nó trong vòng lặp.
Neil

1

Python , 55 byte

f=lambda s:[(s[0],j)for j in s[1:]]+f(s[1:])if s else[]

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

Dài hơn các câu trả lời Python khác, nhưng nó sử dụng một kỹ thuật khác nên tôi nghĩ nó đáng để đăng.


Không có thời gian để kiểm tra, tôi hy vọng là kỹ thuật thực sự khác biệt vì tôi đã nâng cấp.
alexandros84

Tôi nghĩ rằng đây là một cách tiếp cận rất giống với câu trả lời Python 3 của @ ovs.
Neil


1

Python, 64 byte

f=lambda a:sum((list(zip(a, a[i:]))for i in range(1,len(a))),[])


1

Clojure, 42 byte

#(set(for[i % j(remove #{i}%)](set[i j])))

Trả về một bộ các bộ :)


1

Python, 74 byte

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]

1
Chào mừng đến với PPCG! Bạn có thể chơi golf này: 1) thay thế tên biến 2-char bằng 1-char 2) xóa khoảng trắng không cần thiết 3) đây là đoạn trích, bạn cần biến nó thành lambda, chức năng hoặc chương trình đầy đủ
Erik the Outgolfer

Chơi gôn 10 byte: 64 byte
Ông Xcoder

1

Javascript (ES 5), từ 108 đến 78 byte

Tôi đăng câu trả lời của mình ngày hôm nay nhưng rõ ràng tôi hứa sẽ không chấp nhận câu trả lời của riêng tôi:

x=input;
a=[];

for(n=0;n<(x.length-1);n++){for(i=n+1;i<(x.length);i++){a.push([x[n],x[i]]);}}

1
Chào mừng đến với PPCG; chúng tôi hy vọng các bài nộp sẽ được chơi gôn, bao gồm xóa các khoảng trắng không cần thiết
HyperNeutrino

Ty. Tôi cũng đã tự hỏi điều này: tôi có nên bao gồm đầu vào x =; a = []; Trong câu trả lời của tôi hay không? Tôi sẽ chỉnh sửa vào ngày mai.
alexandros84

Bạn có thể chỉ cần gửi một chức năng hoặc làm một chương trình đầy đủ. Vì bạn sử dụng a, bạn cần xác định nó, nhưng bạn có thể tạo một chức năng x.
HyperNeutrino

tốt hơn nhiều bây giờ @HyperNeutrino.
alexandros84

1
Tôi nghĩ bạn có thể loại trừ một số dấu chấm phẩy và dòng trống để tiết kiệm không gian. Tôi cũng nghĩ rằng bạn có thể thay đổi for(i=n+1;i<(x.length);i++)để for(i=n;++i<x.length;). Tương tự như vậy, bạn có thể đổi n<(x.length-1);n++thànhn++<x.length-1
Musicman523

0

J , 17 byte

({~$#:I.@,)#\</#\

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

Giải trình

({~$#:I.@,)#\</#\  Input: string S
               #\  Get the length of each prefix of S
           #\      Get the length of each prefix of S again
             </    Test using greater than (<) between each
         ,         Flatten
      I.@          Find the indices where the value is 1
   $               Shape of that table
    #:             Convert the indices to the base represented by the shape
 {~                Index into S at those values
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.