ค้นหาอัตราเดิมพันคี่


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 คุณไม่ควรกลับมาแต่ละคนอีกครั้ง
โพสต์ร็อคการ์ฟฮันเตอร์

ตกลง. คอลเลกชันย่อยต้องอยู่ในลำดับจากน้อยไปหามากหรือเป็นเรื่องปกติที่จะแสดงรายการเหล่านั้นตามลำดับที่ระบุในอาร์เรย์ดั้งเดิมหรือไม่?
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 ใช่ (ความคิดเห็นตอบกลับไปยัง Jonathan) ขอบคุณที่เตือนฉัน.
HyperNeutrino

2%สามารถเล่นกอล์ฟถึงÉและ}สามารถลบออกได้ แต่คำตอบของคุณดูเหมือนจะมีปัญหา
Erik the 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}

ส่งคืนชุดของ tuples น่าจะนานเกินไป

ลองออนไลน์!


แม้จะมีรูปลักษณ์ภายนอกแล้วมันก็ค่อนข้างดี นี่คือความพยายามที่ไม่ชำนาญของฉันสำหรับการอ้างอิง
โพสต์ Rock Garf Hunter


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

Brachylogขนาด 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.

ใช่ฉันสามารถใช้ modulo 2 เพื่อตรวจสอบความแปลก แต่นั่นไม่ใช่วิธีที่แปลก;)


2

Mathematica 31 44 38 ไบต์

ในชุดย่อยทั้งหมดของชุดอินพุตจะส่งคืนชุดที่ผลรวมTrเป็นคี่

บันทึก 6 ไบต์ด้วย 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}}


พื้นที่ว่างคืออะไร
CalculatorFeline

1
แต่นี้ไม่ตรงตามสเปคที่เป็น{2,3}และ{3,2}ไม่ควรทั้งสองจะกลับมา (เช่นเดียวกับ{2,7}และ{7,2})
Greg Martin

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

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.