Produto cartesiano de duas listas

14

Tarefa

Dadas duas listas de caracteres, produza seu produto cartesiano, ou seja, a lista de pares de cada letra da primeira lista com cada letra da segunda lista.

Exemplo

"123456"e "abcd"dê:

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

Entrada

Duas listas de caracteres ou seqüências de caracteres. Os caracteres usados ​​serão alfanuméricos a-z, A-Z, 0-9e um caractere pode ocorrer várias vezes e em ambas as entradas ao mesmo tempo.

Resultado

O produto cartesiano das listas de entrada. Ou seja, uma lista de cada par ordenado possível de um personagem da primeira lista e um caractere da segunda lista. Cada par é uma lista ou sequência ou similar de dois caracteres ou de duas seqüências de comprimento um. O comprimento da saída será igual ao produto dos comprimentos das entradas.

Os pares devem ser listados em ordem; primeiro listando o primeiro caractere da primeira lista com o primeiro da segunda lista, seguido por todos os pares do primeiro caractere da primeira lista. O último par consiste no último caractere da primeira lista, juntamente com o último caractere da segunda lista.

A saída deve ser uma lista simples de pares; não é uma matriz 2D em que os pares são agrupados por seu primeiro ou segundo elemento.

Casos de teste

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
fonte
@ Adám Changed. Estou tendo problemas para dizer que caracteres repetidos em uma string de entrada podem e devem causar pares repetidos na saída (assumindo que é assim que interpretá-la).
Xnor
@ xnor talvez seja mais fácil se a ordem dos pares for fixa?
Adám
Por que o título diz "lista" e o corpo diz "lista de caracteres"?
Freira vazada
Só para ter certeza: é ["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"]um formato de saída válido?
Shaggy
1
Você marcou isso como a code-golfresposta mais curta ganha. Em caso de empate, a primeira resposta para alcançar essa pontuação é geralmente o vencedor (atualmente este ). Dê mais alguns dias, pelo menos, antes de aceitar uma resposta, se for o caso. E veja aqui as diretrizes para responder sua própria pergunta.
Shaggy

Respostas:

7

Mathematica, 12 bytes

