Encuentra las cuotas impares


14

Dada una colección desordenada de enteros positivos por cualquier método de entrada razonable, devuelve todas las subcolecciones que tienen un número impar de elementos impares (es decir, tienen un total impar).

Esto es por lo que debe intentar minimizar el recuento de bytes de su programa.

Dado que algunos idiomas solo tienen colecciones ordenadas (listas, matrices, vectores, etc.) o no tienen una colección desordenada que permita duplicados, puede usar colecciones ordenadas (independientemente de su elección de idioma), sin embargo, no debe generar ninguna colección duplicada con diferentes órdenes (p. ej. [2,3]y[3,2] . ). Puede imprimir en el orden que considere conveniente.

Casos de prueba

[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
¿Se permiten subcolecciones duplicadas? Como en, para [2, 2, 3], ¿podemos volver [[2, 2, 3], [2, 3], [2, 3]]?
HyperNeutrino

1
Sugerencia: la suma de este conjunto solo puede ser impar. Cualquier otra variante de estos conjuntos solo puede tener una suma par.
tuskiomi

@HyperNeutrino No, solo debes devolver cada uno una vez
Post Rock Garf Hunter

Bueno. ¿Las subcolecciones deben estar en orden ascendente o está bien enumerarlas en el orden proporcionado en la matriz original?
HyperNeutrino

@HyperNeutrino Pueden estar en cualquier orden, (idealmente serían una colección desordenada, pero muchos idiomas no tienen esa construcción, por lo que las colecciones ordenadas están bien siempre que el orden no sea importante)
Post Rock Garf Hunter

Respuestas:




3

Pyth , 10 9 8 bytes

{f%sT2yS

Pruébalo en línea!

         # 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%sT2yparece guardar un byte.
Erik the Outgolfer

3

Python 2 , 91 bytes

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

Imprime un conjunto de tuplas. Si se permite un conjunto de cadenas, tuple(sorted(y))se puede reemplazar `sorted(y)`por 86 bytes .

Pruébalo en línea!


2

Jalea , 9 bytes

ṢŒPSḂ$ÐfQ

Pruébalo en línea!

Error solucionado gracias a Jonathan Allan.

ṢŒ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

2

Perl 6 , 50 bytes

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

Para filtrar las combinaciones del mismo orden, filté los duplicados convirtiéndolos en una Bag(colección desordenada) antes de comparar. Lamentablemente, no pude encontrar una manera de aceptar una Bagentrada que fuera tan concisa.


2

Brachylog , 11 bytes

o⊇ᵘ{+ḃt1&}ˢ

Pruébalo en línea!

Esperaba encontrar una solución más corta, pero aquí está lo mejor que podía hacer.

Explicación

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.

Sí, podría haber usado el módulo 2 para verificar la rareza, pero ese no es un enfoque extraño;)


2

Mathematica 31 44 38 bytes

Entre todos los subconjuntos del conjunto de entrada, devuelve aquellos para los cuales la suma Tr, es impar.

6 bytes guardados gracias a alephalpha.

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}}


¿Qué pasa con el espacio?
CalculatorFeline

1
Por desgracia, esto no cumple las especificaciones, como {2,3}y {3,2}no debe ser devuelto tanto (lo mismo con {2,7}y {7,2}).
Greg Martin

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

1

PHP, 126 bytes

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);

toma datos de los argumentos de la línea de comandos; ejecutar -nro probarlo en línea .

Descompostura

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.