Produit cartésien de deux listes


14

Tâche

Étant donné deux listes de caractères, sortez leur produit cartésien, c'est-à-dire la liste des appariements de chaque lettre de la première liste avec chaque lettre de la deuxième liste.

Exemple

"123456"et "abcd"donner:

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

Contribution

Deux listes de caractères ou de chaînes. Les caractères utilisés seront alphanumériques a-z, A-Z, 0-9et un caractère peut apparaître à la fois plusieurs fois et dans les deux entrées en même temps.

Production

Produit cartésien des listes d'entrées. C'est-à-dire une liste de chaque paire ordonnée possible d'un caractère de la première liste et d'un caractère de la seconde liste. Chaque paire est une liste ou une chaîne ou similaire de deux caractères ou de deux chaînes de longueur un. La longueur de la sortie sera égale au produit des longueurs des entrées.

Les paires doivent être répertoriées dans l'ordre; listant d'abord le premier caractère de la première liste avec le premier de la deuxième liste, suivi de tous les appariements du premier caractère de la première liste. La dernière paire se compose du dernier caractère de la première liste avec le dernier caractère de la deuxième liste.

La sortie doit être une liste plate de paires; pas une matrice 2D où les paires sont groupées par leur premier ou deuxième élément.

Cas de test

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 a changé. J'ai du mal à formuler que les caractères répétés dans une chaîne d'entrée peuvent et devraient provoquer des paires répétées dans la sortie (en supposant que c'est ainsi que l'interpréter).
xnor

@xnor peut-être plus facile si l'ordre des paires est fixe?
Adám

Pourquoi le titre dit "liste" et le corps dit "liste de personnages"?
Leaky Nun

Juste pour être sûr: est ["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"]un format de sortie valide?
Shaggy

1
Vous avez marqué cela comme la code-golfréponse la plus courte l'emporte donc. En cas d'égalité, la première réponse pour atteindre ce score est généralement le vainqueur (actuellement celui-ci ). Donnez-lui encore quelques jours, au moins, avant d'accepter une réponse, le cas échéant. Et voyez ici pour des directives sur la façon de répondre à votre propre question.
Shaggy

Réponses:




7

Mathematica, 12 octets

Tuples@{##}&

Prend deux listes de caractères en entrée.


1
Même longueur: Tuples@*ListAlternativement, si des têtes arbitraires sont autorisées:Tuples@*f
CalculatorFeline

5

APL (Dyalog) , 4 octets

,∘.,

Essayez-le en ligne!

, aplatir

∘. le cartésien

, enchaînement


Je ne pense pas que ce flattensoit une bonne description ici, car l'aplatissement produirait un résultat incorrect, je pense que "resserrer" ou "réduire le classement" ou quelque chose de similaire devrait fonctionner. (Aplati [1,2] x [1,2] est [1,1,1,2,2,1,2,2])
Zacharý

4

Rubis , 30 18 octets

-12 octets de Jordan me rappelant un moyen d'utiliser la spécification à mon avantage!

Prend des listes de caractères en entrée.

->a,b{a.product b}

Essayez-le en ligne!


1
La spécification indique que l'entrée est "Deux listes de caractères ou de chaînes", donc je ne pense pas que vous en ayez besoin .chars.
Jordan

1
C'est dommage que les navigateurs ne parlent pas de rubis. Une telle langue amicale ..
alexandros84

4

Perl 6 , 4 octets

&[X]

Ceci est juste une référence à l'opérateur intégré de produits croisés X. Il fonctionne sur des listes de toutes sortes, pas seulement sur des personnages.




3

Tcl , 60 octets

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

Utilisation:

% 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 octets

Nécessite Firefox. Prend les deux entrées sous forme de chaînes ou de tableaux de caractères individuels.

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

Essayez-le

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>


La déstructuration fonctionne également sur les cordes.
Neil

Merci, @Neil; oublié de mettre à jour cela après avoir changé la méthode que j'utilisais.
Shaggy

Le x+yformat de sortie est -il valide?
Neil

@Neil: C'est ce que j'allais à l'origine, mais d'après les cas de test, il semble que ce ne serait pas valide; en relisant les exigences de sortie, cependant, ils semblent indiquer que ce pourrait être le cas. Je vais demander des éclaircissements pour être sûr.
Shaggy

1
@ alexandros84: Oui, ES6 (+) est essentiel si vous voulez avoir une chance, même à distance, d'être compétitif dans le golf - au moment où vous avez tapé function, vous avez déjà perdu! Je jetterai quelques pointeurs sur votre réponse plus tard, mais en attendant, jetez un œil à ma solution de mappage de tableau d'origine dans l'historique des modifications; vous devriez être en mesure d'extraire cela et de remplacer les fonctions fléchées par des fonctions "réelles".
Shaggy



2

QBIC , 29 octets

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

Cela imprime des chaînes de 2 caractères avec toutes les combinaisons sur une ligne chacune.

Explication

   ;      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


2

MATL , 2 octets

Z*

*est l'opérateur général des produits et le préfixe en Zfait le produit cartésien et peut prendre deux chaînes comme arguments.

Essayez-le en ligne!











1

Rétine , 49 octets

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

Essayez-le en ligne! Prend l'entrée sur des lignes distinctes. Explication:

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

Chaque caractère de la première chaîne génère une ligne distincte préfixée par la deuxième chaîne.

¶¶.+
¶

La deuxième chaîne d'origine est supprimée.

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

Pour chaque caractère de la première chaîne, chaque caractère de la deuxième chaîne génère une ligne distincte préfixée avec le premier caractère.

¶.¶
¶

Les caractères restants de la première chaîne sont supprimés.


1

q / kdb +, 5 octets

Solution:

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

Exemple:

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

1

Fusain , 8 7 octets

FθEη⁺ικ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication: Les variables θet ηfont implicitement référence aux deux chaînes d'entrée. La commande boucle sur chaque caractère de la première entrée, tandis que la commande mappe sur chaque caractère de la deuxième entrée concaténant la variable de boucle ιet la variable de mappage κ, dont le résultat est implicitement imprimé sur des lignes distinctes.


Cela semble être de 19 octets.
CalculatorFeline

@CalculatorFeline Charcoal a sa propre page de codes .
Neil

1

R , 29 octets

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

Essayez-le en ligne!

Notez que la matrice R est remplie par colonne, donc le résultat est dans l'ordre dicté par la spécification.

S'il est permis d'avoir factorspour l'entrée et la sortie, il y a un intégré ... mais il faut extraire les niveaux résultants du facteur donc à la fin ce serait plus de 29 octets.

R , 11 octets

interaction

Essayez-le en ligne!


1

Japt , 5 2 octets

Japt dispose désormais d'une méthode pour le produit cartésien.

Prend l'entrée comme 2 tableaux de chaînes de caractères.

ïV

Essayez-le


1

C # 7, 78 63 octets

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

ce n'est pas un programme complet ni une fonction
ASCII uniquement

Vous êtes censé écrire un programme complet ou une fonction et non un extrait.
Muhammad Salman

Je viens de le changer. Mais de nombreuses réponses sur cette page ne sont pas des programmes ou des fonctions complets. Je ne sais pas pourquoi celui-ci est choisi.
Dennis_E

btw, c'est pourquoi je n'aime pas le golf de code.
Dennis_E

Comme il s'agit d'une fonction, vous pouvez retourner directement la chaîne de sortie au lieu de l'écrire à l'écran, je pense que cela vous fait économiser environ 20 octets.
sundar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.