Знайдіть шанси на випадок


14

З огляду на невпорядковану колекцію позитивних цілих чисел будь-яким розумним методом введення, поверніть усі підбірки, які мають непарне число непарних елементів (тобто мають непарне значення).

Це тому ви повинні прагнути мінімізувати кількість байтів вашої програми.

Оскільки деякі мови мають лише упорядковані колекції (списки, масиви, вектори тощо) або не мають упорядкованої колекції, яка дозволяє копіювати, ви можете використовувати впорядковані колекції (незалежно від вашого вибору мови), однак не слід виводити жодних дублікатів колекцій з різними замовленнями (наприклад, [2,3]та [3,2]). Ви можете виводити в будь-якому порядку, який вважаєте за потрібне.

Тестові справи

[2,3,7,2] -> [[3],[7],[2,3],[2,7],[2,2,3],[2,2,7]]
[2,4,6,8] -> []
[4,9]     -> [[9],[4,9]]

2
Чи дозволені повторювані підзаголовки? Як, наприклад [2, 2, 3], ми можемо повернутися [[2, 2, 3], [2, 3], [2, 3]]?
HyperNeutrino

1
Підказка: сума такої множини може бути лише непарною. Будь-який інший варіант цих наборів може мати лише рівну суму.
tuskiomi

@HyperNeutrino Ні, ви не повинні повертати кожного лише один раз
Post Rock Garf Hunter

Добре. Чи повинні підколекції бути у порядку зростання чи доречно перелічити їх у порядку, передбаченому в початковому масиві?
HyperNeutrino

@HyperNeutrino Вони можуть бути в будь-якому порядку (в ідеалі вони були б не упорядкованою колекцією, але багато мов не мають такої конструкції, тому впорядковані колекції прекрасні, доки порядок не важливий)
Post Rock Garf Hunter

Відповіді:


5

05AB1E , 6 байт

{æÙʒOÉ

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

{æÙʒOÉ
{      Sort
 æ     Powerset
  Ù    Uniqufy
   ʒ   Keep elements where
    O                      the sum
     É                             is uneven

-2 байти завдяки @EriktheOutgolfer


@WheatWizard Так (коментар відповідь Джонатану). Дякую, що нагадали.
HyperNeutrino

2%можна взяти в гольф Éі }можна видалити. Але ваша відповідь, здається, має питання.
Ерік Аутгольфер

4

Python 3 , 93 байти

f=lambda x,r=[[]]:x and f(x[1:],r+[y+x[:1]for y in r])or{(*sorted(y),)for y in r if sum(y)&1}

Повертає набір кортежів. Швидше за все, шлях занадто довгий.

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


Незважаючи на зовнішній вигляд, це насправді досить добре. Ось моя любительська спроба для довідки
Post Rock Garf Hunter




2

Perl 6 , 50 байт

{.combinations.grep(*.sum!%%2).unique(:as(*.Bag))}

Щоб відфільтрувати однакові комбінації замовлень, я фільтрую дублікати, перетворюючи кожну у Bag(не упорядковану колекцію) перед порівнянням. На жаль, я не зміг знайти спосіб прийняти Bagвклад як такий стислий.


2

Брахілог , 11 байт

o⊇ᵘ{+ḃt1&}ˢ

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

Я сподівався знайти коротше рішення, але ось найкраще, що я міг зробити.

Пояснення

o⊇ᵘ{+ḃt1&}ˢ    
o                                        the input, sorted
 ⊇ᵘ           Find all unique subsets of

   {    &}ˢ   Then select only those results where
    +                                          the sum
     ḃ                           the base 2 of
      t        The last digit of
       1                                               is 1.

Так, я міг би використовувати модуль 2, щоб перевірити наявність дивацтва, але це не дивний підхід;)


2

Mathematica 31 44 38 байт

Серед усіх підмножин вхідного набору він повертає ті, для яких сума, Trнепарна.

6 байт збережено завдяки алефальфі.

Select[Union@Subsets@Sort@#,OddQ@*Tr]&

 Select[Union@Subsets@Sort@#,OddQ@*Tr]&[{2,3,7,2}]

{{3}, {7}, {2, 3}, {2, 7}, {2, 2, 3}, {2, 2, 7}}


Що з простором?
CalculatorFeline

1
На жаль, це не відповідає специфікації, як {2,3}і {3,2}не повинно бути обом поверненим (те ж саме, що {2,7}і з {7,2}).
Грег Мартін

Select[Union@Subsets@Sort@#,OddQ@*Tr]&
алефальфа

1

PHP, 126 байт

for(;++$i>>$argc<1;sort($t),$s&1?$r[join(_,$t)]=$t:0)for ($t=[],$j=$s=0;++$j<$argc;)$i>>$j&1?$s+=$t[]=$argv[$j]:0;print_r($r);

приймає дані з аргументів командного рядка; запустіть -nrабо спробуйте в Інтернеті .

зламатися

for(;++$i>>$argc<1;             # loop through subsets
    sort($t),                       # 2. sort subset
    $s&1?$r[join(_,$t)]=$t:0        # 3. if sum is odd, add subset to results
    )                               # 1. create subset:
    for ($t=[],$j=$s=0;++$j<$argc;)     # loop through elements
        $i>>$j&1?                       # if bit $j is set in $i
        $s+=$t[]=$argv[$j]:0;           # then add element to subset
print_r($r);                    # print results
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.