最大の明確に合計なしのパーティション


8

関連およびインスピレーションを得た- 合計なしのパーティションを見つける

セットがAあるとしてここで定義され、明確合計フリー場合

  • 1)少なくとも3つの要素|A| ≥ 3、および
  • 2)その別個の自己和A + A = { x + y | x, y in A}x,y別個、つまりx≠y)には、と共通の要素がありませんA

(廃止- 。。。今後、これを使用していないいくつかの答えは、それを使用している可能性があるため、左はここだけでは上記の条件と一致しない代わりに、方程式はx + y = zのためのソリューションを持っていませんx,y,z ∈ A(再びとのx,y,z明確な、つまり、x≠yx≠zy≠z。)

簡単な例で{1,3,5}は、は明らかに合計なしですが、そうで{1,3,4}はありません。{1,3}また{3}、少なくとも3つの要素ではないため、そうではありません。

ここでの課題は、特定の入力の最大の明確に合計のないサブセットを見つけることです。

入力

  • A任意の便利な形式の整数の順序なしセット。
  • 整数は、正、負、またはゼロにすることができますが、言語のネイティブ[int]データ型(または同等のもの)に適合すると想定できます。
  • セットは、明確な要素のみを持つことが保証されています(ここではマルチセットはありません)。
  • セットは必ずしもソートされていません。

出力

  • A(それA自体である可能性がある)の最大のサブセットであり、明らかに合計がありません。出力は任意の適切な形式にすることができます。
  • そのようなサブセットが存在しない場合は、空のセットまたはその他の誤った値を出力します
  • 複数のサブセットが最大に関連付けられている場合は、それらの一部またはすべてを出力します。
  • サブセットは必ずしもソートする必要はなく、入力と同じ順序にする必要もありません。たとえば、入出力の{1,3,5}場合{5,1,3}は許容されます。

追加ルール

Input     -> Output (any or all)
{0}       -> {}
{1, 2, 3} -> {}
{1, 3, 5} -> {1, 3, 5}
{1, 2, 3, 4, 5} -> {1, 2, 5}  {1, 2, 4}  {1, 3, 5}  {2, 3, 4}  {2, 4, 5}  {3, 4, 5}
{-5, 4, 3, -2, 0} -> {-5, 4, 3}  {-5, 4, -2}  {4, 3, -2}
{-5, 4, 3, -2} -> {-5, 4, 3}  {-5, 4, -2}  {4, 3, -2}
{-17, 22, -5, 13, 200, -1, 1, 9} -> {-17, 22, -5, 13, 200, -1, 1}  {-17, 22, -5, 200, -1, 1, 9}  {-17, -5, 13, 200, -1, 1, 9}

回答:



4

MATL47 43バイト

nW:qB!ts2#Sw2>)PZ)"1G@)XJ2XN!"@sJ@X-m~*]?J.

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

説明

これは2つのループを使用します。外側のループはすべての可能なサブセットを生成し、内側のループは要素のすべてのペアを取得して、合計がサブセットの他の要素と等しいかどうかを確認します。

少なくとも3つの要素のサブセットが、要素数の減少順にテストされます。コードは、有効なサブセットが見つかるとすぐに停止します。

          % Take input implicitly
nW:q      % Generate [0 1 ... 2^n-1] where n is input length
B!        % Convert to binary. Gives a matrix. Each number corresponds to a column.
          % This will be used to select the elements of each subset
ts        % Duplicate. Sum of each column
2#S       % Sort. Output the sorted array and the indices of the sorting. Each index
          % corresponds to one possible subset
w2>       % Swap. Logical index of values that exceed 2. This is used to pick only
          % subsets of more than 2 elements
)         % Keeps only indices of subsets that have at least 3 elements
P         % Flip. This moves subsets with more elements to the front. As soon as a
          % subset fulfills the condition the outer loop will be exited, so we need
          % to start with the bigger subsets
Z)        % Index into columns of binary matrix. Each column is the binary pattern
          % defining a subset with at least 3 elements, starting with bigger subsets
