ソートされた要素のリストのすべての組み合わせを生成します


13

入力としてリストと数字を受け取り、数字の長さで可能なすべての組み合わせを生成するコードを作成します。たとえば、リスト{0,1}と番号2の場合

00
01
10
11

プログラムでは、 {0,0,0,0,0,1,1,5,5}のように、リスト内で2回以上文字を期待する必要はありません

リストの順序で、組み合わせを並べ替えて印刷してください。

リスト{0,1}と数字5(私のコードの一部によって生成され、勝つには長すぎます):

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

しかし、リスト{1,0}と番号2の場合

11
10
01
00

ご覧のとおり、逆順リストは逆順を意味します。

構造を見てみましょう、それは木のようなものです。

これはコードゴルフなので、バイト単位の最短コードが勝ちです!


3
これは重複すると思ったが、見つからない
ルイスメンドー

1
入力リストがソートされていない場合、ソートはどのように機能しますか?
JAD

@Jarko 入力のインデックスのタプルが出力でソートされると仮定します
ルイスメンドー

1
@ brad、OPが別のことを言っていない限り、デフォルトの答えはyesです。
スチューウィーグリフィン

3
わかりません...自分の名前をユーザー名として使用することの何が問題になっていますか?
スチューウィーグリフィン

回答:


16

ゼリー、1 バイト

TryItOnline

デカルトパワー組み込みアトム。左引数がアイテム、右引数がカウントのダイアディックリンクとして、または第1引数がアイテム、第2引数がカウントの完全なプログラムとして。


1
1バイト!それで解決しました!
LMD

4
あなたは何を知っている、私はゼロバイトの回答を提出するつもりだ!JAVA!どうですか?:)(しかし、真剣に。素敵なゴルフ。)
OldBunny2800

9

Haskell、20バイト

(mapM id.).replicate

使用例:

*Main> ( (mapM id.).replicate )  2 "01" 
["00","01","10","11"]
*Main> ( (mapM id.).replicate )  2 "10" 
["11","10","01","00"]

replicate作るn第2パラメータのコピーをしてmapM id組み合わせを構築します。Btw mapM idは、と同じですがsequence、1バイト少なくなります。



6

Pyth、2バイト

^F

フォームlist,numberへの入力を受け取り、リストのリストを印刷するプログラム。

テストスイート

使い方

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print

これはそれを解決するようですが、おそらく他の誰かが1バイトでこれを行うことができますか?
LMD

とにかくはい、他の誰かウォン(ゼリー、1バイト)が、素敵な解決策、
LMD

6

Perl 6、15バイト

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

説明:

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

{             } # bare block lambda

     @^a        # declare first parameter as Positional
           $^b  # declare second parameter
         xx     # list repeat 「@a」, 「$b」 times

# at this point given 「 (0,1), 5 」
# ((0 1) (0 1) (0 1) (0 1) (0 1))

 [ ]            # list reduce
  X             #    using cross meta-operator

# results in a list of lists
# ((0 0 0 0 0)
#  (0 0 0 0 1)
#  (0 0 0 1 0)
#  (0 0 0 1 1)
#  (0 0 1 0 0)
#  (0 0 1 0 1)
#  ...
#  (1 1 1 1 1))
say {[X] $^a xx$^b}( (0,1), 2 ); # ((0 0) (0 1) (1 0) (1 1))
say {[X] $^a xx$^b}( (1,0), 2 ); # ((1 1) (1 0) (0 1) (0 0))
say {[X] $^a xx$^b}( (0,1,2), 2 );
# ((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2))

put {[X] $^a xx$^b}( (0,1), 5 )».join;
# 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111

Perl 6の公式リリース後からRakudoのリリースにアップグレードした場合、これをIdeoneで実行できます。
ブラッドギルバートb2gills 16

5

JavaScript(Firefox 30 +)、55バイト

f=(a,n)=>n?[for(b of a)for(c of f(a,n-1))[b,...c]]:[[]]

JavaScriptでこれを行うには、再帰が最善の方法であると確信しています。


4

Perl、30バイト

28バイトのコード+ -nlフラグ。

$"=",";say for glob"{@F}"x<>

実行するには:

perl -alE '$"=",";say for glob"{@F}"x<>' <<< "1 0
2"

入力を数値のリストとして取得することは、Perlにとって論理的だと思います。ただし、ファンタジーを許可し、(質問に示されているように)ブラケットとコンマを使用して入力を取得する場合、20バイトまで減らすことができます

