Compito
Supponiamo che il ppepole debba dividere un conto; ognuno di essi è identificato da una tripla (Name, n, k)composta da:
Name: il nome ;n: l'importo che deve pagare ;k: l'importo effettivamente pagato .
La sfida qui è scoprire quanto deve a chi.
ipotesi
L'input e l'output possono essere in qualsiasi formato conveniente.
pnkpI nomi sono stringhe uniche di lunghezza arbitraria, composte da caratteri alfabetici minuscoli.
Soluzione
La soluzione è rappresentata dall'insieme minimo di transazioni tra le ppersone; in particolare sono triple(from, to, amount)
from:namedella persona che dà soldi;to:namedella persona che riceve denaro;amount: importo della transazione.
NOTA : la somma di tutti i debiti ( n) può differire dalla somma di tutti gli importi già pagati ( k). In questo caso, devi aggiungere l'output ('owner', Name, amount)o (Name, 'owner', amount)il formato che hai scelto. Qualsiasi nome non sarà mai owner. La stringa "proprietario" è flessibile.
Se esistono più set mimimum, selezionare quello con la somma minima di tutti gli importi delle transazioni (valori assoluti); in caso di pareggio, scegline uno.
Casi 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)]
Questo è code-golf: vince il codice più corto .