ครอบคลุมผลรวมศูนย์


38

บทนำ

พิจารณารายการL ที่ไม่ว่างของจำนวนเต็ม ชิ้นศูนย์รวมของLเป็น subsequence ที่ต่อเนื่องกันของLที่มีผลรวมเท่ากับ 0. ตัวอย่างเช่น[1, -3, 2]เป็นชิ้นเป็นศูนย์รวมของ[-2, 4, 1, -3, 2, 2 , -1, -1]แต่[2, 2]ไม่ใช่ (เพราะมันไม่เท่ากับ 0) และไม่ใช่[4, -3, -1] (เพราะมันไม่ต่อเนื่องกัน)

คอลเลกชันของชิ้นผลรวมเป็นศูนย์ของLคือหน้าปกผลรวมเป็นศูนย์ของLหากทุกองค์ประกอบเป็นของชิ้นอย่างน้อยหนึ่งชิ้น ตัวอย่างเช่น:

L = [-2, 4, 1, -3, 2, 2, -1, -1]
A = [-2, 4, 1, -3]
B =        [1, -3, 2]
C =                  [2, -1, -1]

สามศูนย์รวมชิ้น, BและCในรูปแบบปกเป็นศูนย์รวมของL หลายชิ้นของชิ้นเดียวกันสามารถปรากฏในหน้าปกผลรวมเช่นนี้:

L = [2, -1, -1, -1, 2, -1, -1]
A = [2, -1, -1]
B =        [-1, -1, 2]
C =                [2, -1, -1]

แน่นอนว่าไม่มีรายการทั้งหมดที่มีปกเป็นศูนย์; ตัวอย่างบางส่วนคือ[2, -1] (ทุกชิ้นมีผลรวมที่ไม่ใช่ศูนย์) และ[2, 2, -1, -1, 0, 1] (ทางซ้ายสุด2ไม่ใช่ส่วนหนึ่งของชิ้นผลรวมศูนย์)

งาน

ข้อมูลที่คุณป้อนเป็นรายการเลขจำนวนเต็มL ที่ไม่มีการยกเว้นซึ่งดำเนินการในรูปแบบที่เหมาะสม ผลลัพธ์ของคุณจะเป็นค่าความจริงหากLมีการครอบคลุมเป็นศูนย์รวมและค่าเท็จถ้าไม่

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นและชนะนับไบต์ต่ำสุด

กรณีทดสอบ

[-1] -> False
[2,-1] -> False
[2,2,-1,-1,0,1] -> False
[2,-2,1,2,-2,-2,4] -> False
[3,-5,-2,0,-3,-2,-1,-2,0,-2] -> False
[-2,6,3,-3,-3,-3,1,2,2,-2,-5,1] -> False
[5,-8,2,-1,-7,-4,4,1,-8,2,-1,-3,-3,-3,5,1] -> False
[-8,-8,4,1,3,10,9,-11,4,4,10,-2,-3,4,-10,-3,-5,0,6,9,7,-5,-3,-3] -> False
[10,8,6,-4,-2,-10,1,1,-5,-11,-3,4,11,6,-3,-4,-3,-9,-11,-12,-4,7,-10,-4] -> False
[0] -> True
[4,-2,-2] -> True
[2,2,-3,1,-2,3,1] -> True
[5,-3,-1,-2,1,5,-4] -> True
[2,-1,-1,-1,2,-1,-1] -> True
[-2,4,1,-3,2,2,-1,-1] -> True
[-4,-1,-1,6,3,6,-5,1,-5,-4,5,3] -> True
[-11,8,-2,-6,2,-12,5,3,-7,4,-7,7,12,-1,-1,6,-7,-4,-5,-12,9,5,6,-3] -> True
[4,-9,12,12,-11,-11,9,-4,8,5,-10,-6,2,-9,10,-11,-9,-2,8,4,-11,7,12,-5] -> True

โดย "ทุกองค์ประกอบเป็นของชิ้นใดชิ้นหนึ่ง" คุณถือว่าคุณค่าเดียวกันกับดัชนีที่แตกต่างกันหรือไม่?
ngenisis

@ngenisis ใช่มันแตกต่างกันและแต่ละอันควรเกิดขึ้นในส่วนที่มีดัชนีที่เกี่ยวข้อง
Zgarb

2
ตัวอย่างที่ผิดพลาดไม่ควร[2,2,-1,-1,0,1] -> Falseเป็นจริงเพราะทั้งชิ้น[2,-1,-1]และ[-1,0,1]เพิ่มไปยังศูนย์และองค์ประกอบทั้งหมดของพวกเขาอยู่ในรายการเดิม?
dfernan

