Last active
July 24, 2017 21:53
-
-
Save earlonrails/dbb30a0a17f31035a7e28eba98cc36eb to your computer and use it in GitHub Desktop.
Sort some pocket change in es6!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env node | |
"use strict" | |
const expect = require('expect.js') | |
const coinTypes = { | |
"0.01": "Pennies", | |
"0.05": "Nickels", | |
"0.10": "Dimes", | |
"0.25": "Quarters", | |
"0.50": "Quarters", | |
"1.00": "Dollars", | |
} | |
class PocketChange { | |
static createResults() { | |
return Object.values(coinTypes).reduce(function(result, value) { | |
result[value] = 0 | |
return result | |
}, {}) | |
} | |
static sort(change) { | |
var results = this.createResults() | |
results["total"] = 0.0 | |
change.map((c) => { | |
results[coinTypes[c.toFixed(2)]] += 1 | |
results["total"] += c | |
}) | |
results["total"] = Number(results.total.toFixed(2)) | |
return results | |
} | |
static mergeSort(change) { | |
if (change.length < 2 ) { | |
return change | |
} | |
let mid = parseInt(change.length / 2) | |
let left = change.slice(0, mid) | |
let right = change.slice(mid) | |
return this.merge(this.mergeSort(left), this.mergeSort(right)) | |
} | |
static merge(left, right) { | |
var results = [] | |
while(left.length || right.length) { | |
if (left.length && right.length) { | |
if (left[0] < right[0]) { | |
results.push(left.shift()) | |
} else { | |
results.push(right.shift()) | |
} | |
} else if (left.length) { | |
results.push(left.shift()) | |
} else if (right.length) { | |
results.push(right.shift()) | |
} | |
} | |
return results | |
} | |
} | |
var change = [0.25, 0.01, 0.05, 0.10, 0.50, 1.00] | |
var results = PocketChange.sort(change) | |
expect(results).to.eql({ | |
Pennies: 1, | |
Nickels: 1, | |
Dimes: 1, | |
Quarters: 2, | |
Dollars: 1, | |
total: 1.91 | |
}) | |
change = [0.25, 0.25, 0.01, 0.05, 0.25, 0.01, 0.10, 0.50, 0.10, 1.00, 0.10, 0.05, 0.01, 0.01, 0.01] | |
results = PocketChange.sort(change) | |
expect(results).to.eql({ | |
Pennies: 5, | |
Nickels: 2, | |
Dimes: 3, | |
Quarters: 4, | |
Dollars: 1, | |
total: 2.7 | |
}) | |
// using mergeSort | |
change = [0.25, 0.25, 0.01, 0.05, 0.25, 0.01, 0.10, 0.50, 0.10, 1.00, 0.10, 0.05, 0.01, 0.01, 0.01] | |
results = PocketChange.mergeSort(change) | |
expect(results).to.eql([0.01, 0.01, 0.01, 0.01, 0.01, 0.05, 0.05, 0.1, 0.1, 0.1, 0.25, 0.25, 0.25, 0.5, 1]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment