N-унікально набір добавок


10

Пам'ятайте, що набір не упорядкований без дублікатів.

Визначення N -uniquely аддитивная S , довжина якої До являє собою набір таким чином, що всі N -довжина підмножини S суми до різних номерів. Іншими словами, всі суми N- довжини підмножини S є різними.

Завдання З огляду на масив / набір як вхід та номер 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 є однозначно додатковою добавкою.


Розглянемо тепер множину T = {12, 17, 44, 80, 82, 90}і N = 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

Матлаб, 78 байт

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

Ця функція повертає позитивне значення (фактично n) для truthy та повертає помилку як відповідь фальси (дійсна відповідно до цього коментаря )

Пояснення:

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 нарешті працює !!!
невдача

Гарна ідея повернути те саме n!
Луїс Мендо

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 дякую
Conor O'Brien

2
будь-якою іншою мовою, яка насправді має цю функцію,
помилка

2
Я виправив помилку, яка вимагала цього Qв кінці.
isaacg

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

Брахілог , 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

Спробуйте в Інтернеті!

Як це працює

Це (re) визначає двійковий оператор \для аргументів Array / Int.

combinations(x,n)повертає всі масиви рівно n різних елементів x . Зображуємо sumці масиви і зберігаємо результат у t .

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 -комбінації s , тобто всі списки n різних елементів s . Зображуємо sumотримані списки, обчислюючи таким чином всі можливі суми підсписів довжиною n .

Після підопічних ми використовуємо c(...,2)для створення всіх пар отриманих сум. Якщо будь-які дві суми x і y рівні, x^yповернемо 0 і allповернуть False . І навпаки, якщо всі суми унікальні, x^yвони завжди будуть правдивими і anyповертатимуть True .


1

J, 34 байти

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

Підхід прямо вперед, вимагає лише statsдоповнення для combфункції. Повертається 0за хибним та 1за істинним.

В якості альтернативи використанню combвбудованого рішення є 38-байтне рішення, яке генерує набір потужності та вибирає підмножини розміру n .

[:*/@~:(>@{[:(</.~+/"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

Я про це теж дізнався, я не дуже сильно заглиблювався в додатки Дж. Якби я був сміливішим, я спробував би доповнити графіку.
миль

0

Рубін , 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!}

Спробуйте в Інтернеті!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.