The
ibid
interface makes the code cleaner.
bid: ibid id //int order in which received price id(): return id price(): return price increment(): return 0 maxprice(): return price escalatingbid: ibid id //int order in which received price increment maxprice id(): return id price(): return price increment(): return increment maxprice(): return maxprice ibid: id() price() increment() maxprice()The bid with the highest maxprice() wins. To calculate the final price, the 2nd highest bid is also required.
//examples 300-325, +2 // 300 275-299, +3 300-325, +2 // 312 275-310, +3 300-325, +2 // 312 275-311, +3 320-325, +2 // 325 320-324, +3 320-325, +2 // 325 300-325, +3 // corner cases 300 // 300 300 300 // 300 275-300, +5 275-300, +5 // 300 300 winningbid(ibid[] bids): if bids == null: throw comparer = new bidcomparer() bid1, bid2 = top(bids, 2, comparer) if bid1 == null: // no winner return null finalprice = finalprice(bid1, bid2, comparer) return finalprice, bid1 finalprice(bid1, bid2, comparer): // bid1 cannot be null if comparer.compare(bid1, bid2) <= 0: throw if bid2 == null || bid2.maxprice() < bid1.price(): price = bid1.price() else: if bid1.increment() > 0: escalation = (((bid2.maxprice() - bid1.price()) / bid1.increment()) + 1) * bid1.increment() price = bid1.price() + escalation if price > bid1.maxprice(): price = bid1.maxprice() return priceWhen the maxprice() is same for 2 bids, the bid that came in first wins.
// quick and dirty top2(bids, comparer): if bids == null || comparer == null: throw max1 = max2 = null for bid in bids: if comparer.compareto(bid, max1) > 0: max2 = max1 max1 = bid else if comparer.compareto(bid, max2) > 0: max2 = bid return max1, max2 bidcomparer: icomparer{ibid} int compareto(bid1, bid2): if bid1 == null && bid2 == null: return 0 if bid1 == null: return -1 if bid2 == null: return 1 compare = bid1.maxprice().compareto(bid2.maxprice()) if compare == 0: // when maxprice() is same, pick the one that came first compare == -1 * bid1.id().compareto(bid2.id()) return compare
No comments:
Post a Comment