İki listenin kartezyen çarpımı


14

Görev

İki karakter listesi verildiğinde, Kartezyen ürünlerini, yani ilk listeden her harfin ikinci listeden her harfle eşleşmelerinin listesini çıkarın.

Misal

"123456"ve "abcd"verin:

[["1","a"],["1","b"],["1","c"],["1","d"],["2","a"],["2","b"],["2","c"],["2","d"],["3","a"],["3","b"],["3","c"],["3","d"],["4","a"],["4","b"],["4","c"],["4","d"],["5","a"],["5","b"],["5","c"],["5","d"],["6","a"],["6","b"],["6","c"],["6","d"]]

Giriş

İki karakter veya dize listesi. Kullanılan karakterler alfasayısal olacak a-z, A-Z, 0-9ve bir karakter hem birden çok kez hem de her iki girişte aynı anda oluşabilir.

Çıktı

Giriş listelerinin Kartezyen ürünü. Yani, ilk listeden bir sırayla bir karakter çiftinin ve ikinci listeden bir karakterin sıralı listesi. Her çift, iki karakterden veya iki uzunluk bir dizeden oluşan bir liste veya dize veya benzeridir. Çıktının uzunluğu, girdilerin uzunluklarının çarpımına eşit olacaktır.

Çiftler sırayla listelenmelidir; ilk önce birinci listenin ilk karakterini ikinci listenin ilki ile listelemek, ardından ilk listenin ilk karakterinin tüm eşleşmelerini izlemek. Son çift, ikinci listenin son karakteri ile birlikte ilk listenin son karakterinden oluşur.

Çıktı, düz bir çift listesi olmalıdır; çiftlerin birinci veya ikinci elemanlarına göre gruplandırıldığı bir 2D matris değil.

Test senaryoları

inputs               output

"123456", "abcd"     [["1","a"],["1","b"],["1","c"],["1","d"],["2","a"],["2","b"],["2","c"],["2","d"],["3","a"],["3","b"],["3","c"],["3","d"],["4","a"],["4","b"],["4","c"],["4","d"],["5","a"],["5","b"],["5","c"],["5","d"],["6","a"],["6","b"],["6","c"],["6","d"]]
"abc", "123"         [["a","1"],["a","2"],["a","3"],["b","1"],["b","2"],["b","3"],["c","1"],["c","2"],["c","3"]]
"aa", "aba"          [["a","a"],["a","b"],["a","a"],["a","a"],["a","b"],["a","a"]]

@ Adám Değişti. Ben bir giriş dizesinde tekrarlanan karakterler olabilir ve çıkış (bu nasıl yorumlamak varsayalım) varsayalım yinelenen çiftlere neden olmalıdır ifade rağmen sorun yaşıyorum.
xnor

@xnor çiftlerin sırası sabitse daha kolay olabilir mi?
Adám

Neden başlık "liste" diyor, ancak gövde "karakter listesi" diyor?
Sızan Rahibe

Emin olmak için: ["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"]geçerli bir çıktı biçimi mi?
Shaggy

1
Bunu code-golfen kısa cevap kazanacağı için etiketlediniz . Beraberlik durumunda, bu puana ulaşmanın ilk cevabı genellikle kazanır (şu anda bu ). Yine de, bir cevap kabul etmeden önce, en azından birkaç gün daha verin. Kendi sorunuzu cevaplamaya ilişkin yönergeler için buraya bakın .
Shaggy

Yanıtlar:




7

Mathematica, 12 bayt