ซ้ายสุด 2 ไม่ได้เป็นส่วนหนึ่งของชิ้นผลรวมใด ๆ มันค่อนข้างไม่ชัดเจน แต่พวกเขาต้องเกิดขึ้นเป็นชิ้นที่ "บรรจุดัชนีของพวกเขา"
Zgarb

เข้าใจ นั่นทำให้มันยากขึ้น : o)
dfernan

คำตอบ:


11

เยลลี่ , 13 12 ไบต์

JẆịS¥ÐḟċþJḄẠ

ลองออนไลน์!

มันทำงานอย่างไร

JẆịS¥ÐḟċþJḄẠ  Main link. Argument: A (array)

J             Yield all indices of A.
 Ẇ            Window; yield all slices of indices.
     Ðḟ       Filter; keep slices for which the link to the left returns 0.
    ¥           Combine the two atoms to the left into a dyadic chain.
  ị               Retrieve the elements of A at the slice's indices.
   S              Take the sum.
         J    Yield the indices of A.
       ċþ     Count table; count how many times each index appears in each table.
          Ḅ   Unbinary; convery the array of counts of each index from base 2 to 
              integer. This yields 0 iff an index does not appear in any slice.
           Ạ  All; return 1 iff all integers are non-zero.

9

Mathematica, 66 65 ไบต์

บันทึก 1 ไบต์และหวังว่าจะได้เรียนรู้เคล็ดลับใหม่สำหรับอนาคตขอบคุณ ngenisis!

ทางเลือกที่มีความยาวเท่ากันสองตัวฟังก์ชันทั้งสองเป็นฟังก์ชันที่ไม่มีชื่อโดยรับรายการจำนวนเต็มเป็นอินพุตและส่งคืนTrueหรือFalse:

