Bir dizinin öğeleri arasındaki sıralanmamış tüm çiftler


11

Görev:

Bir dizinin öğeleri arasındaki tüm olası çiftleri içeren bir dizi döndürür .

Misal

Gönderen a=["a", "b", "c", "d"];dönüş b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]].

Tüm olası kombinasyonlar dahil edildiği ve açıkça ["b","d"]aynı olduğu sürece çiftler herhangi bir sırada olabilir ["d","b"].

Giriş

Sınıftan karakterlerden oluşan benzersiz dize öğeleri dizisi [a-z].

Çıktı

Giriş dizisi öğelerinin tüm olası çiftlerini içeren 2d dizisi.

Test Durumları

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

Not: Bu soruna bir kopya bulamadım . Eğer varsa, soru bırakmak için bir yorum ile beni uyar.


2
Giriş değerleri tekrarlandığında veya sıralama düzeninde olmadığında ne olacağı konusunda net değilim. Bazı genel test senaryoları burada yardımcı olacaktır.
xnor

@ Adám 2 listeden oluşan bir dupe değil.
Bay Xcoder

Bu sorun, bir öğeyi kendisiyle eşleştirmeyi dışlar, çok daha düzensiz.
CalculatorFeline

@xnor havent, değerleri tekrar etmeyi düşündü çünkü işteki asıl sorunumun benzersiz bir grup insanla ilgisi vardı. Bir koşul olarak benzersizliği eklemeliyim sanırım?
alexandros84

@ alexandros84 Teklik iyi olur. Ne ["c","b","a"]dönmeli?
xnor

Yanıtlar:



8

Haskell , 29 bayt

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

Çevrimiçi deneyin! Örnek kullanım: f ["a","b","c"]verim [("a","b"),("a","c"),("b","c")].


Bayrakla -XTupleSectionsbu, 27 bayta kısaltılabilir, ancak bayrağın sayılması gerekir:

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

Çevrimiçi deneyin!


Olmak için davayı değiştirerek bir bayt kaydedebilirsiniz düşünüyorum f l=l.
Kritzefitz

@Kritzefitz İki boş listenin farklı bir türü olduğundan bu işe yaramayacağından korkuyorum, bu yüzden Haskell'in tip denetleyicisi şikayet edecek.
Laikoni

İyi bir nokta. Bunu düşünmedim.
Kritzefitz


6

Haskell, 25 bayt

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

Çevrimiçi deneyin!

Dış ( x) ve iç ( y) döngü giriş listesinde dolaşır ve çifti (x,y)yalnızca aşağıdaki durumlarda tutar x < y.



5

vim, 50 48

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

Formda girdi alır

abcd

ve çıktılar

ad
ac
ab
bd
bc
cd

açıklama

İlk olarak, kısa bir süre sonra netleşecek nedenlerle gerekli olan 2 uzunluklu girişi işlemek için girişe AX<esc>bir ekler X.

Sonra formun ilk özyinelemeli makrosu gelir qq...@qq@q. (Makroyu kaydet q, sonunda kendini tekrar çalıştır, kaydı bitir, sonra kendini bir kez çalıştır.) Makro gövdesinde Yp, geçerli satırı çoğaltır l, satır şimdi bir karakter uzunluğundaysa makrodan çıkar Xve satırdaki ilk karakter. Bunun sonucu

abcdX
abcX
abX
aX
X
X

XŞimdilik leri görmezden gelmek, tek yapmamız gereken abcdXmesela ab / ac / ad / aX. Bu ikinci özyinelemeli makro ile elde edilir qr...@rq.

Bu makroda, önce satırı ( Yp) çoğaltırız , ardından sağ iki ( ll) öğesini taşıyarak ve satırın sonuna ( ) silerek ilk iki karakter hariç her şeyi sileriz D. İmleç şimdi satırın kxikinci karakterinde olduğu için, önceki satırdaki ikinci karakteri siler, bu satırdaki ilk karakterle eşleştirilen karakter olur. Bu işlem daha sonra h, makronun özyinelemeli doğası gereği , satırın ( ) başlangıcından itibaren gerektiği kadar tekrarlanır.

Artık sadece her satırda makroyu çalıştırmakla ilgili bir konudur :g/./norm@r(bunun neden farklı davrandığından emin değilim :%norm@r, ancak ikincisinin amaçlandığı gibi çalışmadığından emin değilim .) İle Xsilindi :g/X/d, ve rmakro yapının bir sonucu olarak sol taraftaki boş çizgiler temizlenir dG.


Mükemmel cevap. Bunun üzerinden geçmem zaman alacak.
alexandros84





3

Python, 53 bayt