Tuples@{##}&

Leva duas listas de caracteres como entrada.

alefalpha
fonte
1
Mesmo comprimento: Tuples@*ListAlternativamente, se são permitidos cabeças arbitrárias:Tuples@*f
CalculatorFeline
5

APL (Dyalog) , 4 bytes

,∘.,

Experimente online!

, aplainar

∘. o cartesiano

, concatenação

Adão
fonte
Não acho que flattenseja uma boa descrição aqui, já que o achatamento produziria o resultado incorreto, acho que "apertar" ou "reduzir a classificação" ou algo semelhante deve funcionar. (Achatado [1,2] x [1,2] é [1,1,1,2,2,1,2,2])
Zacharý
4

Ruby , 30 18 bytes

-12 bytes da Jordânia, lembrando-me de uma maneira de usar as especificações em meu proveito!

Leva listas de caracteres como entrada.

->a,b{a.product b}

Experimente online!

Value Ink
fonte
1
A especificação diz que a entrada é "Duas listas de caracteres ou seqüências de caracteres", então não acho que você precise .chars.
Jordan
1
É uma pena que os navegadores não falem rubi. Uma linguagem tão amigável ..
alexandros84
4

Perl 6 , 4 bytes

&[X]

Esta é apenas uma referência ao operador interno de produtos cruzados X. Funciona em listas de qualquer tipo, não apenas em caracteres.

Sean
fonte
3

Oitava, 32 bytes

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

Experimente online!

rahnema1
fonte
3

Tcl , 60 bytes

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

Usar:

% 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
fonte
3

JavaScript (ES6), 45 36 34 33 bytes

Requer Firefox. Recebe as duas entradas como seqüências de caracteres ou como matrizes de caracteres individuais.

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

Tente

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
fonte
A reestruturação também funciona em strings.
911 Neil
Obrigado, @Neil; esqueci de atualizar que depois que mudei o método que estava usando.
Shaggy
É x+yum formato de saída válido?
911 Neil
@ Neil: Era com isso que eu iria originalmente, mas, pelos casos de teste, parece que isso não seria válido; relendo os requisitos de saída, porém, eles parecem indicar que pode ser. Vou pedir esclarecimentos para ter certeza.
Shaggy
1
@ alexandros84: Sim, o ES6 (+) é essencial se você tiver uma chance remota de ser competitivo no golfe - no momento em que você digitou function, você já perdeu! Vou apontar algumas dicas para sua resposta mais tarde, mas, enquanto isso, dê uma olhada na minha solução original de mapeamento de matriz no histórico de edições; você deve ser capaz de extrair isso e substituir as funções de seta por funções "reais".
Shaggy
3

Bash, 18

Isso pode ser feito com expansões de chaves:

eval echo {$1}{$2}

Experimente online .

Trauma Digital
fonte
2

Braquilog , 5 bytes

{∋ᵐ}ᶠ

Experimente online!

Explicação

Bastante auto-explicativo

{  }ᶠ       Find all:
  ᵐ           Map:
 ∋              In
Fatalizar
fonte
2

QBIC , 29 bytes

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

Isso imprime seqüências de caracteres de 2 caracteres com todas as combinações em uma linha cada.

Explicação

   ;      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
fonte
2

Pitão , 3 bytes

*ww

Multiplicar duas cordas apenas atua como o produto cartesiano.

Teste online!

Jim
fonte
A solução 2 Bytes *Eexigiria para trocar a ordem das cadeias de entrada :( pyth.herokuapp.com/...
KarlKastor
2

MATL , 2 bytes

Z*

*é o operador geral de produtos e o prefixo o Ztorna o produto cartesiano e pode usar duas seqüências de caracteres como argumentos.

Experimente online!

flawr
fonte
2

J, 3 bytes

,@{

Este é o verbo Catalog em J. Precisamos Ravel ( ,) do resultado para torná-lo unidimensional.

Experimente online!

Jonah
fonte
2

Lisp comum, 63 bytes

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

Experimente online!

Renzo
fonte
1

Clojure, 21 bytes

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

Python 2 , 39 bytes

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

Experimente online!

Solução alternativa, 34 30 bytes

-4 bytes graças a Anders Kaseorg.

Há um built-in para isso ...

from itertools import*
product
totalmente humano
fonte
30 bytes:from itertools import*;product
Anders Kaseorg 8/17/17
1

05AB1E , 10 bytes

v²NFÀ}¹ø)˜

Experimente online!

Isso é sem o built-in e, sem dúvida, não será competitivo.

Urna de polvo mágico
fonte
A saída para a entrada "aba" "aa" parece errado
RosLuP
1

Retina , 49 bytes

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

Experimente online! Recebe entrada em linhas separadas. Explicação:

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

Cada caractere na primeira string gera uma linha separada prefixada pela segunda string.

¶¶.+
¶

A segunda sequência original é excluída.

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

Para cada caractere na primeira string, cada caractere na segunda string gera uma linha separada prefixada com o primeiro caractere.

¶.¶
¶

Os caracteres restantes da primeira string são excluídos.

Neil
fonte
1

q / kdb +, 5 bytes

Solução:

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

Exemplo:

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

Carvão , 8 7 bytes

FθEη⁺ικ

Experimente online! Link é a versão detalhada do código. Explicação: As variáveis θe se ηreferem implicitamente às duas cadeias de entrada. O comando faz um loop sobre cada caractere da primeira entrada, enquanto o comando mapeia cada caractere da segunda entrada concatenando a variável de loop ιe a variável de mapa κ, cujo resultado é impresso implicitamente em linhas separadas.

Neil
fonte
Isso parece ter 19 bytes.
CalculatorFeline
O @CalculatorFeline Charcoal tem sua própria página de código .
Neil
1

R , 29 bytes

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

Experimente online!

Observe que a matriz R é preenchida por coluna, portanto, o resultado está na ordem ditada pela especificação.

Se houver permissão factorspara entrada e saída, existe um built-in ... mas é preciso extrair os níveis resultantes do fator, de modo que no final seriam mais de 29 bytes.

R , 11 bytes

interaction

Experimente online!

JayCe
fonte
1

Japonês , 5 2 bytes

Japt agora tem um método para o produto cartesiano.

Recebe entrada como 2 matrizes de cadeias de caracteres.

ïV

Tente

Shaggy
fonte
1

C # 7, 78 63 bytes

(a,b)=>$"({string.Join(",",a.SelectMany(x=>b,(x,y)=>(x,y)))})";
Dennis_E
fonte
este não é um programa completo, nem uma função
ASCII-only
Você deve escrever um programa completo ou uma função e não um trecho.
Muhammad Salman
Eu apenas mudei. Mas muitas respostas nesta página não são programas ou funções completos. Não sei por que esse é escolhido.
precisa saber é o seguinte
Aliás, é por isso que não gosto de código de golfe.
Dennis_E
Como essa é uma função, você pode retornar diretamente a string de saída em vez de gravá-la na tela, acho que economiza ~ 20 bytes.
sundar - Restabelece Monica