Cleaning Shop
Recursion
Jack is a clean freak. Leave him unattended, and the whole place will be spotless. Great and all, but, uh, we're actually trying to sell coffee here.
Over time, we've gotten a good estimate of how long it'll take him to do his tasks. Give him a hard time limit and neither one of us will be driven up a wall. Or murdered.
"use strict";
const timeLimit = 45;
const cleaningTasks = [15, 10, 8, 5, 3, 25, 7];
const tasksCompleted = [];
// Jack's thinking: "I've only got 45 minutes?!"
// "I'll just go down the list, one by one."
const jackCleaning = (_tasks) => {
return (_timeLimit) => {
return (_tasksCompleted) => {
console.log('_tasks', _tasks);
let taskTimeChecker = _tasks.find(task => task <= _timeLimit);
// "Find the first one, get it done."
console.log('taskTimeChecker', taskTimeChecker);
if (taskTimeChecker != undefined) {
_timeLimit -= taskTimeChecker;
console.log('_timeLimit', _timeLimit);
// "Runnin' out of time."
_tasksCompleted.push(taskTimeChecker);
console.log('_tasksCompleted', _tasksCompleted);
// "Another one bites the dust."
_tasks.splice(_tasks.indexOf(taskTimeChecker), 1);
// "Check that one off the list."
}
else {
console.log(_tasksCompleted);
return `_tasksCompleted: ${_tasksCompleted}`;
}
return jackCleaning(_tasks)(_timeLimit)(_tasksCompleted);
// "All play and no work makes Jack a dull boy."
// And he just keeps going down the list like a madman.
}
}
}
console.log( jackCleaning(cleaningTasks)(timeLimit)(tasksCompleted) );
// "_tasks" [15, 10, 8, 5, 3, 25, 7]
// "taskTimeChecker" 15
// "_timeLimit" 30
// "_tasksCompleted" [15]
// He's done one 15-minute task, and has 30 minutes left…
// "_tasks" [10, 8, 5, 3, 25, 7]
// "taskTimeChecker" 10
// "_timeLimit" 20
// "_tasksCompleted" [15, 10]
// "_tasks" [8, 5, 3, 25, 7]
// "taskTimeChecker" 8
// "_timeLimit" 12
// "_tasksCompleted" [15, 10, 8]
// "_tasks" [5, 3, 25, 7]
// "taskTimeChecker" 5
// "_timeLimit" 7
// "_tasksCompleted" [15, 10, 8, 5]
// "_tasks" [3, 25, 7]
// "taskTimeChecker" 3
// "_timeLimit" 4
// "_tasksCompleted" [15, 10, 8, 5, 3]
// "_tasks" [25, 7]
// "taskTimeChecker" undefined
// [15, 10, 8, 5, 3]
// "_tasksCompleted: 15,10,8,5,3"
// With only 4 minutes left, neither one of those tasks is short enough.
// Mr. Scrubbing Bubbles has to go back to slingin' beans.
Bonus Lesson!
Variable Names
Didn't all those examples seem real easy to follow with all 'em good names? If they weren't, I had no part in this and you never saw me.
On the way out, we pass a sign that says:
A. always
B. be
C. coding
Top comments (0)