*すべて*タプルをリストします!


35

入力nが与えられたプログラムを書くと、自然数を使用してすべての可能なnタプルが生成されます。

n=1
(1),(2),(3),(4),(5),(6)...

n=2
(1,1),(1,2),(2,1),(2,2),(1,3),(3,1),(2,3),(3,2),(3,3)...

n=6
(1,1,1,1,1,1) (1,1,1,1,2,1) (1,1,1,2,1,1)... 
  • 出力は、他の規則に違反しない任意の順序で実行できます。
  • プログラムは、理論上は永久に実行され、適用可能なすべてのタプルを一度だけリストするように作成する必要があります。
    • 実際には、プログラムは整数型の制限に達し、クラッシュします。これは、整数型のみが無制限の場合にプログラム無限に長く実行される限り許容されます。
    • プログラムがその時間だけ実行できる場合、有効な各タプルは有限時間内にリストする必要があります。
  • 出力には、オプションで、自然数に加えてゼロが含まれる場合があります。
  • タプルと各タプル内の数値の区別が明確で一貫している限り、プログラムの出力形式を選択できます。(たとえば、行ごとに1つのタプル。)
  • 入力(n)は1〜6の整数です。この範囲外の入力に必要な動作は未定義です。
  • コードゴルフ規則が適用され、最短のプログラムが勝ちます。

サンドボックスフェーズ中のフィードバックをいただいた「Artemis Fowl」に感謝します。


プログラムがクラッシュしたときに、これまでに出力されたタプルに加えて、余分な出力が生成される場合、それは有効だと思いますか?
ルイスメンドー

1
そのまま出力する必要がありますか、または時間の終わりに無限リストを生成する関数で十分ですか?
ジョナサンアラン

6
「各タプル内のタプルと数字間の分離が明確で一貫している限りとしてあなたは、あなたの便宜のためにあなたのプログラムの出力形式を選択することができます」 -私たちは、出力(例えば分離(一貫異なるが)異なることがあり、次のように)?
ジョナサンアラン

@JonathanAllanそのオブジェクトの無限コンテンツの出力をプログラムの一部として含める必要があります。
billpg

1
関連(自然数ではなく整数)
エソランジングフルーツ

回答:


24

、2バイト

πN

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

説明

Nは、自然数の無限リストです[1,2,3,4,..πデカルトの力です。結果はリストの無限リストです。必要な長さの各リストは、πそのようにクールであるため、正確に1回出現します。入力と出力は暗黙的です。


1
わあ、これは[1,1、n]もしません。出力する順序にパターンはありますか?
billpg

1
@billpgタプルを再帰的に構築します。- nタプルは、元のリストと-タプルのリストのデカルト積を、n-1インデックスの合計の昇順で取得することによって取得されます。
ズガルブ

「インデックスの合計の昇順」-これを明確にできますか?たとえば、との2,2,2後に来る理由がわかりません。4,1,25,1,1
ヨナ

2
@Jonah再帰はこのように機能します。1タプル以上で開始しNます。2タプルの場合N、インデックスの合計順に並べられたデカルト積を取得します。両方のリストで、各番号nはインデックスにあるnため、長さ2の場合、結果はたまたま合計で並べ替えられます。3タプルを取得するにはN、これらのリストの要素のインデックスの合計で順序付けられた2タプルのデカルト積とリストを取得します。タプルの合計ではなく、タプルのリスト内の位置を調べます。
ズガルブ

2
「このタスクで無限大のさまざまな次元を把握し、それを可算無限大に減らすパターンを見つけ、このパターンを反復処理するプログラムを作成します。」-「ねえ、私はそのためのビルトインを持っています!」
ファビアンローリング

10

Haskell、62バイト

([1..]>>=).(!)
0!s=[[]|s<1]
n!s=[a:p|a<-[1..s],p<-(n-1)!(s-a)]

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

n!sn合計するすべての- タプルを生成しsます。

それから答えは([1..]>>=).(!)、すなわち\n -> [t | s<-[1..], t<-n!s]です。

これは、整数nをタプルの無限の遅延リスト(整数のリスト)にマッピングする関数です。


5

Haskell、50バイト

f n=[l|k<-[0..],l<-mapM([0..k]<$f)[0..n],sum l==k]

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

リストn-合計でソートされたタプル。0からkまでの数字のmapMすべてのnタプルを生成するために重いリフティングを行います。ここで<$fトリックを説明します

Haskell、51バイト

f 1=pure<$>[0..]
f n=[a-k:k:t|a:t<-f$n-1,k<-[0..a]]

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

各タプルの最初の数を可能な限りの方法で合計する2つの数に分割することにより、すべてのn-1タプルをすべてのnタプルに再帰的に拡張します。an-1a-k,k


4

Pyth-9バイト

ゴルフをありがとう@FryAmTheEggman

すべてのxをループし、[1..x] ^ nを取ります。これにより複製が作成されるので、そのxに新しいもの(別名xを含む)のみを保持します。フォーマットは少し奇妙ですが、もう1バイトで標準にすることができます。.V1j}#b^Sb

