Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 152 additions & 12 deletions koans/AboutApplyingWhatWeHaveLearnt.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,21 @@ describe("About Applying What We Have Learnt", function() {
}
}

expect(productsICanEat.length).toBe(FILL_ME_IN);
expect(productsICanEat.length).toBe(1);
});

it("given I'm allergic to nuts and hate mushrooms, it should find a pizza I can eat (functional)", function () {

var productsICanEat = [];

/* solve using filter() & all() / any() */
productsICanEat = _(products).filter(function (product) {
return !product.containsNuts && !_(product.ingredients).any(function (ingredient) {
return ingredient === "mushrooms"
});
});

expect(productsICanEat.length).toBe(FILL_ME_IN);
expect(productsICanEat.length).toBe(1);
});

/*********************************************************************************/
Expand All @@ -55,14 +60,21 @@ describe("About Applying What We Have Learnt", function() {
}
}

expect(sum).toBe(FILL_ME_IN);
expect(sum).toBe(233168);
});

it("should add all the natural numbers below 1000 that are multiples of 3 or 5 (functional)", function () {

var sum = FILL_ME_IN; /* try chaining range() and reduce() */
var sum = _(_.range(1, 1000))
.chain()
.filter(function (num) {
return num % 3 === 0 || num % 5 === 0;
})
.reduce(function (sum, num) {
return sum + num;
}).value(); /* try chaining range() and reduce() */

expect(233168).toBe(FILL_ME_IN);
expect(233168).toBe(sum);
});

/*********************************************************************************/
Expand All @@ -75,39 +87,167 @@ describe("About Applying What We Have Learnt", function() {
}
}

expect(ingredientCount['mushrooms']).toBe(FILL_ME_IN);
expect(ingredientCount['mushrooms']).toBe(2);
});

it("should count the ingredient occurrence (functional)", function () {
var ingredientCount = { "{ingredient name}": 0 };

/* chain() together map(), flatten() and reduce() */

expect(ingredientCount['mushrooms']).toBe(FILL_ME_IN);
_(products).chain()
.map(function (product) { return product.ingredients;})
.flatten()
.reduce(function (memo, ingredient) { memo[`${ingredient}`] = (memo[`${ingredient}`] || 0) + 1; return memo},
ingredientCount)
.value();

expect(ingredientCount['mushrooms']).toBe(2);
});

