自身がn回あるリストのデカルト積


10

値のリストと正の整数を指定するnと、コードはリストとn時間のデカルト積を出力します。

たとえば、疑似コードでは、関数は次のようになります。

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

例:

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

デカルト積(またはべき乗)を計算する組み込み関数(またはインポートされたライブラリからの関数)は、結果として得られるコードがやや退屈であるため、許可されていません。

入力と出力は区切られている必要がありますが、適切な方法で取得できます。

出力が与えられる順序は重要ではありませんが、重複は許可されません。

初めての質問なので、ひどい間違いをした場合は教えてください。


5
PPCGへようこそ!ひどく悪いことは何もありませんが、このメタ投稿と回答を確認するのに少し時間がかかります。課題を書くときに避けるべきこと
JayCe

4
@JayCeの要点をフォローするには、質問を投稿する前にフィードバックを得るためにサンドボックスに投稿する必要があります(
Giuseppe

@Giuseppeわかりました、これからもよろしくお願いします:)
JoshM


1
@Jakobセットは問題ないはずです
JoshM、2018年

回答:



6

Common Lisp、146バイト

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

オンラインでお試しください!

ない

(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
通常は、自分の投稿を投稿する前に他の投稿を待つことをお勧めします:-)
Giuseppe

1
@Giuseppeわかりました、アドバイスをありがとう:)
JoshM '29

1
あなたは機能が許可されているので、提出にprint文を持っている必要はありません
ASCIIのみ

1
そのため:96
ASCIIのみ


6

R、41バイト

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

オンラインでお試しください!

combnn入力のすべての組み合わせを計算するため、組み込みのデカルト製品ではありません。

R、40バイト

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

オンラインでお試しください!

expand.grid おそらくデカルト製品が組み込まれています。


メインサブミッションの順列の順序が間違っているようです。
Kirill L.

@KirillL。順序が重要である特別な理由はありますか?私は、出力仕様を任意の順序で許可するのに十分な柔軟性があると解釈しました。
ジュゼッペ

OPのコメント「出力が正しい順序になっていることを確認してください」があります。「正しい」は例と同じ意味であると思います。
Kirill L.

@KirillL。ああ。それを見なかった。それは質問の本文にないので、それが存在することを知りませんでした!わかりやすくするために、そこに配置されるようお願いします。
ジュゼッペ



3

APL(Dyalog Classic)18 12バイト

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

オンラインでお試しください!

@ngnのおかげで-6バイト!


あなたができる使用のインデックスを生成し、その後、ベクトル引数に⍺[ ]対応する値を取得する
NGN

私がRANK ERRORそれをしようとしたとき、私は得ました。
–Zacharý、


唯一のキャッチは⍵= 1の場合です。その場合、⍳は通常のネストされた長さ1のベクトルではなく、通常のベクトルを返します。下位互換性の理由から、修正されないバグの1つです
ngn



3

Ruby、53バ​​イト

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

オンラインでお試しください!

再帰的なアプローチ、それほど短くはありませんが、組み込み関数がないことが保証されています。

順列メソッドを使用するのは魅力的ですが、これはおそらくカウントされず、実際には動作しているように見えますが、ドキュメントには実際には順序の正確性の保証がないと記載されています。

Ruby、35バイト

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

オンラインでお試しください!



2

ラケット、92バイト

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

オンラインで試す

未ゴルフ

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

2

ゼリー11 9 7バイト

³;þẎƊ’¡

オンラインでお試しください!

説明

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

P:OPさんのコメントを見て
ザカリー

私がそれを持ち出したコメントは、「私はまた、チャレンジ全体のビルトインも無視されると想定している」ということですので、これは大丈夫だと思いました。
ザカリー

さて、その後、OPのための待機をしましょう
ザカリー

@Zacharý申し訳ありませんが、デカルトべき乗関数は許可されていません
JoshM、2018年

3
わかりません。このような2つのネストされたforループは、基本的にデカルト積の定義です。ただし、変更する必要があると言っているのではありません。このチャレンジでビルトインを禁止することは、ちょっと不明確だと思います。
ディルナン

2

Pure Bash(外部ユーティリティなし)、57

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

入力はコマンドラインパラメータとして与えられます。1つ目はn、2つ目はカンマ区切りのリストです。

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

オンラインでお試しください!


2

Java 10、19 + 135 = 154バイト

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

オンラインで試す

未ゴルフ

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

謝辞

  • Kevin CruijssenによるJava 10への移植

あなたはJavaの10の代わりに、8を使用する場合は、変更することができますObjectListのために、各ループ内varのために-4バイト。また、あなたがして変更することができますSet<List>fList<List>fしてSet o=new HashSet();var o=new Stack();追加-1バイトのために。オンラインでお試しください。
Kevin Cruijssen、2018年

うーん。はラムダの型を除外することはもはや有効ではありません
ASCIIのみ

@ASCIIのみいいえ、型なしのラムダは許可されます。解決策は再帰を使用しているため、ここではラムダを使用できませんでした。
ヤコブ

@Jakobああ、そうです> _>
ASCIIのみの

2

Oracle SQL、177バイト

コレクション型(31バイト)を作成します。

CREATE TYPE t IS TABLE OF INT;

次に、クエリ(146バイト)を使用します。

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

入力パラメーターがiaとテーブルを含むテーブルにあると仮定します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フィドル

結果

|     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

J、17バイト

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

使い方?

nリストの長さを基にした数体系のすべての数字を列挙します。

            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

オンラインでお試しください!




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.