ネストされたリストを「ピッキング」するプロセスを検討してください。ピッキングは次のように定義されます。
- 引数がリストの場合、リストから要素をランダムに(均一に)取り出し、そこから選択します。
- 引数がリストではない場合、単にそれを返します。
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チャンスそれぞれ。
また、シングルトンリストからの選択はその要素からの選択と同等であり、空のリストからの選択には意味がないことに注意してください。
チャレンジ
非負整数のネストされたリストを指定すると、非負整数のフラット化されたリストを返します。このリストから、同じ確率で同じ結果が得られます。
これはcode-golfなので、最短の有効な回答(バイト単位で測定)が勝ちます。
仕様書
- 入力は
[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]