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 a string of the possible values (in ascending order) of the last stone for each trail, with the results for each trail on a separate line.
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) {
return answer += "\n" + lastStoneVals.apply(null, innerArr);
}, "");
}
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.join(" ");
}
function stoneNumsStack(arr) {
return arr.reduce(function(answer, innerArr) {
return answer += "\n" + lastStoneVals.apply(null, innerArr);
}, "");
}
function stoneNumsStack(arr) {
var answer = "";
arr.forEach(function(innerArr) {
var results = lastStoneVals(innerArr[0], innerArr[1], innerArr[2]);
answer += "\n" + 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 (old)
By Katie Peters
Reacto: Stone Trails (old)
- 1,305