.V1}#b^Sb

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


1
f}bT-> }#bまた、あなたのバイト数は現時点では間違っているようです?
FryAmTheEggman

@FryAmTheEggman待って、なぜそれが間違っているのですか?TIOリンクについて話している場合は、での書式設定が含まれj(b)ます。また、ゴルフをありがとう。
マルティセン

ああ、それが私を混乱させた、ごめんなさい!
FryAmTheEggman

3

Brachylog(v2)、9バイト

~l.ℕᵐ+≜∧≜

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

これは、可能なすべてのタプルを生成する無限ジェネレータです。TIOリンクには、ジェネレーターを使用して1000個の要素を生成して出力するヘッダーがあります(ただし、代わりに要求した場合、ジェネレーターは無期限に続行できます。Brachylogの整数は無制限です)。

より簡潔な方法があるべきだと感じていますが、多くの制約があり、これは私がそれらを単一のプログラムに適合させることができる最も難しいものです。

説明

~l.ℕᵐ+≜∧≜
  .        Generate
        ≜  all explicit
~l         lists whose length is {the input}
    ᵐ      for which every element
   ℕ       is non-negative
     +     and whose sum
      ≜    is used to order the lists (closest to zero first)
       ∧   [remove unwanted implicit constraint]

ちなみに、ブラキログの観点からはまったく同じことをしているにもかかわらず、この2つの説明がどれほど違うのかが興味深いと思います。1つ目はプログラム内の最初の非決定的述語であるため、結果の順序を設定します。この場合、リストの合計に対して可能なすべての明示的な値を0、1、2、3…の順序で計算し、リストが合計の順に出力されるようにするために使用されます(これにより、リストは出力の有限量の後に表示されます)。2番目は、リストのすべての明示的な可能性を計算するために使用されます(リストの要素の相互関係を指定する式を出力するのではなく)。


↰₁ẉ⊥また、無限に印刷するのに適したヘッダーです。
無関係な文字列

私はこの述語の単一の独立した呼び出しがゼロを生成するため、実際には完全な答えではないかもしれないと感じていますが、「またはすべてを生成する」部分はヘッダーによって行われます。
無関係な文字列

1
@UnrelatedStringただし、コードはジェネレーターとして述語を使用しません。ジェネレータを使用してリスト出力を許可する明示的なルールがあります。TIOリンクで行っていることは、ループ内で述語を呼び出して1000の異なるジェネレーターを取得し、それぞれから最初の出力を取得することです。これはジェネレーターで行うのは本当に不自然な操作であり、ジェネレーターが生成できる他の要素を見ることはできません。
ais523

ああ、私はBrachylogの述語がこの時間全体であるという意味を誤解しているだけです。「ジェネレーター」という私の考えはPythonに固執しています。頭の中がまっすぐになったので、古い回答のいくつかを3バイト削ります。
無関係な文字列

2

Perl 6、37バイト

{$++.polymod(1+$++ xx $_-1).say xx *}

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

基本的にpolymod、必要な数のエントリで実行されます。モジュロは常に入力より大きくなります。つまり、0.polymod(1,1,1)、1.polymod(2,2,2)などです。範囲。Perl6では、無限大をモジュロさせません...


5
これは、すべてのタプルを一度だけリストするわけではありません(たとえば、(0, 1, 0, 0)リストされていません)。
bb94


2

C#(Visual C#Interactive Compiler)、148バイト

n=>{var a=new int[n];int j=0;void g(int k){if(k<n)for(int i=0;i++<j;g(k+1))a[k]=i;else if(a.Sum()==j)WriteLine(string.Join(' ',a));}for(;;j++)g(0);}

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

@ASCIIOnlyのおかげで-3バイト!

// n: size of tuples to generate
n=>{
  // a: current tuple workspace
  var a=new int[n];
  // j: target sum value
  int j=0;
  // recursive function that works on slot k
  void g(int k){

    // tuple is not fully generated,
    if(k<n)

      // try all values from (0,j]
      for(int i=0;i++<j;
        // recursive call - generates all
        // values from (0,j] in the next slot
        g(k+1)
      )
        // update the kth slot
        a[k]=i;

    // tuple is fully generated, however
    // we should only display if the sum
    // is equal to the target sum. tuples
    // are generated many times, this
    // let's us enforce that they are only
    // displayed once.
    else if(a.Sum()==j)
      WriteLine(string.Join(' ',a));
  }
  // increment the high value forever
  // while continually starting the
  // recursive function at slot 0
  for(;;j++)
    g(0);
}

