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.


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

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


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)


@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
}

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.