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.

alexandros84
sumber
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:

5

Jelly , 2 byte

Œc

Cobalah online!

HyperNeutrino
sumber
Anda ninja saya - cukup cetak output menggunakan sesuatu seperti ÇK€Ydi footer.
Jonathan Allan
@ Jonathan Allan Oh, terima kasih!
HyperNeutrino
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!

Laikoni
sumber
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

Mathematica, 14 byte

#~Subsets~{2}&

memasukkan

[{"a", "b", "c"}]

J42161217
sumber
Saya akan melakukan itu :(
CalculatorFeline
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.

nimi
sumber
5

05AB1E , 3 byte

Kode:

æ2ù

Menggunakan penyandian 05AB1E . Cobalah online!

Penjelasan:

æ      # Powerset of the input
 2ù    # Keep the items of length two
Adnan
sumber
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.

Gagang pintu
sumber
Jawaban yang bagus Akan memakan waktu bagi saya untuk melewatinya.
alexandros84
4

Python 3 , 44 byte

f=lambda k,*s:[*s]and[[k,x]for x in s]+f(*s)

Cobalah online!

Mengambil input sebagai parameter fungsi individual.

ovs
sumber
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
Biarawati Bocor
sumber
3

R , 18 byte

combn(scan(,''),2)

membaca daftar dari stdin, mengembalikan matriks tempat kolom berpasangan.

Cobalah online!

Giuseppe
sumber
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!

Uriel
sumber
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.

Luis Mendo
sumber
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

Python ≥ 2.7, 55 byte

lambda l:list(combinations(l,2))
from itertools import*

repl.it!

Tuan Xcoder
sumber
2

Perl 6 , 17 byte

*.combinations(2)

Wah, itu nama metode yang panjang.

Sean
sumber
2

Scala, 17 byte

_.combinations(2)
musicman523
sumber
2

Pyth , 7 4 byte

-3 byte terima kasih untuk Leaky Nun !

.cQ2

Cobalah online!

notjagan
sumber
1
.cQ2?
Leaky Nun
@ LeakyNun Aku berani bersumpah ada fungsi yang melakukan persis apa yang dibutuhkan tantangan ini, tapi aku hanya melihat .Cketika melihat daftar. Tangkapan bagus!
notjagan
2

Ruby , 38 34 24 byte

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

Terima kasih Seims untuk ide yang menyelamatkan 10 byte.

Cobalah online!

GB
sumber
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.

Downgoat
sumber
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.

musicman523
sumber
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))),[])
Joel Cornett
sumber
1

Oktaf, 38 byte

@(s)s([[x y]=find(s|s'),y](y<x,[2 1]))

Jawaban lain untuk menghindari nchoosekbuilt-in.

Cobalah online!

rahnema1
sumber
1

Clojure, 42 byte

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

Mengembalikan set perangkat :)

NikoNyrh
sumber
1

Python, 74 byte

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]
Oren
sumber
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]]);}}
alexandros84
sumber
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
mil
sumber