Produk Cartesian dari dua daftar

14

Tugas

Diberikan dua daftar karakter, hasilkan produk Kartesius mereka, yaitu daftar pasangan dari setiap huruf dari daftar pertama dengan setiap huruf dari daftar kedua.

Contoh

"123456"dan "abcd"berikan:

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

Memasukkan

Dua daftar karakter atau string. Karakter yang digunakan akan berupa alfanumerik a-z, A-Z, 0-9dan sebuah karakter dapat muncul beberapa kali sekaligus di kedua input pada saat yang bersamaan.

Keluaran

Produk Cartesian dari daftar input. Yaitu, daftar setiap pasangan karakter yang mungkin dipesan dari daftar pertama dan karakter dari daftar kedua. Setiap pasangan adalah daftar atau string atau mirip dengan dua karakter, atau dua string panjang-satu. Panjang output akan sama dengan produk dari panjang input.

Pasangan harus terdaftar dalam urutan; pertama daftar karakter pertama dari daftar pertama dengan yang pertama dari daftar kedua, diikuti oleh semua pasangan karakter pertama dari daftar pertama. Pasangan terakhir terdiri dari karakter terakhir dari daftar pertama bersama-sama dengan karakter terakhir dari daftar kedua.

Outputnya harus berupa daftar pasangan datar; bukan matriks 2D di mana pasangan dikelompokkan berdasarkan elemen pertama atau kedua.

Uji kasus

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"]]
alexandros84
sumber
@ Adám Berubah. Saya mengalami kesulitan meskipun mengatakan bahwa karakter yang berulang dalam string input dapat dan harus menyebabkan pasangan berulang dalam output (dengan asumsi itulah bagaimana menafsirkannya).
xnor
@ xnor mungkin lebih mudah jika urutan pasangan diperbaiki?
Adám
Mengapa judul mengatakan "daftar" namun badan mengatakan "daftar karakter"?
Leaky Nun
Hanya untuk memastikan: apakah ["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"]format output yang valid?
Shaggy
1
Anda menandai ini karena code-golfitu jawaban terpendek menang. Dalam hal seri, jawaban pertama untuk mencapai skor itu biasanya adalah pemenang (saat ini yang ini ). Berikan beberapa hari lagi, setidaknya, sebelum menerima jawaban, jika, sama sekali. Dan lihat di sini untuk panduan tentang menjawab pertanyaan Anda sendiri.
Shaggy

Jawaban:

7

Mathematica, 12 byte

Tuples@{##}&

Mengambil dua daftar karakter sebagai input.

alephalpha
sumber
1
Panjang yang sama: Tuples@*ListAtau, jika kepala sewenang-wenang diizinkan:Tuples@*f
CalculatorFeline
5

APL (Dyalog) , 4 byte

,∘.,

Cobalah online!

, meratakan

∘. Cartesian

, rangkaian

Adm
sumber
Saya pikir flattenini bukan deskripsi yang baik di sini, karena perataan akan menghasilkan hasil yang salah, saya pikir "kencangkan" atau "kurangi peringkat" atau sesuatu yang serupa seharusnya bekerja. (Diratakan [1,2] x [1,2] adalah [1,1,1,2,2,1,2,2])
Zacharý
4

Ruby , 30 18 byte

-12 byte dari Jordan mengingatkan saya tentang cara menggunakan spec untuk keuntungan saya!

Mengambil daftar karakter sebagai input.

->a,b{a.product b}

Cobalah online!

Nilai Tinta
sumber
1
Spesifikasi mengatakan inputnya adalah "Dua daftar karakter atau string," jadi saya rasa Anda tidak perlu .chars.
Jordan
1
Sayang browser tidak berbicara ruby. Bahasa yang ramah ..
alexandros84
4

Perl 6 , 4 byte

&[X]

Ini hanya referensi ke operator produk lintas bawaan X. Ini berfungsi pada daftar apa pun, bukan hanya karakter.

Sean
sumber
3

Oktaf, 32 byte

@(a,b)[(a+~b')(:) (b'+~a)(:) '']

Cobalah online!

rahnema1
sumber
3

Tcl , 60 byte

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

Menggunakan:

% 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}
avl42
sumber
3

JavaScript (ES6), 45 36 34 33 byte

Membutuhkan Firefox. Mengambil input sebagai string atau sebagai array karakter individu.

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

Cobalah

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>

Shaggy
sumber
Destrukturisasi juga bekerja pada string.
Neil
Terima kasih, @Neil; lupa memperbarui itu setelah saya mengubah metode yang saya gunakan.
Shaggy
Apakah x+yformat output yang valid?
Neil
@ Neil: Itulah awalnya saya akan pergi dengan tetapi, dari kasus uji, tampaknya tidak akan valid; membaca ulang persyaratan output, meskipun, mereka tampaknya mengindikasikan bahwa itu mungkin. Saya akan meminta klarifikasi untuk memastikan.
Shaggy
1
@ alexandros84: Ya, ES6 (+) sangat penting jika Anda memiliki peluang kecil untuk bisa bersaing dalam golf - saat Anda mengetik function, Anda sudah kalah! Saya akan memberikan beberapa petunjuk pada jawaban Anda nanti, tetapi sementara itu, lihat solusi pemetaan array asli saya dalam sejarah edit; Anda harus bisa merobeknya dan mengganti fungsi panah dengan fungsi "nyata".
Shaggy
3

