Найти нечетные шансы

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
Ладно. Подколлекции должны быть в порядке возрастания или можно перечислить их в порядке, указанном в исходном массиве?
HyperNeutrino
@HyperNeutrino Они могут быть в любом порядке (в идеале они должны быть неупорядоченной коллекцией, но многие языки не имеют такой конструкции, поэтому упорядоченные коллекции хороши, если порядок не важен)
Post Rock Garf Hunter

Ответы:

5

05AB1E , 6 байтов

{æÙʒOÉ

Попробуйте онлайн!

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

-2 байта благодаря @EriktheOutgolfer

HyperNeutrino
источник
@WheatWizard Да (комментарий, ответ Джонатану). Спасибо за напоминание.
HyperNeutrino
2%может быть в гольф Éи }может быть удален. Но ваш ответ, похоже, имеет значение.
Эрик Outgolfer
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}

Возвращает набор кортежей. Скорее всего, слишком долго.

Попробуйте онлайн!

Деннис
источник
Несмотря на свою внешность, это на самом деле довольно хорошо. Вот моя любительская попытка для справки
Пост Рок Гарф Хантер
3

Pyth , 10 9 8 байт

{f%sT2yS

Попробуйте онлайн!

         # implicit input
       S # sort input, this way the subsets will already be sorted
      y  # all subsets
 f       # filter elements when ..
   sT    # the sum ..
  %  2   # is odd
{        # remove all duplicated elements
         # implicit output
прут
источник
1
{SMf%sT2yкажется, сохраняет байт.
Эрик Outgolfer
3

Python 2 , 91 байт

r=[[]]
for n in input():r+=map([n].__add__,r)
print{tuple(sorted(y))for y in r if sum(y)&1}

Печатает набор кортежей. Если набор строк разрешен, tuple(sorted(y))может быть заменен `sorted(y)`на 86 байтов .

Попробуйте онлайн!

Деннис
источник
2

Желе , 9 байт

ṢŒPSḂ$ÐfQ

Попробуйте онлайн!

Ошибка исправлена ​​благодаря Джонатану Аллану.

ṢŒPSḂ$ÐfQ  Main Link
Ṣ          Sort
 ŒP        Powerset
      Ðf   Filter to keep elements where                         is truthy
    Ḃ                                    the last bit of
   S                                                     the sum
        Q  Only keep unique elements
HyperNeutrino
источник
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}}

DavidC
источник
Что с пространством?
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
Titus
источник