R
E
A
C
T
O
xamples
epeat
ode
pproach
ptimize
est
{Stone Trails}
The Stone Trails
While Cindy is out on a hike with friends, she finds a trail of stones with numbers on them. She starts following the trail and notices that consecutive stones have a difference of either A or B. Legend has it that there is a treasure trove at the end of the trail, and if Cindy can guess the value of the last stone, the treasure will be hers.
0
1
3
5
?
6
The Challenge
Write a function that takes an array of stone trails and returns an array of the possible values (in ascending order) of the last stone for each trail, with the results for each trail in a nested array.
An array of...wait - what's a stone trail?
A stone trail is represented by an array [x, a, b] where:
- x is the number of stones in the trail
- a is value A
- b is value B
IMPORTANT NOTES:
- The value of the first stone is always 0
- The numbers on the stones are in increasing order
Simple Example
EXAMPLE: Given [[3, 1, 2]], return 2 3 4.
0
1
2
0
1
3
0
2
4
0
2
3
1
1
1
2
2
2
2
1
Tests to Run
Input: [[3, 1, 2]]
Output: [[2, 3, 4]]
Input: [[3, 1, 2], [4, 10, 100]]
Output: [[2, 3, 4], [30, 120, 210, 300]]
Input: [[5, 3, 23], [73, 25, 25], [12, 73, 82]]
Output: [[12, 32, 52, 72, 92], [1800], [803, 812, 821,
830, 839, 848, 857, 866, 875, 884, 893, 902]]
The Approach
- Run through each combination of A and B that will produce a unique result
- AAAAAA
- AAAAAB
- AAAABB
- AAABBB
- AABBBB
- ABBBBB
- BBBBBB
function stoneNumsStack(arr) {
return arr.reduce(function(answer, innerArr) {
answer.push(lastStoneVals.apply(null, innerArr));
return answer;
}, []);
}
function lastStoneVals(numStones, valA, valB) {
var sum = 0,
counter = 0,
results = [];
if (valA === valB) {
sum = valA * (numStones - 1);
results.push(sum);
} else {
while (counter < numStones) {
var a = (valA < valB) ? valA : valB;
var b = (valA < valB) ? valB : valA;
sum += a * (numStones - counter -1);
sum += b * counter;
results.push(sum);
sum = 0;
counter++;
}
}
return results;
}
function stoneNumsStack(arr) {
return arr.reduce(function(answer, innerArr) {
answer.push(lastStoneVals.apply(null, innerArr));
return answer;
}, []);
}
function stoneNumsStack(arr) {
var answer = [];
arr.forEach(function(innerArr) {
var results = lastStoneVals(innerArr[0], innerArr[1], innerArr[2]);
answer.push(results);
});
return answer;
}
same result as
Using reduce and apply
var arr = [100, 20, 15, 8];
console.log(arr.sort());
--> [100, 15, 20, 8]
var arr = [100, 20, 15, 8];
function sortingFunc(a, b) {
return a - b;
}
console.log(arr.sort(sortingFunc));
--> [8, 15, 20, 100];
You cannot just do arr.sort() for numbers
If your partner sorts an array of numbers..
Instead, pass in a comparing function to arr.sort()
Concepts Covered
- Combinations (AAA, AAB, ABB, etc..), but not permutations (AAB, ABA, BAA)
- Refactoring
- Separate out into multiple functions?
- Use prototypal methods (like reduce and apply)?
Reacto: Stone Trails
By Katie Peters
Reacto: Stone Trails
- 1,346