どうやってこれをやったのか
Stackstuck

ストレートアップ、おそらくです.NETのコアにこれを移植まだ私のバイトの多くを保存します。
Stackstuck

ここでの最大のトリックは再帰です。「順列」を生成するために私が見たテクニックのほとんどはそれを使用します。説明を追加する予定です。
dana

Writeたとえば、'<literal tab>'or |は同じ長さで、必要な行数ははるかに少ない:P
ASCIIのみ


1

ゼリー、10(9?)バイト

9一貫性のない分離を使用して出力する場合(これについては問い合わせました)-の削除

‘ɼṗ³ċƇ®Ṅ€ß

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

どうやって?

‘ɼṗ³ċƇ®Ṅ€ß - Main Link: some argument, x (initially equal to n, but unused)
 ɼ         - recall v from the register (initially 0), then set register to, and yield, f(v)
‘          -   f = increment
           - (i.e. v=v+1)
   ³       - program's third command line argument (1st program argument) = n
  ṗ        - (implicit range of [1..v]) Cartesian power (n)
           - (i.e. all tuples of length n with items in [1..v])
     Ƈ     - filter keep those for which:
    ċ      -   count
      ®    -   recall from register
           - (i.e. keep only those containing v)
       Ṅ€  - print €ach
         ß - call this Link with the same arity
           - (i.e. call Main(theFilteredList), again the argument is not actually used)

1
各タプル内のタプルと数字の分離が明確で一貫している限り(たとえば、1行に1つのタプル)。」に基づいて許可されていないと要求されたと仮定しましたが、いう。
ケビンクルーイッセン

1

05AB1E15 11 バイト

