リストのリストのエントリを順番にステップ実行することによるタプル


9

チャレンジ:

空でない整数のリストのリストを指定すると、次の形式のタプルのリストを返します。最初のリストの各要素で始まり最初のリストのタプルの後に後続のすべてのリストの最初の要素が続くため、i番目のタプルはになります[ith element of first list, first element of second list, ... , first element of last list]。例えば:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => [[1, 4, 7], [2, 4, 7], [3, 4, 7], ...

次に、フォームのタプルを実行する[last element of first list, ith element of second list, first element of third list, ..., first element of last list]ので、この例では次のようになります。

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] =>  ..., [3, 4, 7], [3, 5, 7], [3, 6, 7], ...

に到達するまで、残りの各リストを続行します[last element of first list, ..., last element of second to last list, ith element of last list]

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 6, 7], [3, 6, 8], [3, 6, 9]]

完全な出力は次のとおりです。

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => 
        [[1, 4, 7], [2, 4, 7], [3, 4, 7], [3, 5, 7], [3, 6, 7], [3, 6, 8], [3, 6, 9]]

適切な対策のための定型文:

  • 入力を文字列のリストまたは正の整数のリストにする場合は、問題ありません。問題は、リストの操作についてではなく、リストの内容についてです。
  • 入力と出力は、受け入れ可能な任意の形式することができます
  • 完全なプログラムまたは機能のいずれかが許可されます。
  • デフォルトでは、標準の抜け穴は許可されていません。
  • この質問はコードゴルフなので、バイト数が最も少ないものが優先されます。

例:

[] => [[]] (or an error, thanks to ngn for correcting the output in this case)

[[1]] => [[1]]

[[1, 2], [3, 4], [5]] => [[1, 3, 5], [2, 3, 5], [2, 4, 5]]

[[1], [2], [5, 6], [3], [4]] => [[1, 2, 5, 3, 4], [1, 2, 6, 3, 4]]

[[1, 2, 3], [4, 5]] => [[1, 4], [2, 4], [3, 4], [3, 5]]

[[1, 2, 3], []] => unspecified behavior (can be an error)

[[3, 13, 6], [9, 2, 4], [5, 10, 8], [12, 1, 11], [7, 14]] => 
     [[3, 9, 5, 12, 7], [13, 9, 5, 12, 7], [6, 9, 5, 12, 7], [6, 2, 5, 12, 7], 
      [6, 4, 5, 12, 7], [6, 4, 10, 12, 7], [6, 4, 8, 12, 7], [6, 4, 8, 1, 7], 
      [6, 4, 8, 11, 7], [6, 4, 8, 11, 14]]  

[[16, 8, 4, 14, 6, 7, 10, 15], [11, 1, 12, 2, 19, 18, 9, 3], [13, 5, 17]] =>
    [[16, 11, 13], [8, 11, 13], [4, 11, 13], [14, 11, 13], [6, 11, 13], 
     [7, 11, 13], [10, 11, 13], [15, 11, 13], [15, 1, 13], [15, 12, 13], [15, 2, 13], 
     [15, 19, 13], [15, 18, 13], [15, 9, 13], [15, 3, 13], [15, 3, 5], [15, 3, 17]]

誰かがより良いタイトルを持っているなら、私に知らせてください。


1
私は[] => []本当にそうあるべきだと思っています[] => [[]]が、理由を説明する言葉が見つかりません。
ngn

1
@ngnその通りです[[]]。(ゼロ)サブリストのそれぞれから1つのエントリを持つ空のタプルが1つあるためです。おそらくこれを正しく出力するようにプログラムに要求するのは面倒すぎるので、それは必要ではないと言います。
フード

1
はい[]、厳密に、非空のリストの空のリストを話すが、出力は間曖昧です[]し、[[]]それは許さ入力だ場合。(「最初のリストの各要素で始まる最初のリストのタプル...」-最初のリストがないため、これで完了です-> []
Jonathan Allan

1
@JonathanAllanの「正しい」出力はで[]あると確信しています[[]]。たとえば、出力タプルの数はsum(inner list lengths) - length of outer list + 1、空の場合はで与えられます1。これはの長さです[[]]が、の長さではありません[]。しかし、これはちょっとした問題です...
フード

1
すべてのエントリが異なると想定できますか?または、より強く、例のように1..nの順列は?
xnor 2018

回答:


5

JavaScript(ES6)、59バイト

正の整数のリストのリストが必要です。

f=a=>[a.map(a=>a[0]),...a.some(a=>a[1]&&a.shift())?f(a):[]]

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

どうやって?

各反復で:

  • 各リストの最初の要素で構成される新しいリストを出力します。
  • 少なくとも2つの要素を含む最初のリストの最初の要素を削除し、プロセスを繰り返します。または、そのようなリストが存在しない場合は、再帰を停止します。

1
そのa.someトリックは素晴らしいです!
ETHproductions 2018

1
@ETHproductions使用してawe.someバイトを無駄にしないチャレンジを探しています... :)
Arnauld

