サブセットファクターの検索


14

正の整数の有限セットがあると想像してみましょう。このセットは、セット内に存在する各整数がスキャントロンまたはパンチカードのように塗りつぶされた点の線として表すことができます。たとえば、セット{1,3,4,6}は次のように表すことができます。

*.**.*

*はセットのメンバーを表し、セットのメンバーで.はない整数を表します。

これらのセットには「要因」があります。yがxのコピーから構築できる場合、ゆるくxはyの因子です。より厳密には、因子の定義は次のとおりです。

  • xがyの因数であるのは、yが互いに素な集合の集合であり、そのすべてがオフセット付きのxである場合のみです。

ファクターを呼び出すの*.*は、2つのコピーのエンドツーエンドのコピーで非常に明確に構成されているためです。*.**.**.*

*.**.*
------
*.*...
...*.*

要因はエンドツーエンドである必要はありませんが、それ*.*は要因でもあります*.*.*.*

*.*.*.*
-------
*.*....
....*.*

要因は重複することもあります。これは*.*、次の要因でもあります****

****
----
*.*.
.*.*

ただし、1つの数値で1つの数値を複数回カバーすることはできません。たとえば、の要因で*.*はありません*.*.*


より複雑な例を次に示します。

 *..*.**..***.*.*

これには*..*.*要因があります。以下のように、3つのインスタンスを並べたことがわかります*..*.*

*..*.**..***.*.*
----------------
*..*.*..........
......*..*.*....
..........*..*.*

仕事

合理的な表現によるセットが与えられると、入力の要因であるすべてのセットが出力されます。

任意の値でインデックスを作成できます(つまり、入力に存在できる最小の数値を選択できます)。また、入力セットには常にその最小値が含まれると想定することもできます。

これは質問ですので、できるだけ少ないバイトでこれを行うようにしてください。

テストケース

これらのテストケースは手作業で行われましたが、大きなテストケースでは1つまたは2つの間違いがある可能性があります

*                -> *
*.*.*            -> *, *.*.*
*.*.*.*          -> *, *.*, *...*, *.*.*.*
******           -> *, **, *..*, ***, *.*.*, ******
*..*.**..***.*.* -> *, *..*.*, *.....*...*, *..*.**..***.*.*
*...*****.**.**  -> *, *...**.**, *.....*, *...*****.**.**

我々は(例えば数字のリストとしてセットを取る場合[1,3,5,7]のために*.*.*.*)私たちは、それがソートだと仮定することができますか?
マーティンエンダー

1
これは、係数が0および1に制限されている多項式の約数を見つけることと同等ですか?
-xnor

1
@xnorよくわかりません。場合は*.*.*= x+x^2+x^4、そして1+x+x^2= ***右、除数でしょうか?x+x^2+x^4 = (1-x+x^2)(1+x+x^2)
mbomb007

1
@JonathanAllan例*として、*.またはと同じサブセットを表す因子としてリストされてい*..ます。
マーティンエンダー

1
@JonathanAllan有効なセットのすべてのASCII表現を出力するのではなく、すべてのセットを出力します。
マーティンエンダー

回答:


3

Mathematica、71 68バイト

#&@@@Cases[(s=Subsets)@s@#,x_/;Sort[Join@@x]==#&&Equal@@(#&@@@x-x)]&

{1,3,5,7}(ソート済み)として入力し、として出力し{{1, 3, 5, 7}, {1, 3}, {1, 5}, {1}}ます。関数は大量のメッセージをスローします。

これはO(2 2 いいえ)ですNは入力の長さ、o = p = e = 1 ...)。サブセットのすべてのサブセットを生成し、結合されたときに入力を送信するものを選択し(パーティションのみを考慮していることを確認します)、各サブセットの最小値を減算するとすべての要素が同じになります)。


2

ゼリー、12バイト

;÷@DỊȦ
ÆDçÐf

入出力の使用 1 andの0代わりに*andを.

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

使い方

ÆDçÐf   Main link. Argument: n (integer with decimal digits 1 and 0)

ÆD      Compute all divisors of n.
  çÐf   Filter; call the helper link with left argument d and right argument n for
        all divisors d of n. Return the array of d's for which the helper link
        returns a truthy value.


;÷@DỊȦ  Helper link. Left argument: d. Right argument: n

 ÷@     Divide n by d.
;       Concatenate, yielding [d, n÷d].
   D    Decimal; convert both integers in the pair to base 10.
    Ị   Insignificant; map 1 and 0 to 1, all other positive integers to 0.
     Ȧ  All; return 1 iff the result contains no zeroes.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.