# py.test-3 --log-cli-level=DEBUG -v -k test_share_income share.py EXPENSE = 1 # # For a given income, return a list of the members who will not be paid in full # and how much will remain in their expense balance. # # See https://forum.hostea.org/t/decision-revenue-sharing-model/92 # def share_income(income, members): if income <= 0: return members if income < len(members): share = 1 count = income else: share = min(int(income / len(members)), min(members, key=lambda m: m[EXPENSE])[EXPENSE]) count = len(members) remaining = [] for i in range(count): m = members[i] m[EXPENSE] -= share if m[EXPENSE] > 0: remaining.append(m) remaining.extend(members[count:]) return share_income(income - share * count, remaining) def test_share_income(): assert share_income(1, [['a', 1], ['b', 1]]) == [['b', 1]] assert share_income(5, [['a', 10], ['b', 2]]) == [['a', 7]] assert share_income(5, [['a', 2], ['b', 10], ['c', 1]]) == [['b', 8]] assert share_income(5, [['a', 2], ['b', 10], ['c', 1], ['d', 40]]) == [['b', 9], ['d', 39]] assert share_income(5, [['a', 2], ['b', 10], ['c', 1], ['d', 40], ['e', 3]]) == [['a', 1], ['b', 9], ['d', 39], ['e', 2]] assert share_income(5, [['a', 2], ['b', 10], ['c', 1], ['d', 40], ['e', 3], ['f', 1]]) == [['a', 1], ['b', 9], ['d', 39], ['e', 2], ['f', 1]]