Semua pasangan tidak berurutan di antara elemen-elemen array


11

Tugas:

Kembalikan array dengan semua pasangan yang memungkinkan antara elemen-elemen dari array.

Contoh

Dari a=["a", "b", "c", "d"];kembali b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

Pasangan dapat dalam urutan apa pun selama semua kemungkinan kombinasi disertakan dan jelas ["b","d"]sama untuk ["d","b"].

Memasukkan

Array elemen string unik yang terdiri dari karakter dari kelas [a-z].

Keluaran

2d array yang berisi semua pasangan elemen input yang memungkinkan.

Uji Kasus

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

Catatan: Saya tidak dapat menemukan duplikat untuk tantangan ini. Jika ada, beri tahu saya dengan komentar untuk mengajukan pertanyaan.


2
Saya tidak jelas tentang apa yang terjadi ketika nilai input berulang atau tidak dalam urutan. Beberapa kasus uji yang lebih umum akan membantu di sana.
xnor

@ Adám Bukan korban penipuan, yang melibatkan memiliki 2 daftar.
Tn. Xcoder

Masalah ini tidak termasuk memasangkan elemen dengan dirinya sendiri, bahkan lebih tanpa duplikasi.
CalculatorFeline

@ xnor belum pernah berpikir tentang mengulangi nilai karena masalah awal saya di tempat kerja berkaitan dengan satu set individu yang unik. Saya kira saya harus menambahkan keunikan sebagai syarat?
alexandros84

@ alexandros84 Keunikan akan baik-baik saja. Apa yang harus ["c","b","a"]dikembalikan?
xnor

Jawaban:



8

Haskell , 29 byte

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

Cobalah online! Contoh penggunaan: f ["a","b","c"]hasil [("a","b"),("a","c"),("b","c")].


Dengan flag -XTupleSectionsini dapat disingkat menjadi 27 byte, namun flag tersebut perlu dihitung:

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

Cobalah online!


Saya pikir Anda dapat menyimpan satu byte dengan memodifikasi case f l=l.
Kritzefitz

@ Kritzefitz Saya khawatir ini tidak akan berfungsi karena dua daftar kosong memiliki tipe yang berbeda, jadi pemeriksa tipe Haskell akan mengeluh.
Laikoni

Poin bagus. Saya tidak memikirkan itu.
Kritzefitz


6

Haskell, 25 byte

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

Cobalah online!

Lingkaran luar ( x) dan dalam ( y) melalui daftar input dan simpan pasangan (x,y)hanya jika x < y.


5

05AB1E , 3 byte

Kode:

æ2ù

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan:

æ      # Powerset of the input
 2ù    # Keep the items of length two

5

vim, 50 48

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

Mengambil input dalam formulir

abcd

dan output sebagai

ad
ac
ab
bd
bc
cd

Penjelasan

Pertama, AX<esc>menambahkan Xke input untuk menangani input 2-panjang, yang diperlukan untuk alasan yang akan segera menjadi jelas.

Kemudian muncul makro rekursif pertama, dari formulir qq...@qq@q. (Rekam makro q, jalankan sendiri lagi di akhir, akhiri rekaman, lalu jalankan sendiri sekali.) Dalam tubuh makro, Ypduplikat garis saat ini, lkeluar dari makro jika garis sekarang panjang satu karakter, dan Xmenghapus karakter pertama dalam barisan. Ini adalah hasil akhir dari produksi

abcdX
abcX
abX
aX
X
X

Mengabaikan Xs untuk saat ini, yang harus kita lakukan adalah mengubah abcdX, misalnya menjadi ab / ac / ad / aX. Ini dicapai dengan makro rekursif kedua qr...@rq,.

Dalam makro ini, pertama-tama kita menduplikasi baris ( Yp), lalu menghapus semuanya kecuali dua karakter pertama dengan menggerakkan kanan dua ( ll) dan menghapus ke akhir baris ( D). Karena kursor sekarang berada di karakter kedua baris, kxakan menghapus karakter kedua dari baris sebelumnya, yang kebetulan adalah karakter yang baru saja dipasangkan dengan karakter pertama di baris. Proses ini kemudian diulang mulai lagi dari awal garis ( h) sebanyak yang diperlukan karena sifat makro rekursif.

Sekarang hanya masalah menjalankan makro pada setiap baris, yang dapat dicapai dengan :g/./norm@r(Saya tidak yakin mengapa ini berperilaku berbeda :%norm@r, tetapi cukup untuk mengatakan, yang terakhir tidak berfungsi seperti yang dimaksudkan.) Baris dengan Xdihapus dengan :g/X/d, dan garis-garis kosong di ujung kiri sebagai akibat dari pembangunan rmakro dibersihkan dengan dG.


Jawaban yang bagus Akan memakan waktu bagi saya untuk melewatinya.
alexandros84



4

Brachylog , 5 byte

{⊇Ċ}ᶠ

Cobalah online!

