N 고유 첨가제 세트


10

세트는 중복없이 순서가 정렬되지 않습니다.

정의 N -uniquely 첨가제 세트 S 는 길이 인 K가 세트 등이다 모두 N 의 서브 세트 - 길이 S의 상이한 수에 합. 다시 말해, S 의 모든 N- 길이 부분 집합의 합 은 모두 구별된다.

목적 입력으로 배열 / 설정 및 N함수 나 전체 프로그램에 적절한 형식으로 숫자가 주어지면 입력이 N 인지 여부를 나타내는 진실 또는 거짓 값 (거짓 오류는 괜찮습니다)을 찾아서 반환하거나 출력합니다 - 독창적 인 첨가제.

각 요소는 최대 한 번만 나타나고 각 숫자가 언어의 기본 데이터 유형 내에 있다고 가정 할 수 있습니다. 필요한 경우 입력이 정렬되었다고 가정 할 수도 있습니다. 마지막으로을 가정 할 수 있습니다 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

@ 닐 예, 그렇습니다. 죄송합니다!
코너 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

온라인으로 사용해보십시오!

진리의 경우 양수를, 거짓의 경우 0을 반환합니다.

œ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

이 함수는 양의 값을 (사실 반환 n에 대한) truthy 반환 A와 오류 falsey의 (에 유효한있어서, 대답 이 댓글 )

설명:

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

왜 오류가 발생합니까?
코너 O'Brien

1
방금 설명을 추가했습니다. 마지막 줄에서 오류가 발생합니다. 에 중복이 있으면 오류가 발생합니다 k. 추신 : Matlab 구문 강조가 마침내 작동합니다!
flawr

같은 것을 반환하는 것이 좋습니다 n!
Luis Mendo 2016 년

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뜻입니까?
코너 O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 다른 모든 언어에서와 같은 의미 : 배열을 함수의 인수로 사용하십시오.
Doorknob

아, 맞아, 바보 야 : P 고마워
코너 오브라이언

2
실제로이 기능이있는 다른 모든 언어로
flawr

2
Q마지막에 필요한 버그를 수정했습니다 .
isaacg 2016 년

2

하스켈, 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

자바 스크립트 (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 인수에 대한 이진 연산자 를 정의합니다 .

combinations(x,n)정확히 x의 n 개의 다른 요소로 구성된 모든 배열을 반환합니다 . 이러한 배열을 매핑 하고 결과를 t에 저장합니다 .sum

t∪t배열 t 의 집합 결합 자체를 수행하며, unique이 경우 더 길어집니다 .

마지막으로, 우리는 비교 t을 중복 제거와 t 반환, true모든 금액이 다른 경우 만.


2

파이썬, 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 즉, 모든 목록 N 의 다른 요소 . sum결과 목록을 매핑 하여 길이 n 의 가능한 모든 하위 목록 합계를 계산합니다 .

와드 후, 우리 c(...,2)는 결과 합계의 모든 쌍을 만드는 데 사용 합니다. 두 합이 경우 , XY는 동일, x^y반환 0 하고 all리턴 거짓 . 반대로 모든 합계가 고유 x^y하면 항상 진실하며 Trueany 를 반환 합니다.


1

J, 34 바이트

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

간단한 접근 방식 statscomb기능 에 대한 애드온 만 필요합니다 . 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모듈 에 대해 몰랐어요 . 아주 좋아요!
코너 O'Brien

방금 이것에 대해서도 알았습니다 .J의 애드온에 대해서는 많이 다루지 않았습니다. 더 용감하다면 그래픽 애드온을 시도합니다.
마일


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.