And@@Table[0==Product[Tr@#[[i;;j]],{i,k},{j,k,l}],{k,l=Tr[1^#]}]&

0==Norm@Table[Product[Tr@#[[i;;j]],{i,k},{j,k,l}],{k,l=Tr[1^#]}]&

ในทั้งสองกรณีTr@#[[i;;j]]คำนวณผลรวมของส่วนของอินพุตจากตำแหน่งหนึ่งiไปอีกตำแหน่งหนึ่งj(ดัชนี 1 ดัชนี) Product[...,{i,k},{j,k,l}]คูณด้วยกันทั้งหมดเหล่านี้ชิ้น-เงินก้อนเป็นiช่วงกว่าดัชนีที่มีมากที่สุดkและช่วงกว่าดัชนีที่มีอย่างน้อยj k(โปรดทราบว่าl=Tr[1^#]กำหนดlให้เป็นผลรวมของ1พลังทั้งหมดในรายการอินพุตซึ่งเป็นเพียงความยาวของรายการ) ในคำอื่น ๆ ผลิตภัณฑ์นี้เท่ากับ 0 ถ้าหากkองค์ประกอบ th เป็นสมาชิกของผลรวมเป็นศูนย์ .

ในเวอร์ชันแรกแต่ละผลิตภัณฑ์จะถูกเปรียบเทียบ0และAnd@@ส่งคืนTrueอย่างแม่นยำเมื่อทุกผลิตภัณฑ์มีค่าเท่า0กัน ในเวอร์ชันที่สองรายการผลิตภัณฑ์จะถูกดำเนินการโดยฟังก์ชันNorm(ความยาวของlเวกเตอร์มิติ - มิติ) ซึ่งเท่ากับ0ถ้าหากว่าทุกรายการเท่า0กัน


1
Tr[1^#]ช่วยประหยัดไบต์จาก1 Length@#
ngenisis

จะ0^ทำงานแทน0==หรือไม่ ไม่แน่ใจว่า Mathematica จัดการกับสิ่งนั้นอย่างไร (คุณจะกลับ1/ 0แทนtrue/ false)
Cyoce

1
ปคิด แต่ผลตอบแทนที่ได้ Mathematica สำหรับIndeterminate 0^0นอกจากนี้1/ 0ไม่ใช่ความจริง / เท็จใน Mathematica - มันพิมพ์ออกมาอย่างแรงเกินไปที่จะทำให้นักกอล์ฟมีความสุข :)
Greg Martin

7

Mathematica, 65 64 ไบต์

ขอบคุณ ngenisis สำหรับการบันทึก 1 ไบต์

Union@@Cases[Subsequences[x=Range@Tr[1^#]],a_/;Tr@#[[a]]==0]==x&

ฉันอยากจะหาทางออกที่จับคู่รูปแบบที่บริสุทธิ์ แต่ก็พิสูจน์ให้เป็นเรื่องยุ่งยาก (และสิ่งที่ต้องการ{___,a__,___}อยู่เสมอซุปเปอร์ยาว)


4

Haskell, 94 ไบต์

import Data.Lists
g x=(1<$x)==(1<$nub(id=<<[i|(i,0)<-fmap sum.unzip<$>powerslice(zip[1..]x)]))

ตัวอย่างการใช้งาน: ->g [-11,8,-2,-6,2,-12,5,3,-7,4,-7,7,12,-1,-1,6,-7,-4,-5,-12,9,5,6,-3] True

มันทำงานอย่างไร (ลองใช้[-1,1,5,-5]สำหรับอินพุต):

        zip[1..]x  -- zip each element with its index
                   -- -> [(1,-1),(2,1),(3,5),(4,-5)]
      powerslice   -- make a list of all continuous subsequences
                   -- -> [[],[(1,-1)],[(1,-1),(2,1)],[(1,-1),(2,1),(3,5)],[(1,-1),(2,1),(3,5),(4,-5)],[(2,1)],[(2,1),(3,5)],[(2,1),(3,5),(4,-5)],[(3,5)],[(3,5),(4,-5)],[(4,-5)]]
    <$>            -- for each subsequence
   unzip           --   turn the list of pairs into a pair of lists
                   --   -> [([],[]),([1],[-1]),([1,2],[-1,1]),([1,2,3],[-1,1,5]),([1,2,3,4],[-1,1,5,-5]),([2],[1]),([2,3],[1,5]),([2,3,4],[1,5,-5]),([3],[5]),([3,4],[5,-5]),([4],[-5])]
  fmap sum         --   and sum the second element
                   --   -> [([],0),([1],-1),([1,2],0),([1,2,3],5),([1,2,3,4],0),([2],1),([2,3],6),([2,3,4],1),([3],5),([3,4],0),([4],-5)]
 [i|(i,0)<-    ]   -- take all list of indices where the corresponding sum == 0
                   -- -> [[],[1,2],[1,2,3,4],[3,4]]
 id=<<             -- flatten the list
                   -- -> [1,2,1,2,3,4,3,4]
nub                -- remove duplicates
                   -- -> [1,2,3,4]

(1<$x)==(1<$    )  -- check if the above list has the same length as the input list. 

powersliceเป็นชื่อฟังก์ชั่นที่ยอดเยี่ยม
Zgarb


3

J, 36 35 ไบต์

#\*/@e.[:;]({:*0=[:+/{.)@|:\.\@,.#\

สำหรับทุก subsum ฉันเพิ่มดัชนีขององค์ประกอบและฉันเก็บดัชนี iff subsum 0แล้วตรวจสอบว่ามีทุกดัชนีหรือไม่

เคล็ดลับ: ดัชนี 1 รายการสามารถสร้างขึ้นได้ด้วย#\เช่นความยาวของทุกคำนำหน้า

การใช้งาน:

   (#\*/@e.[:;]({:*0=[:+/{.)@|:\.\@,.#\) 2 _1 _1 2
1
   (#\*/@e.[:;]({:*0=[:+/{.)@|:\.\@,.#\) 2 _1
0

ลองออนไลน์ได้ที่นี่


ฉันคิดว่าคุณสามารถบันทึก 2 ไบต์โดยใช้เคล็ดลับฐาน 1 สำหรับการรวมและการใช้แบนราบ#\*/@e.&,]({:*0=1#.{.)@|:\.\@,.#\
ไมล์

2

JavaScript (ES6), 109 ไบต์

f=([q,...a],b=[],c=[])=>1/q?f(a,[...b,0].map((x,i)=>x+q||(c=c.map((n,j)=>n|i<=j)),c.push(0)),c):c.every(x=>x)

ตัวอย่างการทดสอบ


1

Python 123 120 ไบต์

-3 ไบต์ขอบคุณ @Zgarb

เติมรายการที่มีขนาดเดียวกับอินพุตที่มีชิ้นส่วนเป็นศูนย์และเขียนทับตามดัชนีโดยคืนค่าความเท่าเดิมกลับไปเป็นค่าเดิมในตอนท้าย

def f(l):
 s=len(l);n=[0]*s
 for i in range(s):
  for j in range(i,s+1):
   if sum(l[i:j])==0:n[i:j]=l[i:j]
 return n==l

1
ฉันคิดว่าคุณสามารถใช้เป็นตัวยึดตำแหน่งแทน0 Noneจะไม่มีผลบวกที่ผิดพลาดเพราะทุกค่า0ในอินพุตจะเป็นส่วนหนึ่งหรือเป็นชิ้นผลรวมเป็นศูนย์เสมอ
Zgarb

คุณพูดถูก ฉันคิดเกี่ยวกับสิ่งนั้น แต่ลงเอยด้วยการสรุปว่ามันอาจเกิดขึ้นได้ในแง่บวกที่ผิด ๆ
dfernan

0

สกาลา, 49 ไบต์

% =>(1 to%.size)flatMap(%sliding)exists(_.sum==0)

ลองที่ ideone

การใช้งาน:

val f:(Seq[Int]=>Boolean)= % =>(1 to%.size)flatMap(%sliding)exists(_.sum==0)
f(Seq(4, -2, -2)) //returns true

Ungolfed:

array=>(1 to array.size)
  .flatMap(n => array.sliding(n))
  .exists(slice => slice.sum == 0)

คำอธิบาย:

% =>            //define a anonymouns function with a parameter called %
  (1 to %.size) //create a range from 1 to the size of %
  flatMap(      //flatMap each number n of the range
    %sliding    //to an iterator with all slices of % with length n
  )exists(      //check whether there's an iterator with a sum of 0
    _.sum==0
  )

ฉันไม่แน่ใจว่าวิธีการนี้ทำงานอย่างไร แต่ฉันคิดว่ามันควรจะล้มเหลวในบางกรณีการทดสอบความจริง
Zgarb

@Zgarb ฉันได้เพิ่มลิงก์ไปยัง ideone ดังนั้นคุณสามารถตรวจสอบได้ว่ามันถูกต้อง โดยพื้นฐานแล้วมันเป็นสัตว์เดียรัจฉานพยายามทำทุกอย่างที่เป็นไปได้
corvus_192

คุณสามารถใช้%เป็นชื่อพารามิเตอร์ได้หรือไม่ เย็น!
Cyoce

@Cyoce คุณสามารถใช้สวยมาก ๆ ถ่าน Unicode .,;:()[]{}\"'ยกเว้น ค่อนข้างมีประโยชน์สำหรับการเล่นกอล์ฟเพราะแยกจากตัวอักษรโดยแยกวิเคราะห์ดังนั้นคุณสามารถบันทึกช่องว่างบางอย่าง
corvus_192

ฉันตรวจสอบกรณีทดสอบและดูเหมือนว่าจะtrueเป็นกรณีที่ผิดพลาดครั้งที่สอง
Zgarb

0

Python, 86 ไบต์

def f(l):
 r=range(len(l))
 if[i for i in r for j in r if sum(l[j:j+i+1])==0]:return 1

Truthy = 1 Falsy = None


สิ่งนี้ส่งคืนอย่างไม่ถูกต้อง1สำหรับกรณีทดสอบครั้งที่สาม
Zgarb

1
จริง ๆ แล้วมันส่งกลับ1สำหรับกรณีทดสอบทั้งหมดยกเว้นสองคนแรกปลอมแปลง
dfernan

0

Clojure, 109 ไบต์

#(=(count %)(count(set(flatten(for[r[(range(count %))]l r p(partition l 1 r):when(=(apply +(map % p))0)]p))))

สร้างพาร์ติชันทั้งหมดซึ่งรวมเป็นศูนย์ตรวจสอบว่ามีดัชนี "ความยาวของเวกเตอร์อินพุต" ที่แตกต่างกันหรือไม่


0

PHP, 104 ไบต์

กำลังดุร้ายและยังคงเกิน 99 ไบต์ :-(

for($p=$r=$c=$argc;$s=--$p;)for($i=$c;$s&&$k=--$i;)for($s=0;$k<$c&&($r-=!$s+=$argv[$k++])&&$s;);echo!$r;

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง1สำหรับความจริงว่างสำหรับ falsy -rทำงานด้วย

ชำรุด

for($p=$r=$argc;$s=$p--;)   # loop $p from $argc-1 to 0 with dummy value >0 for $s
    for($i=$p;$s&&$k=$i--;)     # loop $i (slice start) from $p to 1, break if sum is 0
        for($s=0;                   # init sum to 0
            $k<$argc                # loop $k (slice end) from $i to $argc-1
            &&($r-=!$s+=$argv[$k++])    # update sum, decrement $r if sum is 0
            &&$s;);                     # break loop if sum is 0
echo!$r;                    # $r = number of elements that are not part of a zero-sum slice

$argv[0]มีชื่อไฟล์; หากทำงานด้วย-rมันจะเป็น-และประเมินเป็น0ops ตัวเลข


0

JavaScript (ES6), 102 ไบต์

a=>(g=f=>a.map((_,i)=>f(i)))(i=>g(j=>j<i||(t+=a[j])||g(k=>b[k]&=k<i|k>j),t=0),b=g(_=>1))&&!/1/.test(b)

คำนวณผลรวมบางส่วนสำหรับองค์ประกอบทั้งหมดที่i..jรวมอยู่และรีเซ็ตองค์ประกอบที่เกี่ยวข้องของbจาก1ถึง0เมื่อพบว่าผลรวมเป็นศูนย์ในที่สุดก็ตรวจสอบว่าไม่มี1ของเหลืออยู่

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