Görev
Diyelim ki ppepol bir faturayı bölmeli; her biri aşağıdakilerden oluşan üçlü ile tanımlanır (Name, n, k):
Name: isim ;n: ödemek zorunda olduğu miktar ;k: Gerçekte ödediği tutar .
Buradaki zorluk kimin kime borçlu olduğunu bulmaktır.
Varsayımlar
Giriş ve çıkış herhangi bir uygun formatta olabilir.
pnkpİsimler, küçük harfli alfabe karakterlerinden oluşan, rastgele uzunluktaki benzersiz dizelerdir.
Çözüm
Çözüm, pinsanlar arasındaki minimum işlemlerle temsil edilir ; özellikle onlar üçlü(from, to, amount)
from:namepara veren kişinin;to:namepara alan kişinin;amount: işlemin para miktarı.
NOT : Tüm borçların ( n) toplamı, halihazırda ödenmiş olan tutarların ( k) toplamından farklı olabilir . Bu durumda, çıktıya ('owner', Name, amount)veya (Name, 'owner', amount)seçtiğiniz biçimde eklemeniz gerekir . 'Ad owner' dizesi esnektir.
Birden fazla minimum küme varsa, tüm işlem tutarlarının (toplam değerler) minimum toplamına sahip olanı seçin; Beraberlik durumunda bunlardan birini seçin.
Test Durumları:
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)]
Bu kod golf: en kısa kod kazanır .