บัญชีคู่ขนาน (วันที่ 2)


10

ความท้าทายได้รับอนุญาตจากการประกวดรหัสมหาวิทยาลัยของฉัน


หลังจากจบการศึกษาเมื่อสองสามเดือนที่ผ่านมามารีเปิดบัญชีธนาคารเพื่อเริ่มรับงานแรกในเมือง ตั้งแต่นั้นมาเธอได้ทำธุรกรรมเล็กน้อยกับมัน การชำระครั้งแรกของเธอคือ 1,000 ดอลลาร์ ด้วยเงินจำนวนนั้นเธอจ่ายค่าอาหารเย็นที่เธอเชิญพ่อแม่ของเธอ (อาหารเย็นราคา 150 ดอลลาร์ดอลลาร์) จากนั้นเธอซื้อในซุปเปอร์มาร์เก็ตที่มีชื่อเสียง ($ 80 ดอลลาร์) และจองโรงแรมสำหรับวันหยุดพักผ่อนของเธอ ($ 200) ในตอนท้ายของเดือนที่เธอได้รับการชำระเงินของเธออีกครั้ง (1,040 ดอลลาร์มากกว่าเดือนก่อนหน้าเล็กน้อย) และหนึ่งวันหลังจากที่เธอใช้จ่ายอีก 70 ดอลลาร์ที่ซูเปอร์มาร์เก็ต

วันนี้เธอรู้ว่าถ้าหลังจากจ่าย $ 80 ดอลลาร์แรกในซุปเปอร์มาร์เก็ตบัญชีที่สองได้ถูกสร้างขึ้นและบัญชีแรกถูกแช่แข็งทั้งสองบัญชีจะมียอดเงินคงเหลือเท่ากันทั้งหมด:

1000-150-80Tโอเสื้อaล.=770-2001040-70Tโอเสื้อaล.=770

เหตุการณ์นี้เกิดขึ้นน้อยมากกับเธอที่เธอต้องการตรวจสอบอย่างต่อเนื่องหากการเคลื่อนไหวของบัญชีของเธอและเพื่อน ๆ ของเธอมีคุณลักษณะนี้ด้วยหรือไม่

ท้าทาย

รับรายการธุรกรรมส่งออกจำนวนเวลาที่เจ้าของบัญชีธนาคารสามารถสร้างบัญชีที่สองเพื่อให้ทั้งสองมียอดดุลสุดท้ายที่เหมือนกัน

ตัวอย่าง: [1000, -150, -80, -200, 1040, -70]

1)Total=0100015080200104070Total=1540
2)1000Total=100015080200104070Total=540
3)1000150Total=85080200104070Total=690
4)100015080Total=770200104070Total=770
5)100015080200Total=570104070Total=970
6)1000150802001040Total=161070Total=70
7)100015080200104070Total=1540Total=0

กรณีทดสอบ

  • อินพุต: 1000 -150 -80 -200 1040 -70เอาต์พุต:1
  • อินพุต: 100 -100เอาต์พุต:2
  • อินพุต: 1 2 3เอาต์พุต:1
  • อินพุต: 10 -20 15เอาต์พุต:0
  • อินพุต: 15 -15 15 -15เอาต์พุต:3
  • อินพุต: 1เอาต์พุต:0

หมายเหตุ


11
หลังจาก 6 เดือนของบัญชีที่ถูกแช่แข็งและสร้างขึ้นใหม่มีรายงานว่านายธนาคารของ Marie ถูกฝึกงานในสถานพยาบาล "เราเป็นเพื่อนของคุณคุณต้องพักผ่อนบ้าง" พวกเขากล่าว
Arnauld

2
กรณีทดสอบที่แนะนำของการทำธุรกรรมเดียว
Veskah

คำตอบ:



4

Perl 6 , 25 ไบต์

{+grep .sum/2,[\+] 0,|$_}

ลองออนไลน์!

คำอธิบาย

เราเพิ่งเติมศูนย์ให้กับรายการที่กำหนด ( 0,|$_), สร้างลำดับของผลรวมบางส่วนด้วย[\+](เช่นลำดับที่เกิดขึ้นจากองค์ประกอบแรก, ผลรวมของสองคนแรก, ผลรวมของสามคนแรก, ผลรวมของสามคนแรกเป็นต้น) และมองหา ( grep) องค์ประกอบที่มีค่าเท่ากับครึ่งหนึ่งของสถานะบัญชีสุดท้าย (ผลรวมของรายการที่กำหนด) +สุดท้ายเรานับพวกเขาด้วย