[¼¾LIãvy¾å—

-4バイトのポートを作成して @MaltysenのPyth回答の

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

説明:

[             # Start an infinite loop:
 ¼            #  Increase the counter_variable by 1 (0 by default)
  ¾L          #  Create a list in the range [1, counter_variable]
    Iã        #  Take the cartesian power of this list with the input
      v       #  Loop over each list `y` in this list of lists:
       y¾å    #   If list `y` contains the counter_variable:
             #    Print list `y` with trailing newline

2
プログラムはいつ[1,2,1]に到達しますか?有限時間内でなければならないことを忘れないでください。
billpg

@billpgは今修正する必要があります。
ケビンクルーッセン


1

パイソン2126の 112 106 101 100 83バイト

n=input()
i=1
while 1:
 b=map(len,bin(i)[3:].split('0'));i+=1
 if len(b)==n:print b

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

mypetlionへの5バイトthx ; ArBoのイーグルアイから1バイト。xnorから17バイト

の順序付けられたパーティションmnビンに構築します。s とsのm = 0,1,2,3,...付いた2進数を選択します。n-1 0m 1


if i==p:i=0;p*=2i%=p;p<<=i<15バイトを節約できるようになります。
mypetlion

後のスペースprint bは必要ないと確信しています:D
ArBo

i+pは、複雑な方法で1、2、3 ...をカウントアップしているように見えるため、1つの変数にしかできません。
xnor

@xnor:D'oh!コンセプトに包まれて、木の森を見ることができませんでした。
チャスブラウン

1

C#(.NET Core)608 570 567バイト

using C=System.Console;using L=System.Collections.Generic.List<int[]>;class A{static void Main(){L x=new L(),y=new L(),z=new L();int i=int.Parse(C.ReadLine()),j=0,k,l,m;x.Add(new int[i]);while(i>0){j++;for(m=0;m++<i;){foreach(var a in y)x.Add(a);y=new L();foreach(var a in x){for(k=0;k<i;){int[] t=new int[i];System.Array.Copy(a,t,i);t[k++]=j;var b=true;z.AddRange(x);z.AddRange(y);foreach(var c in z){for(l=0;l<i;l++)if(c[l]!=t[l])break;if(l==i)b=false;}if(b)y.Add(t);}}}}for(k=0;k<x.Count;k++){C.Write("[ ");for(l=0;l<i;l++)C.Write(x[k][l]+" ");C.WriteLine("]");}}}

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

私の神は私が何をしたか(非常に多くのループ、それは私がやったことです)

ただし、動作するはずです!

印刷ループを1つのブラケットに戻すと、ループするたびに、リストが構築されたとおりに表示されます。(もしそうなら、各ループを区別するために改行または何かを追加することをお勧めします。)

正直なところ、私の時間の多くは言語との戦いに費やされていました...きれいな印刷配列はなく、== ...のさまざまな動作

このバージョンが読みやすいことを願っています。

using C=System.Console;
using L=System.Collections.Generic.List<int[]>;
class A{
    static void Main(){
        L x=new L(),y=new L(),z=new L();
        int i=int.Parse(C.ReadLine()),j=0,k,l,m;
        x.Add(new int[i]);
        while(i>0){
            j++;
            for(m=0;m++<i;){
                foreach(var a in y) x.Add(a);
                y=new L();
                foreach(var a in x){
                    for(k=0;k<i;){
                        int[] t=new int[i];
                        System.Array.Copy(a,t,i);
                        t[k++]=j;
                        var b=true;
                        z.AddRange(x);
                        z.AddRange(y);
                        foreach(var c in z){
                            for(l=0;l<i;l++) if(c[l]!=t[l])break;
                            if(l==i)b=false;
                        }
                        if(b)y.Add(t);
                    }
                }
            }
        }
        for(k=0;k<x.Count;k++){
            C.Write("[ ");
            for(l=0;l<i;l++)C.Write(x[k][l]+" ");
            C.WriteLine("]");
        }
    }
}

私はちょうどそれが行くように出力しますので、私はif文で印刷ループを固執することができます実現しました。 facepalm一瞬。
Stackstuck

ハズレはそれを行うことはできません待つ
Stackstuck

...ああ、このコードがもう機能するかどうかはわかりません。
Stackstuck

aaaaandそれはしません。
Stackstuck

1
これで幸運を祈ります:) C#でソリューションのコーディングを開始し、期待していたよりもかなり複雑であることに気付きました。「Visual C#Interactive」インタープリターを使用しないのはなぜですか?それは単にクラス定義を含める必要がないため、束を節約します。とにかく、私からの+1 :)
dana

1

Perl 6、50バイト

{grep $_,{S/.//.split(0)>>.chars}($++.base(2))xx*}

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

レイジー無限リストを返す匿名コードブロック。これはChas Brownの答えと同じ戦略を使用します

説明:

{grep $_,{S/.//.split(0)>>.chars}($++.base(2))xx*}
{                                                } # Anonymous code block
                                              xx*  # Repeat indefinitely
                                 ($++        )     # From the current index
                                     .base(2)      # Get the binary form
         {S/.//                 }   # Remove the first digit
               .split(0)            # And split by zeroes
                        >>.chars    # And get the length of each section
 grep   ,   # From this infinite list, filter:
      $_      # The groups with length the same as the input

0

VDM-SL、51バイト

g(i)==if i=0then{}else{[x]^y|x:nat,y in set g(i-1)}

シーケンス連結による再帰セットの理解。

TIOではなく、プログラムで実行できます(natタイプの制限をオンにした場合、または終了しない場合):

functions 
g:nat->set of ?
g(i)==if i=0then{}else{[x]^y|x:nat,y in set g(i-1)}

回答にオプションの0を含めます。そうしないと、nat1で52バイトがバインドされます



0

perl -M5.010 122バイト

$n=shift;
$s.="for\$x$_(1..\$m){"for 1..$n;
$t.="\$x$_ "for 1..$n;
$u.='}'x$n;
eval"{\$m++;$s\$_=qq' $t';/ \$m /&&say$u;redo}"

読みやすさのためにいくつかの改行を追加しました(バイトカウントにはカウントされません)




0

JavaScript(V8)、98バイト

n=>{for(a=[],b=[j=1];;b.push(++j))(g=k=>k<n?b.map(i=>(a[k]=i)|g(k+1)):a.includes(j)&&print(a))(0)}

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

やった!最終的に100以下になりました:)基本的には私のC#回答の移植版です。

// n: length of tuples to generate
n=>{
  // a: workspace for current tuple
  // b: range of numbers that grows
  //     - iteration 1: [1]
  //     - iteration 2: [1,2]
  //     - iteration 3: [1,2,3]
  // j: largest number in b
  for(a=[],b=[j=1];;b.push(++j))
    // g: recursive function to build tuples
    // k: index of slot for current recursive call
    (g=k=>
       // current slot less than the tuple size? 
       k<n?
         // tuple generation not complete
         // try all values in current slot and
         // recurse to the next slot
         b.map(i=>(a[k]=i)|g(k+1)):
         // tuple generation complete
         // print tuple if it contains the
         // current high value
         a.includes(j)&&print(a)
    // start recursive function at slot 0
    )(0)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.