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


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


@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

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

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.