Bir listenin kendisi ile birlikte n kez kartezyen çarpımı


10

Değerler listesi ve pozitif bir tamsayı verildiğinde n, kodunuz listenin kartezyen ürününü kendi nzamanlarıyla çıkarmalıdır .

Örneğin, sözde kodda işleviniz aşağıdakine benzer olabilir:

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

Misal:

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

Kartezyen ürünü (veya gücü) hesaplayan yerleşik işlevlere (veya içe aktarılan kitaplıklardan gelen işlevlere), sonuçtaki kodun biraz sıkıcı olması nedeniyle izin verilmez.

Girdiler ve çıktılar sınırlandırılmalıdır ancak makul herhangi bir yöntemle alınabilir.

çıkışın verildiği sıra önemli değildir ancak kopyalara izin verilmez.

Bu benim ilk kez bir soru gönderiyorum, bu yüzden çok yanlış bir şey yaptıysam, lütfen söyle.


5
PPCG'ye Hoşgeldiniz! Korkunç bir şey yanlış değil, ama bu meta gönderiye ve cevaplara bakmak için biraz zaman ayırın. Zorluklar yazarken kaçınılması gereken şeyler
JayCe

4
ve @JayCe 'ın noktada takip etmek, sen post (olmalı) olabilir Sandbox :-) Soru göndermek önce geri almak için
Giuseppe

@Giuseppe Tamam, bundan sonra yapacağım, teşekkürler :)
JoshM


1
@ Jakob setleri iyi olmalı
JoshM

Yanıtlar:



6

Ortak Lisp , 146 bayt

(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)))

Çevrimiçi deneyin!

ungolfed

(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
tipik olarak bizden birini göndermeden önce diğer gönderileri beklemenizi öneririz :-)
Giuseppe

1
@Giuseppe Tamam, tavsiye için teşekkürler :)
JoshM

1
bir işleve izin verildiğinden, gönderimde basılı ifadeye sahip olmanız gerekmez
yalnızca ASCII-

1
öyleyse: 96
sadece ASCII


6

R , 41 bayt

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

Çevrimiçi deneyin!

combnkesinlikle kartezyen bir ürün değildir, çünkü ngirdisinin tüm kombinasyonlarını hesaplar .

R , 40 bayt

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

Çevrimiçi deneyin!

expand.grid muhtemelen kartezyen bir üründür.


Görünüşe göre, ana gönderiminizdeki permütasyon sırası yanlış.
Kirill L.

@KirillL. siparişin önemli bir nedeni var mı? Çıktı spesifikasyonunu herhangi bir sırada izin verecek kadar esnek olarak yorumladım.
Giuseppe

OP'nin "çıktının doğru sırada olduğundan emin olun" yorumu var, "doğru" ifadesinin örnekte olduğu anlamına geldiğini varsayıyorum.
Kirill L.

@KirillL. Ah. Görmedim; sorunun bedeninde değil, bu yüzden var olduğunu bilmiyordum! Bunun açıklığa kavuşturulmasını isteyeceğim.
Giuseppe


3

K (ngn / k) , 10 bayt

{x@+!y##x}

Çevrimiçi deneyin!

{ }bağımsız değişkenleri olan bir işlevdir xvey

#x uzunluğu x

y##xxtekrarlanan ysürelerin uzunluğu

!y##x bir transpoze matris olarak 0,1, ..., uzunluk (x) -1 üzerinde tüm uzunluk-y tuples

+ devrik

x@xbu endekslerdeki unsurlar


3

APL (Dyalog Klasik) , 18 12 bayt

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

Çevrimiçi deneyin!

@Ngn sayesinde -6 bayt!


Eğer yapabilirsiniz kullanmak ardından endekslerini oluşturmak için bir vektör yaklaşımı ve ⍺[ ]karşılık gelen değerleri almak için
ngn

Bunu RANK ERRORyapmaya çalıştığımda bir zamanım var .
Zacharý


tek yakalama ⍵ = 1'dir, bu durumda ⍳ beklendiği gibi iç içe uzunluk-1 vektörlerinden oluşan bir vektör değil, düz bir vektör döndürür; geriye dönük uyumluluk nedeniyle hiçbir zaman sabitlenmeyen hatalardan biridir
ngn



3

Yakut , 53 bayt

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

Çevrimiçi deneyin!

Özyineli yaklaşım, çok kısa değil, herhangi bir yerleşikten arınmış olduğu garanti edilir.

Permütasyon yöntemlerini kullanmak cazip gelebilir, ancak bu muhtemelen önemli değildir ve dokümanlar, uygulamada işe yarıyor gibi görünse de, siparişin doğruluğunu garanti etmez:

Yakut , 35 bayt

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

Çevrimiçi deneyin!



2

Raket, 92 bayt

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

Çevrimiçi Deneyin

Ungolfed

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

2

Jöle , 11 9 7 bayt

³;þẎƊ’¡

Çevrimiçi deneyin!

açıklama

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

OP'nin yorumuna bakın: p
Zacharý

Bunu getirdiğim yorumum: "Ayrıca tüm meydan okuma için yerleşiklerin de kabul edilmediğini varsayıyorum", bu yüzden bunun iyi olduğunu varsaydım.
Zacharý

OP için bekleyelim
Zacharý

@ Zacharý üzgünüm, kartezyen güç işlevine izin verilmiyor
JoshM

3
Bilmiyorum, böyle döngüler için iç içe iki temelde kartezyen bir ürünün tanımı. Yine de değiştirmeniz gerektiğini söylemiyorum, sadece bu meydan okumada yerleşik olanı yasaklamak biraz belirsiz.
dylnan

2

Pure Bash (harici yardımcı program yok), 57

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

Girdi komut satırı parametreleri olarak verilir; 1 n, 2 virgülle ayrılmış bir listedir.

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

Çevrimiçi deneyin!


2

Java 10, 19 + 135 = 154 bayt

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;}

Çevrimiçi Deneyin

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;
}

Teşekkür

  • Cruijssen sayesinde Java'ya 10 numaralı liman

Java 10 yerine 8 kullanıyorsanız, değiştirebilir Objectve Listfor-each döngüsü için variçin -4 bayt. Buna ek olarak, daha sonra değiştirebilir Set<List>fiçin List<List>fve Set o=new HashSet();için var o=new Stack();ek bir -1 byte için. Çevrimiçi deneyin.
Kevin Cruijssen

Hmm. lambdas türleri artık geçerli değil
sadece ASCII-sadece

@ Yalnızca ASCII Hayır, türlenmemiş lambdalara izin verilir. Burada lambda kullanamadım çünkü çözüm özyineleme kullanıyor.
Jakob

@ Jakob ah, bu doğru> _>
sadece ASCII-

2

Oracle SQL, 177 bayt

Bir koleksiyon türü oluşturun (31 bayt):

CREATE TYPE t IS TABLE OF INT;

Ardından sorguyu kullanın (146 bayt):

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

Giriş parametrelerinin aşağıdaki tabloda isütunlarla ave varsa 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 Keman

Sonuçlar :

|     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 bayt

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

Çevrimiçi deneyin! Ben dizeleri tekrar ve bash yapmak şaşırtıcı derecede zor virgül ile katılmadan listeleri bulundu.


1

Javascript (Düğüm) , 75 bayt

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

Listeyi konsola gönderen özyinelemeli işlev. Nerede aboş bir dizidir ve i(değil emin bu hala nitelendirir ise) 0:

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

Çevrimiçi deneyin!


1
Sanırım yapmanız gerekecek(m,n,a=[],i=0)=>
Artyer


1

J , 17 bayt

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

Nasıl çalışır?

nListenin uzunluğunu temel alan bir sayı sistemindeki tüm -digit sayılarını numaralandırıyorum.

            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

Çevrimiçi deneyin!




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.