2

Python 2、62バイト

lambda M:[zip(*M)[l.pop(0)*0]for l in M+[[1,1]]for _ in l[1:]]

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

ArnauldのJSの提出に触発されたChas Brownのポップなアイデアを使用しています。


Python 2、68バイト

M=input()
for l in[[0,0]]+M:
 for x in l[1:]:l[0]=x;print zip(*M)[0]

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

リストの最初の要素を変更して、目的の値を保持します。これ[[0,0]]+は、最初の最初の値を出力する醜いハックです。


2

ゼリー、15 バイト

ẈṚṪ×€PƊƤFQṚCịŒp

オンラインでお試しください!(フッターには、ゼリー表現ではなく、実際に返されたリストが表示されます)

どうやって?

必要な時点でのリストのデカルト積へのインデックス...

ẈṚṪ×€PƊƤFQṚCịŒp - Link: list of lists  e.g. [[6,8,4,9],[7,1,5],[3,2]]
Ẉ               - length of each            [4,3,2]
 Ṛ              - reverse                   [2,3,4]
       Ƥ        - for each prefix:             [2]      [2,3]      [2,3,4]
      Ɗ         -   last 3 links as a monad:
  Ṫ             -     tail (pop rightmost)     2        3          4
     P          -     product (of remaining)   1        2          6
    €           -     for €ach (range tail)    [1,2]    [1,2,3]    [1,2,3,4]   
   ×            -       multiply               [1,2]    [2,4,6]    [6,12,18,24]
        F       - flatten                   [1,2,2,4,6,6,12,18,24]
         Q      - de-duplicate              [1,2,4,6,12,18,24]
          Ṛ     - reverse                   [24,18,12,6,4,2,1]
           C    - complement (1-x)          [-23,-17,-11,-5,-3,-1,0]
             Œp - Cartesian product (of the input)
                -         -> [[6,7,3],[6,7,2],[6,1,3],[6,1,2],[6,5,3],[6,5,2],[8,7,3],[8,7,2],[8,1,3],[8,1,2],[8,5,3],[8,5,2],[4,7,3],[4,7,2],[4,1,3],[4,1,2],[4,5,3],[4,5,2],[9,7,3],[9,7,2],[9,1,3],[9,1,2],[9,5,3],[9,5,2]]
            ị   - index into (1-based & modular)
                -   indexes:      -23,                                            -17,                                            -11,                                             -5,             -3,             -1,     0
                -    values: [[6,7,3],                                        [8,7,3],                                        [4,7,3],                                        [9,7,3],        [9,1,3],        [9,5,3],[9,5,2]]
                -         -> [[6,7,3],[8,7,3],[4,7,3],[9,7,3],[9,1,3],[9,5,3],[9,5,2]]

ẈṚ’ṣ1T$¦ƬUṚị"€(非トレーリング)長さ1のリストを持つ入力の場合(14バイト)は失敗します。しかし、おそらくṣ1T$他のもので置き換えることができますか?


2

K(ngn / k)40 21 19 18バイト

{x@'/:?|\+|!|#:'x}

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

@ H.PWizの回答からのアイデアを使用します

{ } 引数付きの関数 x

#:' それぞれの長さ

|

! これらの次元をマトリックスの列として持つ配列のすべてのインデックスタプル(リストのリスト)

|

+ 転置

|\ 走るマキシマ

? ユニークな

x@'/: 右側の各タプルを対応するリストのインデックスとして使用します x


1

チャコール、33バイト

IE⊕ΣEθ⊖LιEθ§λ⌈⟦⁰⌊⟦⊖Lλ⁻ι∧μΣE…θμ⊖Lν

オンラインでお試しください!リンクはコードの詳細バージョンです。説明:

