Produto cartesiano de uma lista consigo mesmo n vezes


10

Ao receber uma lista de valores e um número inteiro positivo n, seu código deve gerar o produto cartesiano da lista com os próprios nhorários.

Por exemplo, no pseudocódigo, sua função pode ser semelhante a:

for x1 in list:
    for x2 in list:
        for x3 in list:
            ...
            for xn in list:
                print x1, x2, x3, ... , xn

Exemplo:

repeated_cart([1,2,3], 3)

1 1 1  
1 1 2  
1 1 3  
1 2 1  
1 2 2  
1 2 3  
1 3 1  
1 3 2  
1 3 3  
2 1 1  
2 1 2  
2 1 3  
2 2 1  
2 2 2  
2 2 3  
2 3 1  
2 3 2  
2 3 3  
3 1 1  
3 1 2  
3 1 3  
3 2 1  
3 2 2  
3 2 3  
3 3 1  
3 3 2  
3 3 3

Funções incorporadas (ou funções de bibliotecas importadas) que computam o produto cartesiano (ou energia) não são permitidas devido ao código resultante ser um pouco chato.

Entradas e saídas devem ser delimitadas, mas podem ser obtidas de qualquer método razoável.

a ordem em que a saída é fornecida não importa, mas duplicatas não são permitidas.

Esta é a primeira vez que publico uma pergunta, por isso, se fiz algo terrivelmente errado, diga-me.


5
Bem-vindo ao PPCG! Nada terrivelmente errado, mas dedique algum tempo para analisar esta meta post e respostas. Coisas a serem evitadas quando se escreve desafios
JayCe

4
e seguir em ponto de @JayCe, você poderia (deveria) pós em The Sandbox para obter feedback antes de postar uma pergunta :-)
Giuseppe

@Giuseppe Ok, eu vou fazer isso a partir de agora, graças :)
JoshM


11
Conjuntos @Jakob deve ser fino
JoshM

Respostas:



6

Lisp comum , 146 bytes

(defun f(l n)(if(< n 2)(loop for x in l collect(list x))(loop for a in l nconc(loop for b in(f l(1- n))collect(cons a b)))))(princ(f(read)(read)))

Experimente online!

destroçado

(defun nloops (lst n)
  (if (< n 1)
      '(())
      (if (< n 2)
          (loop for x in lst collect (list x))
          (loop for a in lst
                nconc (loop for b in (nloops lst (1- n))
                            collect (cons a b))))))

2
tipicamente sugerimos à espera de outras submissões antes de postar um de seu próprio :-)
Giuseppe

11
@Giuseppe Ok, obrigado pelo conselho :)
JoshM

11
você não tem que ter a declaração de impressão na apresentação, uma vez que uma função é permitido
ASCII-only

11


6

R , 41 bytes

function(l,n)unique(t(combn(rep(l,n),n)))

Experimente online!

combndefinitivamente não é um produto cartesiano embutido, pois calcula todas as ncombinações de sua entrada.

R , 40 bytes

function(l,n)expand.grid(rep(list(l),n))

Experimente online!

expand.grid provavelmente é um produto cartesiano embutido.


Parece que a ordem das permutações no seu envio principal está errada.
Kirill L.

@KirillL. existe uma razão específica para a ordem ser importante? Eu interpretei as especificações de saída como flexíveis o suficiente para permitir em qualquer ordem.
Giuseppe

existe o comentário do OP "verifique se a saída está na ordem certa", presumi que "certo" significa o mesmo que no exemplo.
Kirill L.

@KirillL. Ah Não vi isso; não está no corpo da pergunta, então eu não sabia que ela existia! Vou pedir que seja colocado lá para esclarecimentos.
Giuseppe

4

Perl 6 , 16 bytes

{[X,] $^a xx$^b}

Tente

Expulso:

{  # bare block lambda with placeholder parameters $a and $b

  [X,]         #reduce using Cross meta op combined with comma op

    $^a xx $^b # list repeat $a, by $b times
}

3

K (ngn / k) , 10 bytes

{x@+!y##x}

Experimente online!

{ }é uma função com argumentos xey

#x o comprimento do x

y##xa duração dos tempos xrepetidosy

!y##x todas as tuplas comprimento-y acima de 0,1, ..., comprimento (x) -1 como uma matriz transposta

+ transpor

x@elementos de xnesses índices


3

APL (Dyalog Classic) , 18 12 bytes

{⍺[↑,⍳⍵⍴≢⍺]}

Experimente online!

-6 bytes graças a @ngn!


você pode usar com um argumento vector para gerar índices e, em seguida, ⍺[ ]para obter os valores correspondentes
NGN

Recebi um RANK ERRORquando tentei fazer isso.
Zacharý


a única captura é com ⍵ = 1; nesse caso, ⍳ retorna um vetor simples, não um vetor de vetores aninhados de comprimento 1, como seria de esperar; é um daqueles erros que nunca se fixa, por razões de retro-compatibilidade
NGN



3

Ruby , 53 bytes

f=->l,n{n<2?l:l.flat_map{|i|f[l,n-1].map{|j|[i,*j]}}}

Experimente online!

Abordagem recursiva, não tão curta, mas com garantia de estar livre de quaisquer embutidos.

É tentador usar métodos de permutação, mas isso provavelmente não conta, e os documentos realmente não garantem a correção da ordem, embora pareça funcionar na prática:

Ruby , 35 bytes

->l,n{[*l.repeated_permutation(n)]}

Experimente online!



2

Raquete, 92 bytes

(define(f l n)(if(> n 0)(apply append(map(λ(r)(map(λ(e)(cons e r))l))(f l(- n 1))))'(())))

Experimente Online

Ungolfed

(define (f l n)
    (if (> n 0)
        (apply append
            (map
                (λ (r)
                    (map (λ (e) (cons e r)) l)
                )
                (f l (- n 1))
            )
        )
        '(())
    )
)

2

Geléia , 11 9 7 bytes

³;þẎƊ’¡

Experimente online!

Explicação

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times

Veja o comentário do OP: p
Zacharý

Meu comentário ao qual eu trouxe isso é: "Eu também estou assumindo que os componentes internos para todo o desafio também são desaprovados", então eu apenas assumi que está tudo bem.
Zacharý

Bem, vamos aguardar OP então
Zacharý

@ Zachary desculpe, a função de potência cartesiano não é permitido
JoshM

3
Não sei, dois aninhados para loops como esse são basicamente a definição de um produto cartesiano. No entanto, não estou dizendo que você deva mudar, mas acho que proibir o embutido nesse desafio é meio incerto.
Dylnan

2

Pure Bash (sem utilitários externos), 57

printf -vn %0$1d
a=${n//0/{$2\}}
eval echo ${a//\}{/\},{}

A entrada é fornecida como parâmetros da linha de comando; 1 é n, 2 é uma lista separada por vírgula.

printf -vn %0$1d         ;# Create a string of n "0"s in the variable v
a=${n//0/{$2\}}          ;# Replace each "0" with "{a,b,...m}"
eval echo ${a//\}{/\},{} ;# Replace each "}{" with "},{" and evaluate the resulting brace expansion

Experimente online!


2

Java 10, 19 + 135 = 154 bytes

import java.util.*;

List<List>f(Set l,int n){var o=new Stack();if(n<1)o.add(new Stack());else for(var t:l)for(var i:f(l,n-1)){i.add(t);o.add(i);}return o;}

Experimente Online

Ungolfed

List<List> f(Set l, int n) {
    var o = new Stack();
    if (n < 1)
        o.add(new Stack());
    else
        for (var t : l)
            for (var i : f(l, n - 1)) {
                i.add(t);
                o.add(i);
            }
    return o;
}

Agradecimentos

  • porta para Java 10 graças a Kevin Cruijssen

Se você usar Java 10 em vez de 8, poderá alterar Objecte Listnos loops for-each varpara -4 bytes. Além disso, você pode então mudar Set<List>fpara List<List>fe Set o=new HashSet();de var o=new Stack();para uma -1 byte adicional. Experimente online.
Kevin Cruijssen 30/05

Hmm. está deixando de fora tipos para lambdas não são mais válidos
somente ASCII

@ Somente ASCII Não, lambdas sem tipo são permitidas. Não pude usar um lambda aqui porque a solução usa recursão.
Jakob

@Jakob ah, isso mesmo> _>
somente ASCII

2

Oracle SQL, 177 bytes

Crie um tipo de coleção (31 bytes):

CREATE TYPE t IS TABLE OF INT;

Em seguida, use a consulta (146 bytes):

WITH n(a,b,c)AS(SELECT a,b,t()FROM i UNION ALL SELECT a,b-1,c MULTISET UNION t(COLUMN_VALUE)FROM n,TABLE(n.a)WHERE b>=0)SELECT c FROM n WHERE b=0

Supondo que os parâmetros de entrada estejam na tabela icom colunas ae b:

CREATE TABLE i (a t,b INT) NESTED TABLE a STORE AS t_a;
INSERT INTO i VALUES ( t(1,2,3), 3 );

SQL Fiddle

Resultados :

|     C |
|-------|
| 1,1,1 |
| 1,1,2 |
| 1,1,3 |
| 1,2,1 |
| 1,2,2 |
| 1,2,3 |
| 1,3,1 |
| 1,3,2 |
| 1,3,3 |
| 2,1,1 |
| 2,1,2 |
| 2,1,3 |
| 2,2,1 |
| 2,2,2 |
| 2,2,3 |
| 2,3,1 |
| 2,3,2 |
| 2,3,3 |
| 3,1,1 |
| 3,1,2 |
| 3,1,3 |
| 3,2,1 |
| 3,2,2 |
| 3,2,3 |
| 3,3,1 |
| 3,3,2 |
| 3,3,3 |

1

Bash , 61 bytes

N=$1
shift
IFS=,
printf echo\\t%${N}s ""|sed "s/ /{$*},/g"|sh

Experimente online! Achei repetidas seqüências de caracteres e juntei listas com vírgulas surpreendentemente difíceis de fazer no bash.


1

Javascript (Nó) , 75 bytes

c=(m,n,a,i)=>a.length-n?m.map((_,j)=>c(m,n,[...a,m[j]],i+1)):console.log(a)

Função recursiva que envia a lista para o console. Onde aestá uma matriz vazia e ié 0 (não tenho certeza se isso ainda está qualificado):

c([1,2,3], 3, [], 0);

Experimente online!


11
Eu acho que você teria que fazer(m,n,a=[],i=0)=>
Artyer


1

J , 17 bytes

]{~(##)#:#@]i.@^[

Como funciona?

nEnumero todos os números de dígitos em um sistema numérico com base no comprimento da lista.

            i.         - creates a list from zero to (not including)
         #@]           - the length of the list 
              @^       - to the power of
                [      - n (left argument)
   (##)                - creates a list of n times the length of the list (for the bases)
       #:              - converts all the numbers into lists of digits in the new base
]{~                    - use the digits as indices into the list

Experimente online!


1

CJam , 26 bytes

q~(_"m*:e_"*\'_*@\~W$~:p];

Experimente online!

Se apenas o CJam tivesse comandos de um caractere para produto cartesiano e achatamento.



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.