Aufgabe
Angenommen, der pPole muss eine Rechnung teilen. Jeder von ihnen wird durch ein Triple identifiziert, (Name, n, k)das sich zusammensetzt aus:
Name: der Name ;n: der Betrag, den sie / er zu zahlen hat ;k: der Betrag, den sie / er tatsächlich gezahlt hat .
Hier gilt es herauszufinden, wer wem was schuldet.
Annahmen
Die Ein- und Ausgabe kann in jedem beliebigen Format erfolgen.
pnkpNamen sind eindeutige Zeichenfolgen beliebiger Länge, die aus Kleinbuchstaben bestehen.
Lösung
Die Lösung wird durch die Mindestanzahl von Transaktionen zwischen den pPersonen dargestellt. insbesondere sind sie dreifach(from, to, amount)
from:namevon der Person, die Geld gibt;to:nameder Person, die Geld erhält;amount: Geldbetrag der Transaktion.
HINWEIS : Die Summe aller Schulden ( n) kann von der Summe aller bereits bezahlten Beträge ( k) abweichen . In diesem Fall müssen Sie die Ausgabe ('owner', Name, amount)oder (Name, 'owner', amount)das ausgewählte Format hinzufügen . Jeder Name wird niemals sein. ownerDer String 'owner' ist flexibel.
Wenn mehrere Mindestmengen vorhanden sind, wählen Sie die mit der Mindestsumme aller Transaktionsbeträge (Absolutwerte) aus. Wählen Sie im Falle eines Unentschieden eines davon aus.
Testfälle:
inputs(Name,n,k):
[('a',30,40),('b',40,50),('c',30,15)]
[('a',30,30),('b',20,20)]
[('a',30,100),('b',30,2),('c',40,0)]
[('a',344,333),('b',344,200),('c',2,2)]
[('a',450,400),('b',300,300),('c',35,55)]
outputs(from, to, amount):
[('c','a',10),('c','b',5),('owner','b',5)] or [('c','b',10),('c','a',5),('owner','a',5)]
[]
[('owner','a',2),('b','a',28),('c','a',40)] PS: [('owner','a',2),('b','a',68),('c','b',40)] has the same number of transactions, but it is not a valid answer, because the total amount of its transaction is greater than that of the proposed solution.
[('a','owner',11),('b','owner',144)]
[('a','owner',30),('a','c',20)]
Das ist Code-Golf: Der kürzeste Code gewinnt .