Tuples@{##}&

Girdi olarak iki karakter listesi alır.


1
Aynı uzunluk: Tuples@*ListAlternatif olarak, rastgele kafalara izin verilirse:Tuples@*f
CalculatorFeline

5

APL (Dyalog) , 4 bayt

,∘.,

Çevrimiçi deneyin!

, düzleştirmek

∘. Kartezyen

, birbirine bağlama


Sanmıyorum flattenyanlış sonuç üretecektir düzleşme beri ben "sıkın" veya "rütbe azaltmak" veya benzeri bir çalışması gerektiğini düşünüyorum, burada iyi bir açıklama olduğunu. (Düzleştirilmiş [1,2] x [1,2] [1,1,1,2,2,1,2,2])
Zacharý

4

Yakut , 30 18 bayt

Ürdün'den -12 bayt, bana avantajı kullanmanın bir yolunu hatırlatıyor!

Girdi olarak karakter listelerini alır.

->a,b{a.product b}

Çevrimiçi deneyin!


1
Spesifikasyon, girdinin "İki karakter veya dizgi listesi" olduğunu söylüyor, bu yüzden ihtiyacınız olduğunu düşünmüyorum .chars.
Ürdün

1
Bu utanç verici tarayıcılar yakut konuşma. Böyle samimi bir dil ..
alexandros84

4

Perl 6 , 4 bayt

&[X]

Bu sadece yerleşik çapraz ürün operatörü için bir referanstır X. Sadece karakterlerde değil, her tür listede çalışır.




3

Tcl , 60 bayt

proc p x\ y {lmap X $x {lmap Y $y {lappend l $X\ $Y}};set l}

kullanın:

% p {1 2 3} {a 2 2}
{1 a} {1 2} {1 2} {2 a} {2 2} {2 2} {3 a} {3 2} {3 2}

3

JavaScript (ES6), 45 36 34 33 bayt

Firefox gerektirir. Her iki girişi de dize olarak veya tek tek karakter dizileri olarak alır.

a=>b=>[for(x of a)for(y of b)x+y]

Dene

f=
a=>b=>[for(x of a)for(y of b)x+y]
oninput=_=>console.clear()&console.log(f(i.value)(j.value))
console.log(f(i.value="123456")(j.value="abcd"))
<input id=i><input id=j>


Yıkım dizelerde de çalışır.
Neil

Teşekkürler, @Neil; kullandığım yöntemi değiştirdikten sonra güncellemeyi unuttum.
Shaggy

x+ygeçerli bir çıkış biçimi?
Neil

@Neil: Başlangıçta devam edeceğim şey buydu, ancak test vakalarından geçerli olmayacak gibi görünüyor; Ancak, çıktı gereksinimlerini yeniden okurken, bunun olabileceğini belirtiyorlar. Emin olmak için açıklama isteyeceğim.
Shaggy

1
@ alexandros84: Evet, ES6 (+), golfte rekabet edebilmek için uzak bir şansınız olsa bile çok önemlidir - yazdığınız zaman function, zaten kaybettiniz! Daha sonra cevabınıza birkaç işaret edeceğim, ancak bu arada, düzenleme geçmişindeki orijinal dizi eşleme çözümüme bir göz atacağım; bunu söküp ok işlevlerini "gerçek" işlevlerle değiştirebilmeniz gerekir.
Shaggy



2

QBIC , 29 bayt

[_l;||[_l;||?_sA,a,1|+_sB,b,1

Bu, tüm kombinasyonların her birinde bir satır bulunan 2 karakterlik dizeler yazdırır.

açıklama

   ;      Read in string A$
 _l |     Get its length as b
[    |    and kick off a FOR-loop from 1 to that
[_l;||    Do the same for B$
          Note that, while the FOR-loop may pass this code several times, the
          'read-from cmd line' is done only once.
?_sA,a,1| PRINT the character from A$ at the position of the 'a' loop counter
+_sB,a,1   concatenated with the char from B$ at the pos of the 'b' loop counter












1

Retina , 49 bayt

.(?=.*¶(.+))
$1$&¶
¶¶.+
¶
.(?=.*(.)¶)
$1$&¶
¶.¶
¶

Çevrimiçi deneyin! Ayrı satırlarda girdi alır. Açıklama:

.(?=.*¶(.+))
$1$&¶

İlk dizgideki her karakter, ikinci dizginin önüne ek olarak ayrı bir satır oluşturur.

¶¶.+
¶

Orijinal ikinci dize silinir.

.(?=.*(.)¶)
$1$&¶

İlk dizgideki her karakter için, ikinci dizgideki her karakter, ilk karakterle önek olarak ayrılmış ayrı bir satır oluşturur.

¶.¶
¶

İlk dizeden kalan karakterler silinir.


1

q / kdb +, 5 bayt

Çözüm:

cross           / yup, there's a built-in to do exactly this

Misal:

q)"123456"cross"abcd"
"1a"
"1b"
"1c"
"1d"
"2a"
"2b"
"2c"
"2d"
"3a"
"3b"
"3c"
"3d"
"4a"
"4b"
...etc

1

Kömür , 8 7 bayt

FθEη⁺ικ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama: Değişkenler θve ηdolaylı olarak iki giriş dizesine atıfta bulunur. İse komut, birinci girişin her karakter üzerinde döngüler komut döngüsü değişken bitiştirme ikinci girişin her karakter üzerinde haritalar ιve harita değişken κdolaylı olarak, farklı çizgileri üzerine basılır bunun sonucu.


Bu 19 bayt gibi görünüyor.
CalculatorFeline

@CalculatorFeline Kömürün kendi kod sayfası vardır .
Neil

1

R , 29 bayt

function(x,y)outer(x,y,paste)

Çevrimiçi deneyin!

R matrisinin sütunla doldurulduğunu unutmayın, bu nedenle sonuç, spesifikasyon tarafından dikte edilen sıradadır.

factorsGiriş ve çıkış için izin verilirse , bir yerleşik vardır ... ancak sonuç düzeylerini faktörden çıkarması gerekir, böylece sonunda 29 bayttan fazla olur.

R , 11 bayt

interaction

Çevrimiçi deneyin!


1

Japt , 5 2 bayt

Japt'un artık Kartezyen ürün için bir yöntemi var.

Girdiyi karakter dizgilerinin 2 dizisi olarak alır.

ïV

Dene


1

C # 7, 78 63 bayt

(a,b)=>$"({string.Join(",",a.SelectMany(x=>b,(x,y)=>(x,y)))})";

bu tam bir program veya bir işlev değil
sadece ASCII

Parçacık değil, tam bir program veya işlev yazmanız gerekir.
Muhammed Salman

Sadece değiştirdim. Ancak bu sayfadaki birçok yanıt tam program veya işlev değildir. Bunun neden seçildiğinden emin değilim.
Dennis_E

btw, bu yüzden kod golfünü sevmiyorum.
Dennis_E

Bu bir işlev olduğundan, çıktı dizesini ekrana yazmak yerine doğrudan döndürebilirsiniz, bence bu sizi ~ 20 bayt kurtarır.
sundar - Monica'yı eski haline
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.