Oranları bulun


14

Herhangi bir makul giriş yöntemi ile pozitif tamsayıların sırasız bir koleksiyonu göz önüne alındığında, tek sayıda tek eleman içeren (yani tek bir toplam) tüm alt koleksiyonları döndürün.

Bu bu nedenle programınızın bayt sayısını en aza indirmeyi amaçlamalısınız.

Bazı diller yalnızca koleksiyonlar (listeler, diziler, vektörler vb.) Sipariş ettiğinden veya kopyalara izin vermeyen sırasız bir koleksiyona sahip olmadığından, sipariş edilen koleksiyonları (dil seçiminize bakılmaksızın) kullanabilirsiniz, ancak yinelenen koleksiyonlar çıkarmamalısınız. farklı siparişler ile (örneğin [2,3]ve [3,2]). Uygun gördüğünüz sırayla çıktı alabilirsiniz.

Test senaryoları

[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
Yinelenen alt toplamalara izin veriliyor mu? Gibi [2, 2, 3], biz dönebilir [[2, 2, 3], [2, 3], [2, 3]]miyim?
HyperNeutrino

1
İpucu: Böyle bir setin toplamı sadece garip olabilir. Bu setlerin diğer tüm varyantları sadece çift bir miktara sahip olabilir.
tuskiomi

@HyperNeutrino Hayır, her birini yalnızca bir kez iade etmelisiniz
Post Rock Garf Hunter

Tamam. Alt toplamaların artan sırada olması mı gerekiyor yoksa orijinal dizide verilen sırayla listelemek iyi mi?
HyperNeutrino

@HyperNeutrino Herhangi bir sırada olabilirler (ideal olarak sıralanmamış bir koleksiyon olurdu, ancak birçok dilde siparişin önemli olmadığı sürece sıralı koleksiyonların iyi olması için böyle bir yapı yok)
Post Rock Garf Hunter

Yanıtlar:


5

05AB1E , 6 bayt

{æÙʒOÉ

Çevrimiçi deneyin!

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

@EriktheOutgolfer sayesinde -2 bayt


@WheatWizard Evet (Jonathan'a yorum yanıtı). Bana hatırlattığın için teşekkürler.
HyperNeutrino

2%golf edilebilir Éve }çıkarılabilir. Ama cevabınızın sorunu var gibi görünüyor.
Outgolfer Erik


3

Pyth , 10 9 8 bayt

{f%sT2yS

Çevrimiçi deneyin!

         # 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%sT2ybir bayt kaydediyor gibi görünüyor.
Outgolfer Erik

3

Python 2 , 91 bayt

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

Bir dizi tuples yazdırır. Dize kümesi izin verilirse, tuple(sorted(y))değiştirilebilir `sorted(y)`için 86 bayt .

Çevrimiçi deneyin!


2

Perl 6 , 50 bayt

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

Aynı sipariş sırasına göre kombinasyonları filtrelemek için, Bagkarşılaştırmadan önce her birini bir (sırasız koleksiyona) dönüştürerek kopyaları filtreliyorum . Ne yazık ki bir Bagöz girişi olarak kabul etmek için bir yol bulamadım .


2

Brachylog , 11 bayt

o⊇ᵘ{+ḃt1&}ˢ

Çevrimiçi deneyin!

Daha kısa bir çözüm bulmayı umuyordum, ancak yapabileceğim en iyi şey bu.

açıklama

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.

Evet, garipliği kontrol etmek için modulo 2'yi kullanabilirdim, ama bu garip bir yaklaşım değil;)


2

Mathematica 31 44 38 bayt

Girdi kümesinin tüm alt kümeleri arasında, toplamın Trtek olduğu kümeler döndürülür .

Alephalpha sayesinde 6 bayt kurtarıldı.

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


Alan ne?
CalculatorFeline

1
Ne yazık ki bu, özelliklerini karşılamıyor {2,3}ve {3,2}hem döndürdü (aynı olmamalıdır {2,7}ve {7,2}).
Greg Martin

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


1

PHP, 126 bayt

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

komut satırı bağımsız değişkenlerinden girdi alır; ile çalıştırın -nrveya çevrimiçi deneyin .

Yıkmak

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.