リストのデフォルトの出力形式を使用して暗黙的に印刷する前に、整数を文字列にキャストします。これは、各行の各項目であり、ネストされたリストはダブルスペースです。

E⊕ΣEθ⊖Lι

リストの長さの合計を取り、リストのリストの長さを引きます。次に、0からこの値までループします。

Eθ§λ

リストのリストをマッピングし、各リストにインデックスを付けます。

⌈⟦⁰⌊⟦⊖Lλ

インデックスを0に、リストの最後のインデックスに固定します。(閉じ括弧は暗示されます。)

⁻ι∧μΣE…θμ⊖Lν

最初のリストの後、最も外側のインデックスから、以前のすべてのリストのデクリメントされた長さを引きます。(リストの長さが空で、合計が数値ではないため、これは最初のリストでは機能しません。)



1

APL(Dyalog Classic)32 30 27バイト

1↓¨∪⊃{(⍵,¨⊃⍺),⍺,¨⍨⊢/⍵}/⌽0,⎕

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

完全なプログラム、入力はキーボードからです(

入力のために[]出力[[]](そのAPL等価である0⍴⊂⍬,⊂⍬

入力の数値が一意であることを前提としています


1
それは、出力に違いますが、私は2番目のテストのための入力がされるべきだと思うないこと,⊂,1
H.PWiz

@ H.PWiz正解、修正、歓声
ngn

1

JavaScript(ES6)、58 54バイト

h=(x,s)=>[x.map(y=>s|y?y[0]:s=y.shift()),...s?h(x):[]]

(、whileループのすべてのインスタンスを削除ダウン私のコードをゴルフに14+の試みの後push、およびconcat)、私はとアルゴリズムが同様の反復に到着したアルノーの答え@それがどのように簡潔与えられた驚きます!

正の整数のリストのリストを受け入れます。オンラインでお試しください!

58バイト

さらに1バイトの場合、s = y.shift()with y.shift(s = 1)を置き換えるとすべての整数を処理する必要があります(おそらく、個人的にテストしていないため)。

h=(x,s)=>[x.map(y=>!s/y[1]?s=y.shift():y[0]),...s?h(x):[]]

58バイト

わずかに並べ替えたボーナスバージョン:

h=x=>[x.map(y=>s&&y[1]?y.shift(s=0):y[0],s=[]),...s||h(x)]

説明

初期のバージョンのコードは、各配列の最初の要素(の配列)のクローンを変更しようとしましたが、その配列を初期化する追加のステップはコストがかかりました...私が各配列の最初の要素へのマッピングがおおよそであることに気づくまで元の配列を変更する場合に必要な「唯一の」操作。

ブールフラグを使用して、配列がまだシフト(つまり短縮)されているかどうかを確認します。JSが数値を唯一の要素とする配列をその数値に強制変換し、複数の値を含む配列をNaNに強制変換することを観察することで、条件付きチェックをさらに進めました。

var
h = (x, s) => 
    [
        x.map(y =>                 // map to first element of each array
            s|y                    // if s == 1 (i.e. an array has been shortened)
                                   // or the current array y has length == 1
                ? y[0]
                : s = y.shift()    // remove first element of y and set s to truthy
        ),
        ...s ? h(x) : []           // only concatenate a recurrence of the function if an array has had a value removed
    ]

1

APL(ダイアログ)、15バイト(SBCS

不要なバイトを指摘してくれたngnに感謝

{∪⌈\,⍉⍳≢¨⍵}⊃¨¨⊂

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

{∪⌈\,⍉⍳≢¨⍵}入力にインデックスを付けるリストを生成します。例えば(1 2 3) (4 5 6) (7 8 9) -> (0 0 0) (1 0 0) (2 0 0) (2 1 0) (2 2 0) (2 2 1) (2 2 2)

≢¨⍵:入力の各リストの長さ

,⍉⍳入力までの数値のすべての組み合わせを作成します。例えば2 3 -> (0 0) (1 0) (0 1) (1 1) (0 2) (1 2)

⌈\:最大でスキャンします。たとえば、上記の例は次のようになります(0 0) (1 0) (1 1) (1 1) (1 2) (1 2)

:重複を削除

⊃¨¨⊂ どちらかの引数の深さを意識して、索引付けを行います


正解です。あなたは私のバイトのほぼ半分で私を倒しました。必要ないようです。
ngn


@ngnニース、何が原因だと思ったのか思い出せません。ありがとう!
H.PWiz 2018

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