リストをピックフラット化する


20

ネストされたリストを「ピッキング」するプロセスを検討してください。ピッキングは次のように定義されます。

  • 引数がリストの場合、リストから要素をランダムに(均一に)取り出し、そこから選択します。
  • 引数がリストではない場合、単にそれを返します。

Pythonでの実装例:

import random
def pick(obj):
    if isinstance(obj, list):
        return pick(random.choice(obj))
    else:
        return obj

簡単にするために、ネストされたリストには整数またはさらにネストされたリストのみが含まれると仮定します。

任意のリストが与えられた場合、で区別できないフラット化されたバージョンを作成することができますpick。つまり、リストから選択すると、同じ確率で同じ結果が得られます。

たとえば、リストを「ピックフラット化」

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

リストを生成します

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

。単純な平坦化が無効である理由は、サブリストの要素が選択される確率が低いためです。たとえば、リストで[1, [2, 3]]は1が2/4 = 1/2の確率で選択され、3と4は両方とも1/4チャンスそれぞれ。

また、シングルトンリストからの選択はその要素からの選択と同等であり、空のリストからの選択には意味がないことに注意してください。

チャレンジ

非負整数のネストされたリストを指定すると、非負整数のフラット化されたリストを返します。このリストから、同じ確率で同じ結果が得られます。

これはなので、最短の有効な回答(バイト単位で測定)が勝ちます。

仕様書

  • 入力は[2, 3, 4][2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4][2, [3, 3], [[4]]]等価である(彼らは同等の結果が得られなければならないIE)。
  • 出力[2, 2, 2, 2, 3, 3, 3, 3][2, 3]は同等です(つまり、どちらかが出力されます)。
  • リストには、1〜100の範囲の数値のみが含まれると想定できます。
  • トップレベルの入力はリスト、つまり2有効な入力ではないと想定できます。
  • 次の例のように、ネストされたリストの任意の合理的な表現を使用することができます
    [1, [2, 3]]1 {2 3}"[ 1 [ 2 3 ] ]"、など
  • リストの代わりに、マルチセットまたはマッピングを出力できます。または、1〜100の範囲の数値のみが許可されているため、数量を表す整数の長さ100のリストを出力できます。

テストケース

リストされた出力は、1つの有効な可能性にすぎないことに注意してください。有効な入力または出力を構成するものの仕様を参照してください。

format:
input -> output
[3]                          -> [3]
[1, [1, 1]]                  -> [1]
[1, [2, 3]]                  -> [1, 1, 2, 3]
[2, 3, [4, [5, 5, 6], 6, 7]] -> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7]
[[1, 1, 2], [2, 3, 3]]       -> [1, 2, 3]
[[1, 1, 2], [2, 3, 3, 3]]    -> [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]

長さのエンコードオプションと制限された範囲が与えられた場合、代わりに、すべての整数の出現を表す100個の要素のリストを出力できますか?(与えられた例のための多くのゼロが生じるであろう)
ウリエル

@Uriel Sure; 言い換えます。
エソランジングフルーツ

回答:


8

Wolfram言語(Mathematica)41 20バイト

Flatten@*Tuples//@#&

オンラインでお試しください!多くの警告は無視してください。すべてうまくいきます。

使い方

ような深さ2のリストは{{1,2},{3},{4,5,6}}Tuplesリスト生成する{{1,3,4},{1,3,5},{1,3,6},{2,3,4},{2,3,5},{2,3,6}}から要素を選択するためのすべての方法に対応した{1,2} から要素を選択{3} し、から要素を選択します{4,5,6}

我々場合はFlatten、この、我々はから要素を取り出すために、正しい周波数を持つすべての要素を取得1{1,2}{3}または{4,5,6}、その後、それらのすべてから要素を選ぶ維持するかを選択するのと同じです。

//@入力のすべてのレベルでこれを適用するために使用します。それはのような原子回しているため、プロセスでは、Mathematicaは、多くのことを不平を言う17Tuples[17]は本当にものであることを想定されていません、。しかし、これらTuplesは後で正しい結果に単純化されます(Tuples[17]長さが1のリストとして処理されますが、ヘッドが以外であってもList)ので、文句は関係ありません。



4

ゼリー9 8バイト

߀Œp$¬¡F

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

使い方

߀Œp$¬¡F  Main link. Argument: x (array or positive integer)

     ¬    Compute elementwise logical NOT of x: a non-empty array for a non-empty array, 0 for a positive integer.
      ¡   Apply the link to the left once if ¬ returned a non-empty
          array, zero timed if it returned 0.
    $     Monadic chain:
߀            Map the main link over x.
  Œp          Take the Cartesian product.
       F  Flatten the result.


1

Python 2、128バイト

def f(l,p=0):m=reduce(int.__mul__,[i*0<[]or len(i)for i in l]);return p*(p==l)or f(sum([(([i],i)[i*0>0]*m)[:m]for i in l],[]),l)

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

私のゼリーのポートの答え。

-12 Jonathan Frechに感謝します。


type(i)==intできると思いますi*0<[]
ジョナサンフレッチ

@JonathanFrech確かに、0<[]...とtype(i)==listすることができi*0>0;)
エリックOutgolfer

1

C(gcc)234 223バイト

h[9][101];o[101];n[9];l;L;e;main(x){for(;(x=scanf("%d",&e))>=0;x?++h[l][e],++n[l]:(e=getchar())-'['?e-']'?0:--l:++l>L&&++L);for(e=1,l=L+1;l--;){for(x=101;--x;o[x]+=e*h[l][x]);e*=n[l];}while(o[x]--?printf("%d ",x):++x<101);}

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

説明:

h[9][101];  // <- number occurences per nesting level
o[101];     // <- number occurences in "flattened" array
n[9];       // <- number of entries per nesting level
l;          // <- current nesting level
L;          // <- max nesting level
e;          // <- multi-purpose temporary
main(x){    // x: multi-purpose temporary
    for(;
            // while not EOF try reading number
            (x=scanf("%d",&e))>=0;

            // number was read?
            x

                // then increment occurence and # entries in level
                ?++h[l][e],++n[l]

                // else read any character ... if not [
                :(e=getchar())-'['

                    // if not ]
                    ?e-']'

                        // do nothing
                        ?0

                        // else decrement nesting level
                        :--l

                    // else increment nesting level and adjust max level
                    :++l>L&&++L);

    // init factor in e to 1, iterate over nesting level from innermost
    for(e=1,l=L+1;l--;){

        // iterate over all numbers
        for(x=101;
                --x;

                // add factor times occurence on current level to output
                o[x]+=e*h[l][x]);

        // multiply factor by number of entries on current level
        e*=n[l];
    }

    // iterate over all numbers and output count times
    while(o[x]--?printf("%d ",x):++x<101);
}



0

JavaScript(ES6)、132 131バイト

f=A=>(_=(a,m)=>[].concat(...a.map(m)),n=1,A=A.map(a=>a.map?f(a):[a]),_(A,a=>n*=a.length),_(A,a=>_(a.map(x=>Array(n/a.length).fill(x)))))

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