N固有の加算セット


10

セットは重複することなく順序付けされていないことに注意してください。

定義アンN -uniquely添加集合S長さであり、Kは、セットようであるすべてのNに-lengthサブセットSの異なる数の合計。言い換えれば、SのすべてのN長さのサブセットの合計はすべて異なっています。

対物入力として配列/セットと番号が与えられるN任意の合理的な形式で機能するか、完全なプログラムには、検索およびリターン又は出力truthy又はfalsey値入力であるか否かを示す(falseyためerroringは大丈夫です)N -独自の添加剤。

各要素は最大で1回しか出現せず、各数値は言語のネイティブデータ型内にあると想定できます。必要に応じて、入力がソートされていると想定することもできます。最後に、あなたはそれを仮定するかもしれません0 < N <= K

セットS = {1, 2, 3, 5}とを考えてみましょうN = 2。以下は、すべての一意のペアのすべての合計ですS(一意のペアのみが合計の対象となるため)。

1 + 2 = 3
1 + 3 = 4
1 + 5 = 6
2 + 3 = 5
2 + 5 = 7
3 + 5 = 8

出力に重複がないことがわかるので、Sは2一意的に加算されます。


次に、セットT = {12, 17, 44, 80, 82, 90}とについて考えてみましょうN = 4。長さ4の可能な合計は次のとおりです。

12 + 17 + 44 + 80 = 153
12 + 17 + 44 + 82 = 155
12 + 17 + 44 + 90 = 163
12 + 17 + 80 + 82 = 191
12 + 17 + 80 + 90 = 199
12 + 17 + 82 + 90 = 201
12 + 44 + 80 + 82 = 218
12 + 44 + 80 + 90 = 226
12 + 44 + 82 + 90 = 228
12 + 80 + 82 + 90 = 264
17 + 44 + 80 + 82 = 223
17 + 44 + 80 + 90 = 231
17 + 44 + 82 + 90 = 233
17 + 80 + 82 + 90 = 269
44 + 80 + 82 + 90 = 296

それらはすべて一意であるため、Tは4一意に加算されます。

テストケース

[members], N => output
[1, 4, 8], 1 => true
[1, 10, 42], 1 => true                ; all sets trivially satisfy N = 1
[1, 2, 3, 4], 3 => true
[1, 2, 3, 4, 5], 5 => true
[1, 2, 3, 5, 8], 3 => true
[1, 2, 3, 4, 5], 2 => false           ;  1 +  4       =  5 =        2 + 3
[-2, -1, 0, 1, 2], 3 => false         ; -2 + -1 + 2   = -1 =   -2 + 0 + 1
[1, 2, 3, 5, 8, 13], 3 => false       ;  1 +  2 + 13  = 16 =    3 + 5 + 8
[1, 2, 4, 8, 16, 32], 3 => true
[1, 2, 4, 8, 16, 32], 4 => true
[1, 2, 4, 8, 16, 32], 5 => true
[1, 2, 4, 8, 16, 32], 6 => true
[3, 4, 7, 9, 12, 16, 18], 6 => true
[3, 4, 7, 9, 12, 16, 18], 3 => false  ; 3 + 4 + 12 = 19 = 3 + 7 + 9

つまりN <= K
Neil

@ニールはい、そうです。ごめんなさい!
Conor O'Brien

エラーは何かとしてカウントされますfalseyか?
flawr

@flawr承知しました、これを受け入れます
Conor O'Brien

回答:


3

MATL、7バイト

XN!sSdA

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

true(として表示1)またはfalse(として表示)を返します0

XN   % Take array S and number N. Generate all combinations of elements from S 
     % taken N at a time. Gives a 2D array where each combination is a row
!    % Transpose. Each combination is now a column
s    % Sum of each column: gives a row array. If N=1 computes the sum of
     % the only row, and so gives a number
S    % Sort vector
d    % Array of consecutive differences. For a single number gives an empty array
A    % True if all elements of the input array are nonzero (for an empty array
     % it also gives true)

4

ゼリー、7バイト

œcS€ṢIP

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

真の場合は正の数、偽の場合はゼロを返します。

œc       find combinations
  S€     sum each combination
    Ṣ    sort the sums
     I   find the difference between each pair of sums 
           iff any sums are the same, this returns a list containing 0
      P  product of the elements of the resulting list

3

Matlab、78バイト