Bash, 18

Ini dapat dilakukan dengan ekspansi brace:

eval echo {$1}{$2}

Cobalah online .

Trauma Digital
sumber
2

Brachylog , 5 byte

{∋ᵐ}ᶠ

Cobalah online!

Penjelasan

Cukup jelas

{  }ᶠ       Find all:
  ᵐ           Map:
 ∋              In
Fatalisasi
sumber
2

QBIC , 29 byte

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

Ini mencetak string 2-char dengan semua kombinasi pada satu baris masing-masing.

Penjelasan

   ;      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
steenbergh
sumber
2

Pyth , 3 byte

*ww

Mengalikan dua string hanya bertindak sebagai produk kartesius.

Uji secara online!

Jim
sumber
Solusi 2 Bytes *Eakan diperlukan untuk menukar urutan string input :( pyth.herokuapp.com/…
KarlKastor
2

MATL , 2 byte

Z*

*adalah operator umum untuk produk dan awalan Zmenjadikannya produk kartesius dan dapat mengambil dua string sebagai argumen.

Cobalah online!

cacat
sumber
2

J, 3 byte

,@{

Ini adalah kata kerja Katalog dalam J. Kita perlu Ravel ( ,) hasilnya untuk membuatnya 1 dimensi.

Cobalah online!

Jonah
sumber
2

Common Lisp, 63 byte

(lambda(a b)(mapcan(lambda(x)(mapcar(lambda(y)(list x y))b))a))

Cobalah online!

Renzo
sumber
1

Clojure, 21 byte

#(for[i % j %2][i j])
NikoNyrh
sumber
1

PHP , 69 byte

<?foreach($_GET[0]as$x)foreach($_GET[1]as$y)$r[]=[$x,$y];print_r($r);

Cobalah online!

Jörg Hülsermann
sumber
1

Python 2 , 39 byte

lambda x,y:[[i,j]for i in x for j in y]

Cobalah online!

Solusi alternatif, 34 30 byte

-4 byte berkat Anders Kaseorg.

Ada built-in untuk ini ...

from itertools import*
product
benar-benar manusiawi
sumber
30 byte:from itertools import*;product
Anders Kaseorg
1

05AB1E , 10 byte

v²NFÀ}¹ø)˜

Cobalah online!

Ini tanpa built-in, dan tidak diragukan lagi tidak akan kompetitif.

Guci Gurita Ajaib
sumber
Output Untuk input "aba" "aa" sepertinya salah
RosLuP
1

Retina , 49 byte

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

Cobalah online! Mengambil input pada saluran terpisah. Penjelasan:

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

Setiap karakter dalam string pertama menghasilkan baris terpisah yang diawali oleh string kedua.

¶¶.+
¶

String kedua asli dihapus.

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

Untuk setiap karakter di string pertama, setiap karakter di string kedua menghasilkan baris terpisah yang diawali dengan karakter pertama.

¶.¶
¶

Karakter sisa dari string pertama dihapus.

Neil
sumber
1

q / kdb +, 5 byte

Larutan:

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

Contoh:

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

Arang , 8 7 byte

FθEη⁺ικ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan: Variabel θdan ηsecara implisit merujuk pada dua string input. The perintah loop atas setiap karakter dari input pertama, sedangkan perintah peta lebih setiap karakter dari input kedua concatenating variabel loop ιdan variabel peta κ, yang hasilnya secara implisit dicetak pada baris terpisah.

Neil
sumber
Ini tampaknya 19 byte.
CalculatorFeline
@CalculatorFeline Charcoal memiliki halaman kode sendiri .
Neil
1

R , 29 byte

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

Cobalah online!

Perhatikan bahwa matriks R diisi oleh kolom, sehingga hasilnya dalam urutan yang ditentukan oleh spesifikasi.

Jika diizinkan untuk memiliki factorsinput dan output, ada built-in ... tetapi orang perlu mengekstraksi tingkat yang dihasilkan dari faktor sehingga pada akhirnya akan lebih dari 29 byte.

R , 11 byte

interaction

Cobalah online!

JayCe
sumber
1

Japt , 5 2 byte

Japt sekarang memiliki metode untuk produk Cartesian.

Mengambil input sebagai 2 larik string karakter.

ïV

Cobalah

Shaggy
sumber
1

C # 7, 78 63 byte

(a,b)=>$"({string.Join(",",a.SelectMany(x=>b,(x,y)=>(x,y)))})";
Dennis_E
sumber
ini bukan program lengkap atau fungsi
ASCII
Anda seharusnya menulis program lengkap atau fungsi dan bukan cuplikan.
Muhammad Salman
Saya baru saja mengubahnya. Tetapi banyak jawaban di halaman ini bukan program atau fungsi lengkap. Tidak yakin mengapa yang ini dipilih.
Dennis_E
btw, ini sebabnya saya tidak suka kode golf.
Dennis_E
Karena ini adalah fungsi, Anda dapat langsung mengembalikan string output daripada menulisnya ke layar, saya pikir itu menghemat ~ 20 byte.
sundar - Reinstate Monica