"         % For each column. Each iteration corresponds to a subset
  1       %   Push 1
  G@)     %   Pick actual elements of each subset (logical index into input)
  XJ      %   Copy to clipboard J
  2XN!    %   All pairs of 2 elements from that subset. Each pair is a column
  "       %   For each column. Each iteration corresponds to a pair of elements
    @s    %     Sum of those two elements
    J@X-  %     Array with the other elements (obtained with set difference)
    m~    %     True if the sum of the two elemens is not a member of the array
    *     %     Multiply. Corresponds to logical AND
  ]       %   End for
  ?       %   If result is true: no sum of two elements equalled any element
    J     %     Push found subset (will be displayed implicitly)
    .     %     Exit loop
          %   End if implicitly
          % End for implicitly
          % Display stack implicitly

3

Python、137バイト

ナイーブなアプローチ。少なくとも3つの値を含む入力のすべてのサブセットをループし、それぞれのプロパティをチェックします。[]結果が見つからない[S]場合、または少なくとも1つの結果が見つかった場合に返されます(どこSかにタプルがあります)。

from itertools import*
lambda a:[c for n in range(3,len(a)+1)for c in combinations(a,n)if all(x+y-z for(x,y,z)in permutations(c,3))][-1:]

2

JavaScript 246 263

a=>([...Array(1<<(l=a.length))].map((x,i)=>i.toString(2)).filter(n=>/1.*1.*1/.test(n)).map(s=>('0'.repeat(l)+s).slice(-l).replace(/./g,(b,p)=>+b&&o.push(a[p]),o=[])&&o).filter(u=>u.every((x,i)=>!u.some((y,j)=>j-i&&u.some((z,k)=>k-j&&!(z-x-y))))))

とても長い:( ...しかし、それは素晴らしいコーディングだった..(私は思う)

より少ないゴルフ:

f=a=>(
    [...Array(1<<(l=a.length))]
        .map((x,i)=>i.toString(2))
        .filter(n=>/1.*1.*1/.test(n))
        .map(s=>
            ('0'.repeat(l)+s).slice(-l).replace(/./g,
                (b,p)=>+b&&o.push(a[p])
            ,o=[])&&o
        )
        .filter(u=>
            u.every((x,i)=>
                !u.some((y,j)=>
                    j-i&&u.some((z,k)=>k-j&&!(z-x-y))
                )
            )
        )
)

document.body.innerHTML = JSON.stringify( f([1,2,3,4,5]), null, 1 );


2

Mathematica- 89 84 83 77 76バイト

@ Sp3000のおかげで6バイト節約

たぶんもっとゴ​​ルフをすることができますが、フィルタリングするより短い方法はありますか?

Select[Subsets@#,Length@#>2&&Intersection[#,Tr/@#~Subsets~{2}]=={}&]~Last~0&

匿名関数、0無応答で戻ります。


2

Ruby、107バイト

入力は配列です。から3入力の長さまでのサブセットサイズごとに適格なサブセットを1つ収集し、見つかったもののうち最大のものを返します。nil結果が見つからない場合に戻ります。

仕様が競合しているため、現在同じバイト数を持つ2つのソリューションがあります。

最初の定義を使用:({ x + y | x, y ∈ A } ∩ A = ∅

->s{((3..s.size).map{|i|s.combination(i).find{|e|e.combination(2).map{|a,b|a+b}&e==[]}}-[p])[-1]}

2番目の定義の使用(∀ x, y, z ∈ A: x + y ≠ z

->s{((3..s.size).map{|i|s.combination(i).find{|e|e.permutation(3).all?{|a,b,c|a+b!=c}}}-[p])[-1]}

0

Pyth、27バイト

ef!f!*Fm-Fd.pYfqlY3yTfglT3y

テストスイート。


これはどのように作動しますか?TIOで実行すると、予期しない出力が表示されるようです。
AdmBorkBork 2016年

申し訳ありませんが、今それを修正しました。
Leaky Nun 2016年

1
最大ではない1,3,5,100サブセットも出力するため、入力に対しては機能しません1,3,5
ジャクベ2016年

1
@Jakubeイニシャルをドロップeし、別のソリューションとして投稿する:D
Leaky Nun

1
最大のサブセット、またはすべての最大のサブセットを印刷する必要があります。したがって、これeは必須です。
ジャクベ2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.