Skip to content

Instantly share code, notes, and snippets.

@lsiu
Created November 9, 2012 06:50
Show Gist options
  • Save lsiu/4044113 to your computer and use it in GitHub Desktop.
Save lsiu/4044113 to your computer and use it in GitHub Desktop.
Give change with the least amount of coins
object CoinMachine {
def changeWithBigCoin(accum: Change, changeOwing: Double, avaliableChange: Change): (Change, Double, Change) = {
if (changeOwing < 0) throw new Error("Cannot give change with existing coins")
else if (changeOwing == 0) return (accum, 0, avaliableChange)
else if (changeOwing >= 5 && avaliableChange.fiveDollarsLeft > 0) changeWithBigCoin(accum.changeFiveDollar(1), changeOwing - 5, avaliableChange.changeFiveDollar(-1))
else if (changeOwing >= 2 && avaliableChange.twoDollarsLeft > 0) changeWithBigCoin(accum.changeTwoDollar(1), changeOwing - 2, avaliableChange.changeTwoDollar(-1))
else if (changeOwing >= 1 && avaliableChange.dollarsLeft > 0) changeWithBigCoin(accum.changeDollar(1), changeOwing - 1, avaliableChange.changeDollar(-1))
else if (changeOwing >= 0.5 && avaliableChange.fiftycentsLeft > 0) changeWithBigCoin(accum.changeFiftyCent(1), changeOwing - 0.5, avaliableChange.changeFiftyCent(-1))
else throw new Error("Cannot give change on remainder: " + changeOwing)
}
def pay(paidAmount: Double, cost: Double, availableChange: Change): Change = {
val requiredChange: Double = paidAmount - cost
if (requiredChange < 0) throw new Error("Pay me more")
else if (requiredChange == 0) return new Change(0, 0, 0, 0)
else {
val result = changeWithBigCoin(new Change(0, 0, 0, 0), requiredChange, availableChange)
result._1
}
}
pay(10, 7, new Change(2, 2, 0, 5))
class Change(fiftycents: Int, dollars: Int, twoDollars: Int, fiveDollars: Int) {
def changeFiveDollar(amt: Int) = new Change(fiftycents, dollars, twoDollars, fiveDollars + amt)
def changeTwoDollar(amt: Int) = new Change(fiftycents, dollars, twoDollars + amt, fiveDollars)
def changeDollar(amt: Int) = new Change(fiftycents, dollars + amt, twoDollars, fiveDollars)
def changeFiftyCent(amt: Int) = new Change(fiftycents + amt, dollars, twoDollars, fiveDollars)
override def toString() = "(" + fiftycents + ", " + dollars + ", " + twoDollars + ", " + fiveDollars + ")"
def fiftycentsLeft = fiftycents;
def dollarsLeft = dollars;
def twoDollarsLeft = twoDollars;
def fiveDollarsLeft = fiveDollars
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment