是时候公布第一步的参考答案了(用Groovy写的):
def paidback = ['FC':0, 'TM':0, 'P':0, 'Y':0] def items = [ [ 500+500+15, 'FC', ['FC','TM','P','Y']], [575+330+256, 'TM', ['FC','TM','P','Y']], [ 138, 'P', ['FC','TM','P','Y']], [ 15, 'TM', ['FC','TM']], [ 15, 'P', [ 'P', 'Y']], [ 17, 'P', [ 'P','TM']], [ 20, 'Y', ['FC', 'Y']], [ 3, 'FC', ['FC', 'Y']], [ 12, 'P', [ 'P','TM']], [ 10+9, 'FC', ['FC', 'Y']], [ 9, 'TM', ['TM', 'P']], [ 10, 'P', [ 'P', 'Y']], [ 10, 'TM', ['FC','TM']], [ 12, 'TM', ['TM', 'P']], [ 17, 'FC', ['FC', 'Y']] ] def calculatePaidback(namelist, name, payer, amount) { if (namelist.contains(name)) { def n = namelist.join().length() payer == name ? amount * (1 - name.length() / n) : -amount * name.length() / n } else 0 } items.each { item -> paidback.each { pb -> pb.value += calculatePaidback(item[2], pb.key, item[1], item[0]) } } paidback
输出结果为:
Result: [FC:230.8333333659, TM:389.8333333713, P:-222.8333333369, Y:-397.8333333326]
跟“利用Excel的公式”计算结果一致(1分钱的误差忽略)
拢共30 LOC,核心计算部分仅为11 LOC -- Groovy有多么的groovy, 由此可见一斑
第二步要解决的问题是:有一个图,带5节点(FC, TM, P, Y四个节点,再加一虚拟节点),四条有向边。如何把该图变形化简?
(图可能有N型,Z型,凹型等,只需给出其中一个即可)
To be continued...