@CalculatorFeline sayesinde 2 bayt kaydedildi

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

Çevrimiçi deneyin!


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

Uzun bir kullanıcı adına sahip olmak, yukarıda bahsedilen kullanıcıdan bahsederek kısa yorumları kolaylaştırır.
CalculatorFeline

3

Oktav , 49 48 bayt

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

Yerleşik ( nchoosek) öğeyi önleyen anonim işlev .

Çevrimiçi deneyin!

açıklama

x+j*x'gerçek ve hayali parçaların girişten kod noktası çiftleri olduğu karmaşık sayıların bir matrisini oluşturmak için yayın kullanır x.

y=triu(...,1)üst üçgen parçayı diyagonal hariç tutar, kalan elemanları sıfır yapar. Sonuç değişkene atanır y.

y=(...)(~~y)sıfır olmayan öğeleri değişkene atanan bir sütun vektörü biçiminde tutar y.

imag(...)ve real(...)gerçek ve hayali parçaları çıkarır.

[... ... ''] çıktıyı oluşturmak için char'a dönüşür.


Güzel! Tüm zorluk gerçekten ilginç. Benim es5 kodu (aşağıda özellikli) ile gelip yaklaşık bir buçuk saat sürdü. Çok ilginç cevaplar ürettiğim için mutluyum ..
alexandros84



2

Perl 6 , 17 bayt

*.combinations(2)

Vay canına, bu uzun bir yöntem adı.





1

JavaScript ES6, 52 bayt

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

Böyle bir flatMapşey olsaydı, çok fazla bayt tasarruf ederdi.


Hey güzel cevap! İstersen seninkini çalışırken es5 cevabımı kontrol et. herhangi bir geri bildirim takdir edilecektir (olumlu / yapıcı haha)
alexandros84

1
Firefox 30'un dizi kavrayışı düz bir haritayı simüle edebilir, örn a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]].
Neil

@Neil, bazı gerçekten gelişmiş sözdizimi ... İfadenizi anlamaya başlamak için en az üç şeyi google'a yönlendirmem gerekiyor. Yani yayılma operatörü, dizi kavrayışı nedir ve sonunda [x, y] nedir (hala buna cevap vermedi).
alexandros84

1
@ alexandros84 [x,y]Sonunda kolay bit, sadece bir dizi değişmez.
Neil

1
Ayrıca yayılma operatörü sadece döngü içinde mutasyona geçiyorum, dizi kopyalamak için orada.
Neil

1

Python , 55 bayt

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

Çevrimiçi deneyin!

Diğer Python cevaplarından daha uzun, ama farklı bir teknik kullanıyor, bu yüzden göndermeye değer olduğunu düşünüyorum.


Kontrol etmek için zamanım yok, umarım gerçekten farklı bir tekniktir çünkü iptal ettim.
alexandros84

Bence bu @ ovs'un Python 3 yanıtına çok benzer bir yaklaşım.
Neil


1

Python, 64 bayt

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


1

Clojure, 42 bayt

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

Bir dizi set döndürür :)


1

Python, 74 bayt

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

1
PPCG'ye Hoşgeldiniz! Bunu golf oynayabilirsiniz: 1) 2 karakterli değişken adlarını 1 karakterle değiştirin 2) gereksiz boşlukları kaldırın 3) bu bir
snippettir

10 bayt golf: 64 bayt
Bay Xcoder

1

Javascript (ES 5), 108 ila 78 bayt

Cevabımı bugün gönderiyorum ama açıkçası kendi cevabımı kabul etmeyeceğime söz veriyorum:

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
PPCG'ye Hoşgeldiniz; gereksiz boşlukların kaldırılması da dahil olmak üzere gönderilerin golf oynamasını bekliyoruz
HyperNeutrino

Ty. Ben de merak ediyordum: x = giriş dahil olmalı; a = []; cevabımda mı değil mi? Yarın düzenleyeceğim.
alexandros84

Sadece bir işlev gönderebilir veya tam bir program yapabilirsiniz. Kullanmak yana a, bunu tanımlamanız gerekir, ancak bir işlev yapabilir x.
HyperNeutrino

@HyperNeutrino şimdi çok daha iyi.
alexandros84

1
Yer kazanmak için bazı noktalı virgülleri ve boş satırı hariç tutabileceğinizi düşünüyorum. Ben de değiştirebilir düşünmek for(i=n+1;i<(x.length);i++)için for(i=n;++i<x.length;). Aynı şekilde, değiştirebilir n<(x.length-1);n++içinn++<x.length-1
musicman523

0

J , 17 bayt

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

Çevrimiçi deneyin!

açıklama

({~$#: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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.