Eine Bank für weniger vertrauenswürdige Freunde

12

Einführung

Sie haben einen Job als Finanzminister in Ihrem erfundenen Land in Ihrem Hinterhof bekommen. Sie haben beschlossen, in Ihrem Land eine eigene Bank für Sie und Ihre weniger vertrauenswürdigen Freunde zu gründen. Da Sie Ihren Freunden nicht vertrauen, haben Sie beschlossen, ein Programm zur Validierung aller Transaktionen zu schreiben, um zu verhindern, dass Ihre Freunde Ihre erfundene Währung zu viel ausgeben und Ihre Wirtschaft ruinieren.

Aufgabe

Filtern Sie unter Berücksichtigung des Anfangsbestands und aller Transaktionen alle Transaktionen heraus, bei denen jemand versucht, einen Mehrbetrag auszugeben, und verhindern Sie, dass jemand, der einen Mehrbetrag auszugeben versucht (dies schließt den Versuch ein, einen Mehrbetrag auf einem geschlossenen Konto auszugeben), Ihre Bank jemals wieder nutzt, indem Sie zukünftige Transaktionen an oder von seiner Bank herausfiltern / ihr Bankkonto.

Input-Output

Zwei Listen Aund Bals Eingabe und eine Liste Cals Ausgabe. Aist der Startsaldo jedes Kontos mit dem Format [["Alice", 5], ["Bob", 8], ["Charlie", 2], ...]. Bist eine Liste von Transaktionen mit dem Format, [["Bob", "Alice", 3], ["Charlie", "Bob", 5], ...]bei ["Bob", "Alice", 3]denen Bob Alice 3 Währungseinheiten bezahlen möchte. Csollte das gleiche Format haben wie B. A, BUnd Ckann in jedem angemessenen Format vorliegen.

Testfälle

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

Wertung

Dies ist , der kürzeste Code in Bytes in jeder Sprache gewinnt.

Herman L
quelle
Wie streng ist das IO-Format? Könnte Aauch ein Wörterbuch oder eine Liste von Tupeln sein?
Laikoni
@Laikoni Oder nur eine Liste des Formulars ["A", 2, "B", 3, "C", 5]?
Erik der Outgolfer
Empfohlene Testfall: A: [["A", 2], ["B", 3], ["C", 4]], B: [["A", "B", 3], ["C", "B", 4]], C: [["C", "B", 4]](eine gültige Transaktion nach einem unwirksamen).
Arnauld
3
Was passiert, wenn jemand versucht, zu viel auszugeben, und der beabsichtigte Empfänger bereits zu viel ausgegeben hat?
Nitrodon
Es gibt kein Komma in ["B" 3] im zweiten und dritten Testfall
Jo King,

Antworten:

5

JavaScript (ES6), 91 88 79 Byte

8 Bytes dank @NahuelFouilleul gespeichert

Übernimmt Eingaben in der Currying-Syntax (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))

Testfälle

Verschönert und kommentiert

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
quelle
Was ist mit der 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))Portierung von Perl-Lösung auf Javascript?
Nahuel Fouilleul
@NahuelFouilleul Viel besser in der Tat. Vielen Dank!
Arnauld
4

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

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

versuche es online

Nahuel Fouilleul
quelle
2

Python 2 , 103 Bytes

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

Probieren Sie es online!

-12 dank ovs .

Länger aufgrund von Ausgabeformateinschränkungen:

Csollte das gleiche Format haben wie B.

Sonst hätte ich das für 92 Bytes machen können:

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 der Outgolfer
quelle
103 Bytes
Ovs
@ovs wow, das ist klug
Erik der Outgolfer
2

Ruby , 57 Bytes

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

Probieren Sie es online!

Übernimmt die Eingabe Aals Hashim Format {"A"=>2, "B"=>3}. Ein- Bund AusgabeC im vorgeschlagenen Format.

Erläuterung

->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
quelle
1

C ++, 193 Bytes

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

Probieren Sie es online!

Colera Su
quelle