3

05AB1E , 11 ไบต์

0.ø.œ2ùO€ËO

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

0.ø          # Surround the (implicit) input list with a leading and trailing 0
             #  i.e. [100,-100] → [0,100,-100,0]
           # Get all possible partitions to divide the list
             #  → [[[0],[100],[-100],[0]],[[0],[100],[-100,0]],[[0],[100,-100],[0]],[[0],[100,-100,0]],[[0,100],[-100],[0]],[[0,100],[-100,0]],[[0,100,-100],[0]],[[0,100,-100,0]]]
     2ù      # Only leave partitions consisting of 2 items
             #  → [[[0],[100,-100,0]],[[0,100],[-100,0]],[[0,100,-100],[0]]]
       O     # Take the sum of each
             #  → [[0,0],[100,-100],[0,0]]
        €Ë   # Check of each inner list if both sums are equal (1 if truthy; 0 if falsey)
             #  → [1,0,1]
          O  # Take the sum of that (and output as result)
             #  → 2


3

JavaScript (Node.js)ขนาด 45 ไบต์

a=>!a.map(v=>o[s+=v]=-~o[s],s=0,o=[1])|o[s/2]

ลองออนไลน์!

บันทึก 4 -~o[s]ไบต์โดยใช้ ขอบคุณ Shaggy


+1 สำหรับการเต้น Arnauld: o
Luis felipe De jesus Munoz


@LuisfelipeDejesusMunoz, Arnauld ไม่ได้ (เสมอ) ถูกที่สุด! ;)
Shaggy

@Shaggy นำ+ไปใช้เปลี่ยนเป็น!ดังนั้นจึงสามารถทำงานกับอินพุต[100]ได้
TSH

อ๊ะไม่รู้ว่าเราต้องจัดการกับอาเรย์เดี่ยว แก้ไขอย่างดี
ขนด


2

JavaScript (ES6), 52 ไบต์

a=>a.map(x=>n+=(s+=x)==eval(a.join`+`)-s,n=s=0)|n+!s

ลองออนไลน์!

แสดงความคิดเห็น

a =>                        // a[] = input array
  a.map(x =>                // for each element x in a[]:
    n +=                    //   increment n if the following test is truthy:
      (s += x)              //     update the left sum
      ==                    //     and test whether it's equal to
      eval(a.join`+`) - s,  //     the right sum
    n = s =0                //   start with n = s = 0
  )                         // end of map()
  | n                       // yield n; if the final sum is 0, it means that we could have
  +                         // created a balanced account at the beginning of the process;
  !s                        // so, we increment n if it is

เวอร์ชันแบบเรียกซ้ำ 54  53 ไบต์

f=(a,s=0)=>a+a?(s==eval(a.join`+`))+f(a,s+a.pop()):!s

ลองออนไลน์!


ฉันเพิ่งจะแนะนำรุ่น 52 ไบต์!
Shaggy

@Shaggy ใช่ฉันยกเลิกรุ่นที่ไม่เกิดซ้ำเร็วเกินไปเพราะฉันคิดว่ารูปแบบที่เรียกซ้ำอาจสั้นกว่านี้
Arnauld

2

APL (Dyalog Unicode) , 21 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

+/⊂((+/↑)=1⊥↓)¨⍨0,⍳∘≢

ลองออนไลน์!

ɩ ndices
 ของ
 คะแนนของการทำธุรกรรม

0, เติมศูนย์

