diff --git a/Sprint-1/fix/median.js b/Sprint-1/fix/median.js index b22590bc6..f9f06f3f8 100644 --- a/Sprint-1/fix/median.js +++ b/Sprint-1/fix/median.js @@ -6,9 +6,28 @@ // or 'list' has mixed values (the function is expected to sort only numbers). function calculateMedian(list) { - const middleIndex = Math.floor(list.length / 2); - const median = list.splice(middleIndex, 1)[0]; - return median; + if (!Array.isArray(list)) { + return null; + } + const allNumbers = list.filter((item) => typeof item === "number"); + if (allNumbers.length === 0) { + return null; + } + + function compareNumbers(a, b) { + return a - b; + } + const sortedNumbers = allNumbers.sort(compareNumbers); + let result = 0; + for (i = 0; i < sortedNumbers.length; i++) result += sortedNumbers[i]; + if (sortedNumbers.length % 2 === 0) { + const median = result / sortedNumbers.length; + return median; + } + if (sortedNumbers.length % 2 !== 0) { + const middleIndex = Math.floor(sortedNumbers.length / 2); + return sortedNumbers[middleIndex]; + } } module.exports = calculateMedian; diff --git a/Sprint-1/implement/dedupe.js b/Sprint-1/implement/dedupe.js index 781e8718a..d4e3353fa 100644 --- a/Sprint-1/implement/dedupe.js +++ b/Sprint-1/implement/dedupe.js @@ -1 +1,10 @@ -function dedupe() {} +function dedupe(array) { + if (array.length === 0) { + return []; + } + const set = new Set(array); + const newArray = Array.from(set); + return newArray; +} + +module.exports = dedupe; diff --git a/Sprint-1/implement/dedupe.test.js b/Sprint-1/implement/dedupe.test.js index d7c8e3d8e..08ac0e57f 100644 --- a/Sprint-1/implement/dedupe.test.js +++ b/Sprint-1/implement/dedupe.test.js @@ -1,28 +1,40 @@ const dedupe = require("./dedupe.js"); -/* -Dedupe Array -📖 Dedupe means **deduplicate** +describe("dedupe", () => { + test("given an empty array, it should return an empty array", () => { + expect(dedupe([])).toEqual([]); + }); + test.each([ + { + input: [1, 2, 3, 4], + expected: [1, 2, 3, 4], + }, + { + input: ["a", "b", "c"], + expected: ["a", "b", "c"], + }, + ])("returns a copy of an array with no duplicates", ({ input, expected }) => { + const result = dedupe(input); -In this kata, you will need to deduplicate the elements of an array + expect(result).toEqual(expected); + expect(result).not.toBe(input); + }); + test.each([ + { + input: ["a", "c", "b", "d", "c", "d"], + expected: ["a", "c", "b", "d"], + }, + { + input: [1, 2, 3, 2, 4, 3], + expected: [1, 2, 3, 4], + }, + ])( + "given an array with duplicates, it should remove duplicates and preserve first occurrence", + ({ input, expected }) => { + const result = dedupe(input); -E.g. dedupe(['a','a','a','b','b','c']) returns ['a','b','c'] -E.g. dedupe([5, 1, 1, 2, 3, 2, 5, 8]) returns [5, 1, 2, 3, 8] -E.g. dedupe([1, 2, 1]) returns [1, 2] -*/ - -// Acceptance Criteria: - -// Given an empty array -// When passed to the dedupe function -// Then it should return an empty array -test.todo("given an empty array, it returns an empty array"); - -// Given an array with no duplicates -// When passed to the dedupe function -// Then it should return a copy of the original array - -// Given an array of strings or numbers -// When passed to the dedupe function -// Then it should return a new array with duplicates removed while preserving the -// first occurrence of each element from the original array. + expect(result).toEqual(expected); + expect(result).not.toBe(input); + } + ); +}); diff --git a/Sprint-1/implement/max.js b/Sprint-1/implement/max.js index 6dd76378e..05efab3ce 100644 --- a/Sprint-1/implement/max.js +++ b/Sprint-1/implement/max.js @@ -1,4 +1,12 @@ -function findMax(elements) { +function findMax(array) { + let result = -Infinity; + + for (const element of array) { + if (typeof element === "number" && element > result) { + result = element; + } + } + return result; } module.exports = findMax; diff --git a/Sprint-1/implement/max.test.js b/Sprint-1/implement/max.test.js index 82f18fd88..0c998c04c 100644 --- a/Sprint-1/implement/max.test.js +++ b/Sprint-1/implement/max.test.js @@ -1,43 +1,31 @@ -/* Find the maximum element of an array of numbers - -In this kata, you will need to implement a function that find the largest numerical element of an array. - -E.g. max([30, 50, 10, 40]), target output: 50 -E.g. max(['hey', 10, 'hi', 60, 10]), target output: 60 (sum ignores any non-numerical elements) - -You should implement this function in max.js, and add tests for it in this file. - -We have set things up already so that this file can see your function from the other file. -*/ - const findMax = require("./max.js"); -// Given an empty array -// When passed to the max function -// Then it should return -Infinity -// Delete this test.todo and replace it with a test. -test.todo("given an empty array, returns -Infinity"); +describe("findMax", () => { + test("given an empty array, it should return -Infinity", () => { + expect(findMax([])).toEqual(-Infinity); + }); -// Given an array with one number -// When passed to the max function -// Then it should return that number + test("given array with one number, it should return that number", () => { + expect(findMax([5])).toEqual(5); + }); -// Given an array with both positive and negative numbers -// When passed to the max function -// Then it should return the largest number overall + test("given array with both +ve and -ve numbers, it should return the largest number overall", () => { + expect(findMax([-10, 5, -20, 3])).toEqual(5); + }); -// Given an array with just negative numbers -// When passed to the max function -// Then it should return the closest one to zero + test("given array with only -ve numbers, it should return the closest one to zero", () => { + expect(findMax([-10, -20, -30, -40])).toEqual(-10); + }); -// Given an array with decimal numbers -// When passed to the max function -// Then it should return the largest decimal number + test("given array with decimal numbers, it should return the largest decimal number", () => { + expect(findMax([0.5, 0.12, 5.6, 0.002])).toEqual(5.6); + }); -// Given an array with non-number values -// When passed to the max function -// Then it should return the max and ignore non-numeric values + test("given array with non-number values, it should return the max and ignore non-numeric values", () => { + expect(findMax([5, "a", 10, "cat", 3, "b"])).toEqual(10); + }); -// Given an array with only non-number values -// When passed to the max function -// Then it should return the least surprising value given how it behaves for all other inputs + test("given array with only non-number values, it should return -infinity", () => { + expect(findMax(["cow", "cat", "dog"])).toEqual(-Infinity); + }); +}); diff --git a/Sprint-1/implement/sum.js b/Sprint-1/implement/sum.js index 9062aafe3..c34586861 100644 --- a/Sprint-1/implement/sum.js +++ b/Sprint-1/implement/sum.js @@ -1,4 +1,11 @@ -function sum(elements) { +function sum(array) { + let result = 0; + for (const element of array) { + if (typeof element === "number") { + result += element; + } + } + return result; } module.exports = sum; diff --git a/Sprint-1/implement/sum.test.js b/Sprint-1/implement/sum.test.js index dd0a090ca..26e6b8dd0 100644 --- a/Sprint-1/implement/sum.test.js +++ b/Sprint-1/implement/sum.test.js @@ -1,36 +1,27 @@ -/* Sum the numbers in an array - -In this kata, you will need to implement a function that sums the numerical elements of an array - -E.g. sum([10, 20, 30]), target output: 60 -E.g. sum(['hey', 10, 'hi', 60, 10]), target output: 80 (ignore any non-numerical elements) -*/ - const sum = require("./sum.js"); -// Acceptance Criteria: - -// Given an empty array -// When passed to the sum function -// Then it should return 0 -test.todo("given an empty array, returns 0") +describe("sum", () => { + test("given an empty array, it should return 0", () => { + expect(sum([])).toEqual(0); + }); -// Given an array with just one number -// When passed to the sum function -// Then it should return that number + test("given array with one number, it should return that number", () => { + expect(sum([5])).toEqual(5); + }); -// Given an array containing negative numbers -// When passed to the sum function -// Then it should still return the correct total sum + test("given array with only -ve numbers, it should return the correct total sum", () => { + expect(sum([-10, -20, -30, -40])).toEqual(-100); + }); -// Given an array with decimal/float numbers -// When passed to the sum function -// Then it should return the correct total sum + test("given array with only decimal/float numbers, it should return the correct total sum", () => { + expect(sum([0.5, 0.12, 3.14, 0.002])).toEqual(3.762); + }); -// Given an array containing non-number values -// When passed to the sum function -// Then it should ignore the non-numerical values and return the sum of the numerical elements + test("given array with non-number values, it should return the sum of the numerical elements", () => { + expect(sum([1, "a", 0.5, "b", -10])).toEqual(-8.5); + }); -// Given an array with only non-number values -// When passed to the sum function -// Then it should return the least surprising value given how it behaves for all other inputs + test("given array with only non-number values, it should return 0", () => { + expect(sum(["cow", "cat", "dog"])).toEqual(0); + }); +}); diff --git a/Sprint-1/refactor/includes.js b/Sprint-1/refactor/includes.js index 29dad81f0..7010de4e9 100644 --- a/Sprint-1/refactor/includes.js +++ b/Sprint-1/refactor/includes.js @@ -1,8 +1,5 @@ -// Refactor the implementation of includes to use a for...of loop - function includes(list, target) { - for (let index = 0; index < list.length; index++) { - const element = list[index]; + for (const element of list) { if (element === target) { return true; } diff --git a/Sprint-1/stretch/aoc-2018-day1/solution.js b/Sprint-1/stretch/aoc-2018-day1/solution.js index e69de29bb..349647017 100644 --- a/Sprint-1/stretch/aoc-2018-day1/solution.js +++ b/Sprint-1/stretch/aoc-2018-day1/solution.js @@ -0,0 +1,16 @@ +const fs = require("fs"); + +const text = fs.readFileSync("./input.txt", "utf8"); + +const numbers = text + .trim() + .split("\n") + .map(Number); + +let frequency = 0; + +for (const number of numbers) { + frequency += number; +} + +console.log(frequency); \ No newline at end of file