function n=f(s,n);p=perms(s);k=sum(unique(sort(p(:,1:n)),'rows')');unique(k)-k

この関数は、trueの場合は(実際にはn)正の値を返し、falseの回答としてエラーを返します(このコメントに従って有効)

説明:

function n=f(s,n);
p=perms(s); %create all permutations of the set

k=sum(unique(sort(p(:,1:n)),'rows')');
                  %just take the first n entries of each permutation
             %sort those entries and
      %filter out all duplicates (we sorted as the order should NOT matter)
  %then sum each of those candidates

unique(k)-k
%if all those sums are distinct, unique(k) will have the same size 
% as k itself, and therefore we can subtract, otherwise it will throw 
% an error as we try to subtract vectors of different sizes

なぜエラーになるのですか?
Conor O'Brien

1
説明を追加しました。エラーは最後の行から来ています。に重複がある場合、エラーが発生しますk。PS:Matlab構文強調表示がついに動作しました!!!
flawr

同じものを返すのは良い考えnです!
Luis Mendo

2

Pyth、8バイト

{IsM.cFQ

テストスイート。

       Q   eval input (provided as a 2-element array)
    .cF    splat over combination
  sM       sum each combination
{I         is the result invariant under { (dedup/uniq)?

どういうsplat意味ですか?
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ他のすべての言語でも同じことです。関数の引数として配列を使用します。
ドアノブ

おお、そうだ、私はばかげている:pありがとう
コナー・オブライエン

2
実際にこの機能を備えている他のすべての言語で
flawr

2
Q最後にそれを必要とするバグを修正しました。
isaacg 2016年

2

Haskell、69バイト

import Data.List
n#s=(==)=<<nub$[sum x|x<-subsequences s,length x==n]

使用例:6 # [3,4,7,9,12,16,18]-> True

定義の直接実装:長さnのすべてのサブシーケンスの合計のリストを作成し、重複が削除されてそれ自体と等しいかどうかを確認します。


2

JavaScript(ES6)、132バイト

(a,n)=>a.map(m=>{for(i=n;i--;)s[i].map(k=>s[i+1].push(m+k))},s=[...Array(n+1)].map(_=>[]),s[0]=[0])&&new Set(s[n]).size==s[n].length

1からnまでの追加リストを作成し、最後のリストの一意性をチェックします。


2

Brachylog、20バイト

:1f:+aLdL
[L:I]hs.lI

リストを含み、入力として整数を含み、出力を持たないリストを期待しますrun_from_atom(':{[L:I]hs.lI}f:+aLdL', [[1:2:3:5]:2]).

説明

  • 主述語

               Input = [A:I]
    :1f        Find all ordered subsets of A of length I
       :+aL    Apply summing to each element of that list of subsets. Call that L
           dL  True if L minus all duplicate elements is still L
    
  • 述語1:リストの固定長のすべての順序付けられたサブセットを見つける

    [L:I]      Input = [L:I]
         hs.   Unify Output with an ordered subset of L
            lI True if I is the length of Output
    

2

ジュリア、46 41バイト

x\n=(t=map(sum,combinations(x,n)))==tt

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

使い方

これは、\Array / Int引数の2項演算子を(再)定義します。

combinations(x,n)xのちょうどn個の異なる要素のすべての配列を返します。これらの配列をマッピングして、結果をtに格納します。sum

t∪t配列tの集合和をそれ自体で実行しuniqueます。これは、この場合はより長く機能します。

最後に、我々は比較トンを重複排除されてトン戻って、trueそしてすべての合計が異なっている場合にだけ。


2

Python、89バイト

from itertools import*
lambda s,n,c=combinations:all(x^y for x,y in c(map(sum,c(s,n)),2))

Ideoneでテストします。

使い方

c(s,n)リストのすべてのn個の-combinations sが、すなわち、すべてのリストをn個の異なる要素sum結果のリストをマッピングして、長さnのサブリストのすべての可能な合計を計算します。

病棟終了後c(...,2)、結果の合計のすべてのペアを作成するために使用します。任意の2つの合計が場合xは、およびyが等しく、x^y返され0all戻ります。逆に、すべての合計が一意の場合、x^y常に真であり、Trueanyを返します


1

J、34バイト

load'stats'
[:*/@~:[:+/"1(comb#){]

単純明快なアプローチ。機能statsに必要なのはアドオンだけcombです。0falseおよび1trueを返します。

comb組み込みを使用する代わりに、累乗セットを生成してサイズnのサブセットを選択する38バイトのソリューションがあります。

[:*/@~:(>@{[:(</.~+/"1)2#:@i.@^#)+/@#]

使用法

   f =: [:*/@~:[:+/"1(comb#){]
   2 f 1 2 3 5
1
   4 f 12 17 44 80 82 90
1
   3 f _2 _1 0 1 2
0
   6 f 3 4 7 9 12 16 18
1
   3 f 3 4 7 9 12 16 18
0

うわー、statsモジュールについて知りませんでした。非常に素晴らしい!
Conor O'Brien

私もそれについて知ったばかりで、Jのアドオンについてはあまり詳しく調べていません。もっと勇気があるなら、グラフィックアドオンを試してみます。
マイル

0

Ruby、50バイト

->s,n{!s.combination(n).map{|c|c.inject :+}.uniq!}

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

すべての要素が一意の場合、をuniq!返しますnil。のようにその結果を否定すること!(...).uniq!は、優れた一意性テストになります。

この質問は Ruby 2.4.0-preview1が導入される数週間前に投稿されまし。これによりEnumerable#sum、ここで9バイトが節約されます。

41バイト(Ruby 2.4以降)

->s,n{!s.combination(n).map(&:sum).uniq!}

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


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