⊂()¨⍨ ใช้ฟังก์ชั่นโดยปริยายต่อไปนี้กับแต่ละข้อเป็นอาร์กิวเมนต์ซ้ายและรายการทั้งหมดของการทำธุรกรรมเป็นอาร์กิวเมนต์ที่ถูกต้อง (อาร์กิวเมนต์ swaps

 รายการทั้งหมดของการทำธุรกรรม
(... ) เป็นอาร์กิวเมนต์ด้านซ้ายไปยังฟังก์ชั่นด้านล่างที่
  ¨ ใช้กับแต่ละดัชนีที่
    มีการสลับสับเปลี่ยน (เช่นรายการทางด้านขวาดัชนีด้านซ้าย:

   วางที่มากจากซ้าย

  1⊥ sum (lit. ประเมินใน base-1)

  ()= คือ (0/1) เท่ากับ ...

    ทำธุรกรรมหลายอย่างจากด้านซ้าย

   +/ รวมพวกเขา

+/ สรุปว่ารายการบูลีนจะนับความจริง


2

แบตช์ 84 ไบต์

@set s=%*
@set/as=%s: =+%,c=0
@for %%n in (0 %*)do @set/as-=%%n*2,c+=!s
@echo %c%

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่ง คำอธิบาย:

@set s=%*

เข้าร่วมข้อโต้แย้งที่มีช่องว่าง

@set/as=%s: =+%,c=0

แทนที่ช่องว่างด้วย+s และประเมินผลลัพธ์ ยังล้างการนับ

@for %%n in (0 %*)do @set/as-=%%n*2,c+=!s

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

@echo %c%

พิมพ์ผลลัพธ์


2

ถ่าน 15 ไบต์

⊞θ⁰IΣEθ⁼Σθ⊗Σ✂θκ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

 θ              Input list
  ⁰             Literal 0
⊞               Push to list
      θ         Augmented list
     E          Mapped to
             θ  Augmented list
            ✂   Sliced from
              κ Current index
           Σ    Summed
          ⊗     Doubled
       ⁼        Equals
         θ      (Augmented) list
        Σ       Summed
    Σ           Sum of booleans
   I            Cast to string
                Implicitly print

น่าเสียดายที่ Charcoal Sum([])ไม่ได้0ดังนั้นฉันต้องแน่ใจว่ามีองค์ประกอบอย่างน้อยหนึ่งรายการที่จะรวม


2

Python 3 , 67 58 ไบต์

lambda l:sum(sum(l[:x])*2==sum(l)for x in range(len(l)+1))

ลองออนไลน์!

-9 ไบต์ต้องขอบคุณ @ อย่าเป็นจุด x-triple


1
ข้อสรุปแทนการกรองจะช่วยให้คุณประหยัด 7 lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1))ไบต์:
นาย Xcoder

sum(l[:x])*2==sum(l)ช่วยคุณอีก 2 ไบต์
Neil


2

MATL , 9 ไบต์

s0GhYsE=s

ลองออนไลน์!

เช่นเดียวกับคำตอบอื่น ๆ : เติมศูนย์และตรวจสอบความถี่ครึ่งหนึ่งของผลรวมสะสมเท่ากับผลรวมทั้งหมด

s   % Total sum of (implicit) input
0Gh % Prepend 0 to another copy of the input
Ys  % Cumulative sum
E=  % Check element-wise equality of 2*cumulative sum with total sum
s   % Sum number of `true` values


2

PowerShell , 88 82 ไบต์

-6 Bytes ขอบคุณที่ mazzy

param($n)0..($x=$n.length)|%{$i+=+$z-eq($n[$_..$x]|measure -Su).sum;$z+=$n[$_]};$i

ลองออนไลน์!

ดูเหมือนว่าจะเป็นวิธีที่เงอะงะมาก แต่ก็ทำงานเสร็จแล้ว ฉันจะพยายามปรับปรุงในอนาคต


1
คุณสามารถเขียน$i+=<predicate>แทนได้if(<predicate>){$i++}
mazzy



1

ทุบตี, 52 ไบต์

IFS=+;for i in 0 $@;{((c+=2*(x+=i)=="$*"));};echo $c

TIO

เคล็ดลับ: การตั้งค่าIFS=+, "$*"ขยายสตริงที่มีปากเสียงจะถูกคั่นด้วย+ใน EVAL แสดงออกทางคณิตศาสตร์ที่จะรวม



0

J , 19 ไบต์

1#.[:(={:-])0+/\@,]

ลองออนไลน์!

คำอธิบาย

1 #. [: (= ({: - ])) 0 +/\@, ]

                     0     , ]  NB. prepend 0 to input...
                       +/\@     NB. and take the prefix sums...
     [:    ({: - ])             NB. then subtract that list
                                NB. from its final elm 
                                NB. (`{:`), giving the list
                                NB. of suffix sums...
     [: (= (      ))            NB. create a 1-0 list showing
                                NB. where the prefix sums 
                                NB. equal the suffix sums
1 #.                            NB. and take the sum.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.