Bagaimana itu bekerja

{⊇Ċ}ᶠ
    ᶠ   find all the possible outputs of the following predicate
 ⊇          the output is an ordered subset of the input
  Ċ         the output is a list with two elements


3

Python, 53 byte

2 byte disimpan berkat @CalculatorFeline

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

Cobalah online!


1
a[i+1:]bisaa[:i]
CalculatorFeline

Memiliki nama pengguna yang panjang membuat komentar singkat menjadi mudah dengan hanya menyebutkan pengguna yang disebutkan di atas.
CalculatorFeline

3

Oktaf , 49 48 byte

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

Fungsi anonim yang menghindari built-in ( nchoosek).

Cobalah online!

Penjelasan

x+j*x'menggunakan penyiaran untuk membangun matriks bilangan kompleks di mana bagian nyata dan imajiner adalah semua pasangan titik kode dari input x.

y=triu(...,1)menjaga bagian segitiga atas tidak termasuk diagonal, membuat sisa elemen nol. Hasilnya ditugaskan ke variabel y.

y=(...)(~~y)mempertahankan elemen bukan nol dalam bentuk vektor kolom, yang ditugaskan ke variabel y.

imag(...)dan real(...)mengekstrak bagian nyata dan imajiner.

[... ... ''] mengkonversi kembali ke char untuk membangun output.


Bagus! Seluruh tantangan sangat menarik. Butuh waktu sekitar satu setengah jam untuk menghasilkan kode ES5 saya (ditampilkan di bawah). Saya senang itu menghasilkan begitu banyak jawaban menarik ..
alexandros84






2

Ruby , 38 34 24 byte

->x{[*x.combination(2)]}

Terima kasih Seims untuk ide yang menyelamatkan 10 byte.

Cobalah online!


1
->x{x.combination(2).to_a}menghemat beberapa byte :)
Seims

1

JavaScript ES6, 52 byte

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

Jika ada seperti flatMapitu akan menghemat banyak byte.


Hai jawaban yang bagus! periksa jawaban es5 saya sementara saya belajar milikmu jika kamu mau. setiap umpan balik akan dihargai (haha positif / konstruktif)
alexandros84

1
Pemahaman array Firefox 30 dapat mensimulasikan peta datar, misalnya a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Neil

@Neil, beberapa sintaks yang sangat canggih di sana ... Saya harus google setidaknya tiga hal untuk mulai memahami ekspresi Anda. Yaitu operator spread, apa array array dan apa [x, y] pada akhirnya (masih belum menemukan jawaban untuk itu).
alexandros84

1
@ alexandros84 Pada [x,y]akhirnya adalah bit yang mudah, itu hanya sebuah array literal.
Neil

1
Juga operator spread hanya ada untuk menyalin array, karena saya memutasikannya di dalam loop.
Neil

1

Python , 55 byte

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

Cobalah online!

Lebih panjang dari jawaban Python lainnya, tetapi menggunakan teknik yang berbeda jadi saya pikir ini layak untuk dikirim.


Jangan punya waktu untuk memeriksa, saya berharap teknik ini benar-benar berbeda karena saya sudah ter-upgrade.
alexandros84

Saya pikir ini adalah pendekatan yang sangat mirip dengan jawaban @ ovs Python 3.
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])))

Mengembalikan set perangkat :)


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
Selamat datang di PPCG! Anda dapat bermain golf ini: 1) mengganti nama variabel 2-char dengan 1-char 2) menghapus spasi yang tidak perlu 3) ini adalah potongan, Anda perlu membuatnya menjadi lambda, fungsi atau program penuh
Erik the Outgolfer

Bermain golf 10 byte: 64 byte
Bermain

1

Javascript (ES 5), dari 108 hingga 78 byte

Saya memposting jawaban saya hari ini tetapi saya jelas berjanji untuk tidak menerima jawaban saya sendiri:

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
Selamat datang di PPCG; kami berharap kiriman akan di-golf, termasuk menghapus spasi yang tidak perlu
HyperNeutrino

Ty. Saya juga bertanya-tanya ini: haruskah saya memasukkan x = input; a = []; dalam jawaban saya atau tidak? Saya akan mengedit besok.
alexandros84

Anda bisa mengirimkan fungsi atau melakukan program lengkap. Karena Anda menggunakan a, Anda perlu mendefinisikannya, tetapi Anda dapat membuat fungsi x.
HyperNeutrino

jauh lebih baik sekarang @HyperNeutrino.
alexandros84

1
Saya pikir Anda dapat mengecualikan beberapa titik koma dan garis kosong untuk menghemat ruang. Saya juga berpikir Anda bisa berubah for(i=n+1;i<(x.length);i++)menjadi for(i=n;++i<x.length;). Demikian juga, Anda dapat mengubah n<(x.length-1);n++ken++<x.length-1
musicman523

0

J , 17 byte

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

Cobalah online!

Penjelasan

({~$#: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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.