Tarefa
Suponha que o p
pepole tenha que dividir uma conta; cada um deles é identificado por um triplo (Name, n, k)
composto por:
Name
: o nome ;n
: o valor que ela / ele deve pagar ;k
: a quantia que ele realmente pagou .
O desafio aqui é descobrir quanto quem deve a quem.
Suposições
A entrada e a saída podem estar em qualquer formato conveniente.
p
n
k
p
Os nomes são cadeias únicas de comprimento arbitrário, compostas por caracteres do alfabeto em minúsculas.
Solução
A solução é representada pelo conjunto mínimo de transações entre as p
pessoas; em particular, eles são triplos(from, to, amount)
from
:name
da pessoa que dá dinheiro;to
:name
da pessoa que recebe dinheiro;amount
: quantidade de dinheiro da transação.
NOTA : A soma de todas as dívidas ( n
) pode diferir da soma de todos os valores já pagos ( k
). Nesse caso, você deve adicionar a saída ('owner', Name, amount)
ou (Name, 'owner', amount)
o formato escolhido. Qualquer nome nunca será owner
. A string 'owner' é flexível.
Se existirem vários conjuntos mínimos, selecione aquele com a soma mínima de todos os valores da transação (valores absolutos); em caso de empate, escolha um deles.
Casos de teste:
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)]
Este é o código-golfe: o código mais curto vence .
Respostas:
JavaScript (ES6),
252 227 223 222215 bytesToma entrada como
[[n0, k0, name0], [n1, k1, name1], ...]
.As transações na solução podem ser positivas ou negativas. O proprietário é chamado indefinido .
Experimente online!
Comentado
fonte