perl -nlE 'say for glob$_ x<>' <<< "{1,0}
2"

説明: glob Perlの最初の目的は、ファイル名をリストおよび反復することですが、引数に中括弧が含まれている場合、各括弧グループの1つの要素で構成される組み合わせを生成します。
-a入力をスペースで自動分割し、結果を@F配列内に配置します。
$"リストの区切り文字です。文字列内のリストの要素の間に挿入される区切り文字です。それをに設定し,"{@F"}プロデュースします{.,.}@F0と1が含まれる場合)。
次にx、文字列の繰り返し演算子があります(そして<>1行の入力を取得します)。
最後に、say for生成されたリストを反復処理しglob、要素を出力します。


4

Mathematica、6バイト

Tuples

ゼリーよりもさらに悪い:(

使用法

Tuples[{0, 1}, 5]

{{0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 1}, {0, 0, 1, 0, 0}, {0, 0, 1, 0, 1}, {0, 0, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 1, 1}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 1}, {1, 0, 0, 0, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {1, 0, 1, 0, 0}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 0}, {1, 0, 1, 1, 1}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 1}, {1, 1, 0, 1, 0}, {1, 1, 0, 1, 1}, {1, 1, 1, 0, 0}, {1, 1, 1, 0, 1}, {1, 1, 1, 1, 0}, {1, 1, 1, 1, 1}}


3

Python、57バイト

from itertools import*
lambda o,n:list(product(*([o]*n)))

repl.it

オブジェクトのリストoとカウントを取得しn、組み合わせのリストを返す名前のない関数。


3

ピュアバッシュ、36

printf -vv %$2s
eval echo ${v// /$1}

コマンドラインパラメータによる入力-リストは、中括弧で囲まれたコンマ区切りリストです。例:

./elemcombo.sh "{0,1}" 2

入力リストは引用符で囲む必要があることに注意してください。これにより、呼び出しシェルはそれを早めに展開しません。

イデオネ


これはうまくいかないようです。
Iporサーサー16

入力をn回繰り返すだけで、考えられるすべての組み合わせを出力するわけではありません。
Iporサーサー16

@IporSircer必要な入力形式を明確にしました。それは今あなたのために働いていますか?
デジタル外傷

bash a.sh "{0,1}" 2-> {0,1}{0,1}(バージョン4.4.5(1)
Ipor Sircer

1
@IporSircer TIOはおそらく引数をexecve()または同様の呼び出しに入れているようです。引用符は、スクリプトが別のシェルから呼び出されるときにのみ、呼び出し元のシェルがブレースの展開を行わないようにするために必要です。TIOの場合、リストには引用符は必要ありません。 tio.run/nexus/...
デジタルトラウマ

3

R53 45バイト

function(x,n)rev(expand.grid(rep(list(x),n)))

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

rev 要求された正確なソート順(実際には問題に不可欠ではないようです)に準拠するためにあり、5バイトを追加します。


ただrevのための45バイト :)
JayCe

心にマトリックスがあり、結果が実際にはリスト(データフレーム)であることを忘れていました。
ngm

1

ラケット123バイト

(let p((s "")(l(map number->string(sort l <))))
(if(= n(string-length s))(displayln s)(for((i l))(p(string-append s i)l))))

ゴルフをしていない:

(define(f l n)
  (let loop ((s "")
             (l (map number->string (sort l <))))
    (if (= n (string-length s))
        (displayln s)
        (for ((i l))
          (loop (string-append s i) l)))))

テスト:

(f '(0 1) 2)
(f '(0 1) 3)
(f '(0 1) 5)

出力:

00
01
10
11

000
001
010
011
100
101
110
111

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

1

PHP、109バイト

for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);

最初の引数として長さを取り、その他の引数としてリストを取ります。
次のように使用します:

php -r "for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);" 5 0 1

長さ0を要求された場合、「メモリ不足」致命的エラーが発生します。


あなたは長さ0を処理する必要が文句を言わない
LMD

1

05AB1E2 1 バイト

ã

-1バイトのおかげで @Enigmaの

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

として入力 number\nlist、リストのリストとして出力します。

説明:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times

1
Iここは必要ありません。
エミグナ

@Emigna Ahもちろん。私がI最初に複数の入力を持つ方法を理解しようとしていたので、私は持っていたと数とリストを逆にしていた。Iそこを維持するのはかなり愚かな..ありがとう!
ケビンCruijssen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.