ธนาคารที่มีเพื่อนที่น่าเชื่อถือน้อยกว่า


12

บทนำ

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

งาน

กำหนดยอดเริ่มต้นและธุรกรรมทั้งหมดให้กรองธุรกรรมทั้งหมดที่มีคนพยายามติดลบและบล็อกใครก็ตามที่พยายามติดลบ (รวมถึงการพยายามติดลบบัญชีที่ปิด) จากการใช้ธนาคารของคุณอีกครั้งโดยกรองธุรกรรมในอนาคตไปยังหรือจาก / บัญชีธนาคารของเธอ

Input / Output

สองรายการAและBเป็นอินพุตและรายการCเป็นเอาต์พุต เป็นยอดเงินเริ่มต้นของแต่ละบัญชีที่มีรูปแบบA คือรายการธุรกรรมที่มีรูปแบบซึ่งหมายความว่า Bob ต้องการจ่ายหน่วยสกุลเงิน Alice 3 ควรมีรูปแบบเดียวกับ , และอาจจะอยู่ในรูปแบบที่เหมาะสมใด ๆ[["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]B[["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]["Bob", "Alice", 3]CBABC

กรณีทดสอบ

A: [["Alice", 5], ["Bob", 2]]
B: [["Alice", "Bob", 5], ["Bob", "Alice" 7]]
C: [["Alice", "Bob", 5], ["Bob", "Alice" 7]]

A: [["A", 2], ["B", 3], ["C", 5]]
B: [["C", "A", 2], ["B", "C", 4], ["A", "B", 2]]
C: [["C", "A", 2]]

A: [["A", 2], ["B", 3]]
B: [["A", "B", 2], ["A", "B", 2]]
C: [["A", "B", 2]]

A: [["A", 4], ["B", 0]]
B: [["A", "B", 1], ["A", "B", 5], ["A", "B", 2]]
C: [["A", "B", 1]]

A: [["A", 2], ["B", 3], ["C", 4]]
B: [["A", "B", 3], ["C", "B", 4]]
C: [["C", "B", 4]]

A: [["A", 2], ["B", 3], ["C", 4]]
B: [["A", "B", 3], ["B", "A", 4], ["C", "B" 2]]
C: []

เกณฑ์การให้คะแนน

นี่คือซึ่งเป็นรหัสที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาที่ชนะ


รูปแบบ IO มีความเข้มงวดเพียงใด อาจAเป็นพจนานุกรมหรือรายการของสิ่งอันดับ?
Laikoni

@Laikoni หรือแม้แต่เพียงแค่รายการของฟอร์ม["A", 2, "B", 3, "C", 5]หรือไม่?
Erik the Outgolfer

กรณีทดสอบที่แนะนำ: A: [["A", 2], ["B", 3], ["C", 4]], B: [["A", "B", 3], ["C", "B", 4]], C: [["C", "B", 4]](การทำธุรกรรมที่ถูกต้องต่อไปนี้อย่างใดอย่างหนึ่งไม่ถูกต้อง)
Arnauld

3
จะเกิดอะไรขึ้นถ้ามีคนพยายามใช้จ่ายเกินกำหนดและผู้รับที่ตั้งใจไว้ได้ใช้จ่ายเกินกำหนดไปแล้ว
Nitrodon

ไม่มีเครื่องหมายจุลภาคใน ["B" 3] ในกรณีทดสอบที่สองและสาม
Jo King

คำตอบ:


5

JavaScript (ES6), 91 88 79 ไบต์

บันทึก 8 ไบต์ขอบคุณ @NahuelFouilleul

(a)(b)จะเข้าในไวยากรณ์ currying

a=>b=>b.filter(([x,y,z])=>(a[x]+=z)<0&a[y]<0?a[y]-=z:0,a.map(([x,y])=>a[x]=~y))

กรณีทดสอบ

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

a => b =>                 // given the two lists a and b
  b.filter(([x, y, z]) => // for each (x = payer, y = payee, z = amount) in b:
    (a[x] += z) < 0 &     //   update the payer's account; if it's still valid
    a[y] < 0 ?            //   and the payee's account is also valid:
      a[y] -= z           //     update the payee's account
    :                     //   else:
      0,                  //     do nothing
    a.map(([x, y]) =>     //   initialization: for each (x = owner, y = amount) in a:
      a[x] = ~y           //     set up this account (>= 0: closed, -1: $0, -2: $1, etc.)
    )                     //   end of map()
  )                       // end of filter()

สิ่งที่เกี่ยวกับa=>b=>b.filter(([x,y,z])=>(a[x]-=z)>0&a[y]>0?a[y]+=z:0,a.map(([x,y])=>a[x]=y+1))วิธีการแก้ปัญหา perl เพื่อ javascript
Nahuel Fouilleul

@NahuelFouilleul ดีกว่ามากแน่นอน ขอบคุณ!
Arnauld


2

Python 2 , 103 ไบต์

A,B=input()
C=[]
for i in B:
 N,P,M=i
 if M>A[N]:A[N]=-1
 if A[N]>-1<A[P]:A[N]-=M;A[P]+=M;C+=i,
print C

ลองออนไลน์!

-12 ขอบคุณที่OVS

อีกต่อไปเนื่องจากข้อ จำกัด รูปแบบผลลัพธ์:

CBควรมีรูปแบบเดียวกับ

ไม่เช่นนั้นฉันสามารถทำสิ่งนี้ได้ขนาด 92 ไบต์:

A,B=input()
for(N,P,M)in B:
 if M>A[N]:A[N]=-1
 if A[N]>-1<A[P]:A[N]-=M;A[P]+=M;print(N,P,M)


@ovs ว้าวนั่นคือฉลาด
Erik the Outgolfer

2

Ruby , 57 ไบต์

->a,b{b.select{|(s,r,x)|a[r]+=x if[a[s]-=x,a[r]].min>-1}}

ลองออนไลน์!

จะเข้าAเป็นในรูปแบบHash {"A"=>2, "B"=>3}อินพุตBและเอาต์พุตCอยู่ในรูปแบบที่แนะนำ

คำอธิบาย

->a,b{                      # lambda function taking arguments A and B
b.select{|(s,r,x)|              # select items in B that return truthy (s = sender, r = receiver, x = amount)
            a[s]-=x,                # subtract amount from sender
        if [         a[r]].min>-1   # check if the smaller of the balances is non-negative
                                    # (true if both values are non-negative)
a[r]+=x                             # if so, add to the receiver's balance
}                               # the select function returns truthy when the above if statement passes
}

1

C ++, 193 ไบต์

การป้อนข้อมูลเป็นstd::map, B std::listรวม

#import<bits/stdc++.h>
using s=std::string;struct p{s a,b;int c;};using t=std::list<p>;t f(std::map<s,int>A,t B){t C;for(p&i:B)(A[i.a]-=i.c)<0|A[i.b]<0?0:(C.push_back(i),A[i.b]+=i.c);return C;}

ลองออนไลน์!

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