/*********************************************************************************/
/* UNCOMMENT FOR EXTRA CREDIT */
/*
it("should find the largest prime factor of a composite number", function () {
function isPrime(number) {
for(let i= number-1; i>1; i--){
if(number%i===0) return false;
}
return true;
}

function biggestPrimeFactor(number) {
for(let i=number;i>1;i--){
if(number%i===0 && isPrime(i)){
return i;
}
}
return 1;
}

expect(biggestPrimeFactor(6857)).toBe(6857);
});

it("should find the largest palindrome made from the product of two 3 digit numbers", function () {
function isPoly(number) {
let strNumber = `${number}`
let coefficient = strNumber.length % 2 === 0 ? 0 : 1;
let strNumber1 = strNumber.slice(0, (strNumber.length - coefficient) / 2);
let strNumber2 = strNumber
.slice((strNumber.length + coefficient) / 2, strNumber.length)
.split("")
.reverse()
.join("");
return strNumber1 === strNumber2;
}

function biggestPoly() {
let result = 1;
for(let i=999;i>99;i--){
for(let j=i-1;j>99;j--){
if(isPoly(i*j) && result<(i*j)){
result = i*j;
}
}
}
return result;
}

expect((biggestPoly())).toBe(906609);
});

it("should find the smallest number divisible by each of the numbers 1 to 20", function () {
function isDividedBy(rangeStart, rangeEnd, number) {
let result = true;
_(_.range(rangeStart, rangeEnd+1)).forEach(function (factor) {
if(number % factor !== 0) {
result = false;
}
});
return result;
}

function gcd(number1, number2) {
return number2 === 0 ? number1 : gcd(number2, number1%number2);
}
function lcm(number1, number2) {
return number1/gcd(number1, number2)*number2;
}

let expectedNumber = 2;
for(let i=2;i<=20;i++){
expectedNumber = lcm(expectedNumber, i);
}

expect(isDividedBy(1, 20, expectedNumber)).toBe(true);
});

it("should find the difference between the sum of the squares and the square of the sums", function () {
function diff() {
let sumOfSquare = 0;
let squareOfSums = 0;
for(let i=0; i< arguments.length; i++){
sumOfSquare += arguments[i]*arguments[i];
squareOfSums += arguments[i];
}
squareOfSums *= squareOfSums;
return squareOfSums-sumOfSquare;
}

function mathDiff(n) {
return Math.abs((3*n*n + 2*n)*(1-n*n)/12);
}

expect(diff(1,2,3,4,5)).toBe(mathDiff(5));
});

it("should find the 10001st prime", function () {
function isPrime(number) {
for(let i= number-1; i>1; i--){
if(number%i===0) return false;
}
return true;
}
function prime(limit) {
let result = [];
let number = 2;
while (result.length<limit) {
if(isPrime(number)){
result.push(number);
}
number++;
}
return result;
}

function eratosthenes(n) {
// Eratosthenes algorithm to find all primes under n
let array = [], upperLimit = Math.sqrt(n), output = [];

// Make an array from 2 to (n - 1)
for (let i = 0; i < n; i++) {
array.push(true);
}

// Remove multiples of primes starting from 2, 3, 5,...
for (let i = 2; i <= upperLimit; i++) {
if (array[i]) {
for (let j = i * i; j < n; j += i) {
array[j] = false;
}
}
}

// All array[i] set to true are primes
for (let i = 2; i < n; i++) {
if(array[i]) {
output.push(i);
}
}

return output;
}

let simple = prime(10001);
let eraAlg = eratosthenes(105000);

expect(simple[10000]).toBe(eraAlg[10000]);
});
*/

});
60 changes: 30 additions & 30 deletions koans/AboutArrays.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ describe("About Arrays", function() {
//We shall contemplate truth by testing reality, via spec expectations.
it("should create arrays", function() {
var emptyArray = [];
expect(typeof(emptyArray)).toBe(FILL_ME_IN); //A mistake? - http://javascript.crockford.com/remedial.html
expect(emptyArray.length).toBe(FILL_ME_IN);
expect(typeof(emptyArray)).toBe('object'); //A mistake? - http://javascript.crockford.com/remedial.html
expect(emptyArray.length).toBe(0);

var multiTypeArray = [0, 1, "two", function () { return 3; }, {value1: 4, value2: 5}, [6, 7]];
expect(multiTypeArray[0]).toBe(FILL_ME_IN);
expect(multiTypeArray[2]).toBe(FILL_ME_IN);
expect(multiTypeArray[3]()).toBe(FILL_ME_IN);
expect(multiTypeArray[4].value1).toBe(FILL_ME_IN);
expect(multiTypeArray[4]["value2"]).toBe(FILL_ME_IN);
expect(multiTypeArray[5][0]).toBe(FILL_ME_IN);
expect(multiTypeArray[0]).toBe(0);
expect(multiTypeArray[2]).toBe("two");
expect(multiTypeArray[3]()).toBe(3);
expect(multiTypeArray[4].value1).toBe(4);
expect(multiTypeArray[4]["value2"]).toBe(5);
expect(multiTypeArray[5][0]).toBe(6);
});

it("should understand array literals", function () {
Expand All @@ -23,36 +23,36 @@ describe("About Arrays", function() {
expect(array).toEqual([1]);

array[1] = 2;
expect(array).toEqual([1, FILL_ME_IN]);
expect(array).toEqual([1, 2]);

array.push(3);
expect(array).toEqual(FILL_ME_IN);
expect(array).toEqual([1, 2, 3]);
});

it("should understand array length", function () {
var fourNumberArray = [1, 2, 3, 4];

expect(fourNumberArray.length).toBe(FILL_ME_IN);
expect(fourNumberArray.length).toBe(4);
fourNumberArray.push(5, 6);
expect(fourNumberArray.length).toBe(FILL_ME_IN);
expect(fourNumberArray.length).toBe(6);

var tenEmptyElementArray = new Array(10);
expect(tenEmptyElementArray.length).toBe(FILL_ME_IN);
expect(tenEmptyElementArray.length).toBe(10);

tenEmptyElementArray.length = 5;
expect(tenEmptyElementArray.length).toBe(FILL_ME_IN);
expect(tenEmptyElementArray.length).toBe(5);
});

it("should slice arrays", function () {
var array = ["peanut", "butter", "and", "jelly"];

expect(array.slice(0, 1)).toEqual(FILL_ME_IN);
expect(array.slice(0, 2)).toEqual(FILL_ME_IN);
expect(array.slice(2, 2)).toEqual(FILL_ME_IN);
expect(array.slice(2, 20)).toEqual(FILL_ME_IN);
expect(array.slice(3, 0)).toEqual(FILL_ME_IN);
expect(array.slice(3, 100)).toEqual(FILL_ME_IN);
expect(array.slice(5, 1)).toEqual(FILL_ME_IN);
expect(array.slice(0, 1)).toEqual(["peanut"]);
expect(array.slice(0, 2)).toEqual(["peanut", "butter"]);
expect(array.slice(2, 2)).toEqual([]);
expect(array.slice(2, 20)).toEqual(["and", "jelly"]);
expect(array.slice(3, 0)).toEqual([]);
expect(array.slice(3, 100)).toEqual(["jelly"]);
expect(array.slice(5, 1)).toEqual([]);
});

it("should know array references", function () {
Expand All @@ -62,36 +62,36 @@ describe("About Arrays", function() {
refArray[1] = "changed in function";
}
passedByReference(array);
expect(array[1]).toBe(FILL_ME_IN);
expect(array[1]).toBe("changed in function");

var assignedArray = array;
assignedArray[5] = "changed in assignedArray";
expect(array[5]).toBe(FILL_ME_IN);
expect(array[5]).toBe("changed in assignedArray");

var copyOfArray = array.slice();
copyOfArray[3] = "changed in copyOfArray";
expect(array[3]).toBe(FILL_ME_IN);
expect(array[3]).toBe("three");
});

it("should push and pop", function () {
var array = [1, 2];
array.push(3);

expect(array).toEqual(FILL_ME_IN);
expect(array).toEqual([1, 2, 3]);

var poppedValue = array.pop();
expect(poppedValue).toBe(FILL_ME_IN);
expect(array).toEqual(FILL_ME_IN);
expect(poppedValue).toBe(3);
expect(array).toEqual([1, 2]);
});

it("should know about shifting arrays", function () {
var array = [1, 2];

array.unshift(3);
expect(array).toEqual(FILL_ME_IN);
expect(array).toEqual([3, 1, 2]);

var shiftedValue = array.shift();
expect(shiftedValue).toEqual(FILL_ME_IN);
expect(array).toEqual(FILL_ME_IN);
expect(shiftedValue).toEqual(3);
expect(array).toEqual([1, 2]);
});
});
10 changes: 5 additions & 5 deletions koans/AboutExpects.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@ describe('About Expects', function() {
it('should expect true', function() {

// Your journey begins here: Replace the word false with true
expect(false).toBeTruthy();
expect(true).toBeTruthy();
});

// To understand reality, we must compare our expectations against reality.
it('should expect equality', function() {
var expectedValue = FILL_ME_IN;
var expectedValue = 2;
var actualValue = 1 + 1;

expect(actualValue === expectedValue).toBeTruthy();
});

// Some ways of asserting equality are better than others.
it('should assert equality a better way', function() {
var expectedValue = FILL_ME_IN;
var expectedValue = 2;
var actualValue = 1 + 1;

// toEqual() compares using common sense equality.
Expand All @@ -26,7 +26,7 @@ describe('About Expects', function() {

// Sometimes you need to be precise about what you "type."
it('should assert equality with ===', function() {
var expectedValue = FILL_ME_IN;
var expectedValue = "2";
var actualValue = (1 + 1).toString();

// toBe() will always use === to compare.
Expand All @@ -35,6 +35,6 @@ describe('About Expects', function() {

// Sometimes we will ask you to fill in the values.
it('should have filled in values', function() {
expect(1 + 1).toEqual(FILL_ME_IN);
expect(1 + 1).toEqual(2);
});
});
Loading