Bank dla mniej godnych zaufania przyjaciół

12

Wprowadzenie

Dostałeś pracę jako minister finansów w swoim wymyślonym kraju na swoim podwórku. Zdecydowałeś się stworzyć własny bank w swoim kraju dla siebie i swoich mniej godnych zaufania przyjaciół. Ponieważ nie ufasz swoim znajomym, postanowiłeś napisać program do sprawdzania wszystkich transakcji, aby powstrzymać znajomych przed nadmiernym wydatkowaniem gotowej waluty i zrujnowaniem twojej gospodarki.

Zadanie

Biorąc pod uwagę saldo początkowe i wszystkie transakcje, odfiltruj wszystkie transakcje, w których ktoś próbuje przekroczyć wydatki, i zablokuj każdego, kto spróbuje je przekroczyć (obejmuje to próbę przekroczenia wydatków na zamkniętym koncie), aby nigdy więcej nie korzystał z Twojego banku, odfiltrowując przyszłe transakcje do lub z jego / jej konto bankowe.

Wejście wyjście

Dwie listy Ai Bjako dane wejściowe oraz lista Cjako dane wyjściowe. Ato saldo początkowe każdego konta w formacie [["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]. Bto lista transakcji w formacie, w [["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]którym ["Bob", "Alice", 3]Bob chce zapłacić jednostkom walutowym Alice 3. Cpowinien mieć taki sam format jak B. A, BI Cmogą być w każdym rozsądnym formacie.

Przypadki testowe

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

Punktacja

To jest , wygrywa najkrótszy kod w bajtach w każdym języku.

Herman L.
źródło
Jak ścisły jest format IO? Może Ato być także słownik lub lista krotek?
Laikoni
@Laikoni A może tylko lista formularzy ["A", 2, "B", 3, "C", 5]?
Erik the Outgolfer
Sugerowana przypadek testowy: A: [["A", 2], ["B", 3], ["C", 4]], B: [["A", "B", 3], ["C", "B", 4]], C: [["C", "B", 4]](ważna transakcja po nieprawidłowym jeden).
Arnauld,
3
Co się stanie, jeśli ktoś spróbuje przepłacić, a zamierzony odbiorca już przepłacił?
Nitrodon,
W [„B” 3] nie ma przecinka w drugim i trzecim przypadku testowym
Jo King

Odpowiedzi:

5

JavaScript (ES6), 91 88 79 bajtów

Zaoszczędź 8 bajtów dzięki @NahuelFouilleul

Pobiera dane wejściowe w składni curry (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))

Przypadki testowe

Upiększone i skomentowane

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
źródło
co z 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))przenoszeniem perlowego rozwiązania do javascript?
Nahuel Fouilleul
@NahuelFouilleul Rzeczywiście znacznie lepiej. Dzięki!
Arnauld,
4

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

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

spróbuj online

Nahuel Fouilleul
źródło
2

Python 2 , 103 bajty

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

Wypróbuj online!

-12 dzięki ovs .

Dłuższy z powodu ograniczeń formatu wyjściowego:

Cpowinien mieć taki sam format jak B.

W przeciwnym razie mógłbym to zrobić dla 92 bajtów:

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
źródło
103 bajty
ovs
@ovs wow, to sprytne
Erik the Outgolfer
2

Rubinowy , 57 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe Ajako Hashw formacie {"A"=>2, "B"=>3}. Dane wejściowe Bi wyjściowe Cmają sugerowany format.

Wyjaśnienie

->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
źródło
1

C ++, 193 bajty

Wprowadź A jako std::map, B jako 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;}

Wypróbuj online!

Colera Su
źródło