Tâche
Supposons que le ppepole doive scinder un projet de loi; chacun d'eux est identifié par un triple (Name, n, k)composé de:
Name: le nom ;n: le montant qu'elle doit payer ;k: le montant effectivement payé .
Le défi ici est de savoir combien doit à qui.
Hypothèses
L'entrée et la sortie peuvent être dans n'importe quel format pratique.
pnkpLes noms sont des chaînes uniques de longueur arbitraire, composées de caractères alphabétiques en minuscules.
Solution
La solution est représentée par l'ensemble minimal de transactions entre les ppersonnes; en particulier, ce sont des triplets(from, to, amount)
from:namede la personne qui donne de l'argent;to:namede la personne qui reçoit de l'argent;amount: montant d'argent de la transaction.
REMARQUE : La somme de toutes les dettes ( n) peut différer de la somme de tous les montants déjà payés ( k). Dans ce cas, vous devez ajouter la sortie ('owner', Name, amount)ou (Name, 'owner', amount)le format que vous avez choisi. N'importe quel nom ne sera jamais owner. La chaîne «propriétaire» est flexible.
S'il existe plusieurs ensembles minimaux, sélectionnez celui avec la somme minimale de tous les montants de transaction (valeurs absolues); en cas d'égalité, choisissez-en un.
Cas de test:
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)]
C'est le code-golf: le code le plus court gagne .