Một ngân hàng cho những người bạn kém tin cậy


12

Giới thiệu

Bạn đã nhận được một công việc như là bộ trưởng tài chính ở đất nước trang điểm của bạn ở sân sau của bạn. Bạn đã quyết định tạo ngân hàng của riêng bạn ở đất nước của bạn cho bạn và những người bạn kém tin cậy của bạn. Vì bạn không tin tưởng bạn bè của mình, bạn đã quyết định viết một chương trình để xác thực tất cả các giao dịch để ngăn chặn bạn bè của bạn bội chi tiền tệ tạo ra và hủy hoại nền kinh tế của bạn.

Bài tập

Đưa ra số dư ban đầu và tất cả các giao dịch, hãy lọc tất cả các giao dịch mà ai đó cố gắng bội chi và chặn bất kỳ ai cố gắng bội chi (điều này bao gồm cố gắng bội chi vào một tài khoản đã đóng) từ việc sử dụng lại ngân hàng của bạn bằng cách lọc ra các giao dịch trong tương lai đến hoặc từ anh ấy / tài khoản ngân hàng của cô ấy.

Đầu ra đầu vào

Hai danh sách ABlà đầu vào và một danh sách Clà đầu ra. Alà số dư bắt đầu của mỗi tài khoản với định dạng [["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]. Blà một danh sách các giao dịch với các định dạng [["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]nơi ["Bob", "Alice", 3]phương tiện mà Bob muốn trả Alice 3 đơn vị tiền tệ. Cnên có định dạng giống như B. A, BCcó thể ở bất kỳ định dạng hợp lý.

Các trường hợp thử nghiệm

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: []

Chấm điểm

Đây là , mã ngắn nhất tính theo byte trong mỗi ngôn ngữ sẽ thắng.


Định dạng IO nghiêm ngặt như thế nào? Có thể Acũng là một từ điển, hoặc một danh sách các hàng?
Laikoni

@Laikoni Hoặc thậm chí chỉ là một danh sách các hình thức ["A", 2, "B", 3, "C", 5]?
Erik the Outgolfer

Đề nghị trường hợp thử nghiệm: A: [["A", 2], ["B", 3], ["C", 4]], B: [["A", "B", 3], ["C", "B", 4]], C: [["C", "B", 4]](một giao dịch hợp lệ sau đây là một không hợp lệ).
Arnauld

3
Điều gì xảy ra nếu ai đó cố gắng bội chi và người nhận dự định đã bội chi?
Nitrodon

Không có dấu phẩy trong ["B" 3] trong các trường hợp thử nghiệm thứ hai và thứ ba
Jo King

Câu trả lời:


5

JavaScript (ES6), 91 88 79 byte

Đã lưu 8 byte nhờ @NahuelFouilleul

Đưa đầu vào theo cú pháp currying (a)(b).

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

Các trường hợp thử nghiệm

Làm đẹp và nhận xét

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

Điều gì về 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))giải pháp chuyển perl sang javascript?
Nahuel Fouilleul

@NahuelFouilleul Thực sự tốt hơn nhiều. Cảm ơn!
Arnauld


2

Python 2 , 103 byte

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

Hãy thử trực tuyến!

-12 nhờ vào trứng .

Lâu hơn do hạn chế định dạng đầu ra:

Cnên có định dạng giống như B.

Nếu không, tôi có thể thực hiện điều này trong 92 byte:

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 wow, thật thông minh
Erik the Outgolfer 25/11/17

2

Ruby , 57 byte

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

Hãy thử trực tuyến!

Đưa đầu vào Anhư một Hashđịnh dạng {"A"=>2, "B"=>3}. Đầu vào Bvà đầu ra Cở định dạng được đề xuất.

Giải trình

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

Đầu vào A là std::map, B là 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;}

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.