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