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

@ 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.


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


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!


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.




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}

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>


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



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


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!











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.


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

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.


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!


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


1

C # 7, 78 63 bytes

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.