Sebuah bank untuk Teman-teman yang kurang bisa dipercaya

12

pengantar

Anda mendapatkan pekerjaan sebagai menteri keuangan di negara Anda yang sudah jadi di halaman belakang Anda. Anda telah memutuskan untuk membuat bank sendiri di negara Anda untuk Anda dan teman-teman Anda yang kurang dapat dipercaya. Karena Anda tidak mempercayai teman-teman Anda, Anda telah memutuskan untuk menulis sebuah program untuk memvalidasi semua transaksi untuk menghentikan teman-teman Anda untuk menghabiskan uang yang terlalu banyak dan membuat ekonomi Anda hancur.

Tugas

Mengingat saldo awal dan semua transaksi, saring semua transaksi di mana seseorang mencoba untuk mengeluarkan uang lebih banyak dan memblokir siapa saja yang mencoba untuk mengeluarkan uang lebih banyak (ini termasuk mencoba mengeluarkan uang lebih ke rekening tertutup) agar tidak pernah menggunakan bank Anda lagi dengan memfilter transaksi di masa mendatang ke atau dari miliknya / rekening banknya.

Input output

Dua daftar Adan Bsebagai input dan daftar Csebagai output. Aadalah saldo awal setiap akun dengan format [["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]. Badalah daftar transaksi dengan format di [["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]mana ["Bob", "Alice", 3]Bob ingin membayar unit mata uang Alice 3. Charus memiliki format yang sama dengan B. A, Bdan Cmungkin dalam format apa pun yang wajar.

Uji Kasus

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

Mencetak gol

Ini adalah , kode terpendek dalam byte yang menang di setiap bahasa.

Herman L.
sumber
Seberapa ketat format IO? Bisa Ajuga kamus, atau daftar tupel?
Laikoni
@Laikoni Atau bahkan hanya daftar formulir ["A", 2, "B", 3, "C", 5]?
Erik the Outgolfer
Kasus uji yang disarankan: A: [["A", 2], ["B", 3], ["C", 4]], B: [["A", "B", 3], ["C", "B", 4]], C: [["C", "B", 4]](transaksi valid menyusul satu tidak valid).
Arnauld
3
Apa yang terjadi jika seseorang mencoba mengeluarkan uang lebih banyak, dan penerima yang dituju sudah melebihi uang?
Nitrodon
Tidak ada koma di ["B" 3] dalam test case kedua dan ketiga
Jo King

Jawaban:

5

JavaScript (ES6), 91 88 79 byte

Disimpan 8 byte berkat @NahuelFouilleul

Mengambil input dalam sintaks 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))

Uji kasus

Dipercantik dan berkomentar

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()
Arnauld
sumber
bagaimana dengan 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))porting solusi perl ke javascript?
Nahuel Fouilleul
@NahuelFouilleul Memang lebih baik. Terima kasih!
Arnauld
4

Perl 5, 72 + 2 (-ap) = 74 byte

%h=@F;$_=<>;s/(\S+) (\S+) (\S+)/($h{$1}-=$3)<0||($h{$2}+=$3)<$3?"":$&/ge

coba online

Nahuel Fouilleul
sumber
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

Cobalah online!

-12 terima kasih kepada ovs .

Lebih lama karena batasan format keluaran:

Charus memiliki format yang sama dengan B.

Kalau tidak, saya bisa melakukan ini untuk 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)
Erik the Outgolfer
sumber
103 byte
ovs
@ovs wow, itu pintar
Erik the Outgolfer
2

Ruby , 57 byte

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

Cobalah online!

Mengambil input Asebagai Hashdalam format {"A"=>2, "B"=>3}. Input Bdan output Cdalam format yang disarankan.

Penjelasan

->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
}
Justin Mariner
sumber
1

C ++, 193 byte

Input A as std::map, B as 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;}

Cobalah online!

Colera Su
sumber