diff --git a/Sprint-1/fix/median.js b/Sprint-1/fix/median.js index b22590bc6..eddd77fc6 100644 --- a/Sprint-1/fix/median.js +++ b/Sprint-1/fix/median.js @@ -1,13 +1,24 @@ -// Fix this implementation -// Start by running the tests for this function -// If you're in the Sprint-1 directory, you can run `npm test -- fix` to run the tests in the fix directory +function calculateMedian(list) { + const numbers = []; + for (const x of list) { + if (typeof x === "number") { + numbers.push(x); + } + } + if (numbers.length === 0 || list.length === 0) { + return null; + } -// Hint: Please consider scenarios when 'list' doesn't have numbers (the function is expected to return null) -// or 'list' has mixed values (the function is expected to sort only numbers). + numbers.sort((a, b) => a - b); + const middleIndex = Math.floor(numbers.length / 2); -function calculateMedian(list) { - const middleIndex = Math.floor(list.length / 2); - const median = list.splice(middleIndex, 1)[0]; + if (numbers.length % 2 === 0) { + const left = numbers[middleIndex - 1]; + const right = numbers[middleIndex]; + return (left + right) / 2; + } + + const median = numbers[middleIndex]; return median; } diff --git a/Sprint-1/implement/dedupe.js b/Sprint-1/implement/dedupe.js index 781e8718a..738fe1fbf 100644 --- a/Sprint-1/implement/dedupe.js +++ b/Sprint-1/implement/dedupe.js @@ -1 +1,6 @@ -function dedupe() {} +function dedupe() { + const newDedupe = [...new Set(value)]; + return newDedupe; +} + +module.exports = dedupe; diff --git a/Sprint-1/implement/dedupe.test.js b/Sprint-1/implement/dedupe.test.js index d7c8e3d8e..6ffb17e34 100644 --- a/Sprint-1/implement/dedupe.test.js +++ b/Sprint-1/implement/dedupe.test.js @@ -1,28 +1,15 @@ const dedupe = require("./dedupe.js"); -/* -Dedupe Array -📖 Dedupe means **deduplicate** +test("given an empty array, it returns an empty array", () => { + expect(dedupe([])).toEqual([]); +}); -In this kata, you will need to deduplicate the elements of an array +test("given an array with unique elements, it returns the same array", () => { + expect(dedupe([2, 1, 4, "2", "d", "g"])).toEqual([2, 1, 4, "2", "d", "g"]); +}); -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. +test("given an array of strings or numbers then it should return new array with duplicates removed", () => { + expect(dedupe([2, 2, 4, 2, 3, 4, 8, 5, 4, 1, 9])).toEqual([ + 2, 4, 3, 8, 5, 1, 9, + ]); +}); diff --git a/Sprint-1/implement/max.js b/Sprint-1/implement/max.js index 6dd76378e..2768a0515 100644 --- a/Sprint-1/implement/max.js +++ b/Sprint-1/implement/max.js @@ -1,4 +1,6 @@ function findMax(elements) { + elements = elements.filter((x) => typeof x === "number"); + return Math.max(...elements); } module.exports = findMax; diff --git a/Sprint-1/implement/max.test.js b/Sprint-1/implement/max.test.js index 82f18fd88..8531ce54c 100644 --- a/Sprint-1/implement/max.test.js +++ b/Sprint-1/implement/max.test.js @@ -1,43 +1,33 @@ -/* 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"); +test("Given an array with only +ve numbers and should return the largest of them", () => { + expect(findMax([2, 4, 2, 1, 5])).toEqual(5); +}); + +test("Given an empty array 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 an array with one number only and it should return that number", () => { + expect(findMax([7])).toEqual(7); +}); -// 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 an array with both positive and negative numbers and it should return the largest number", () => { + expect(findMax([1, -3, -2, 3, 4])).toEqual(4); +}); -// Given an array with just negative numbers -// When passed to the max function -// Then it should return the closest one to zero +test("Given an array with negative numbers and it should return the largest number", () => { + expect(findMax([-2, -5, -5, -3, -10])).toEqual(-2); +}); -// Given an array with decimal numbers -// When passed to the max function -// Then it should return the largest decimal number +test("Given an array with decimal numbers and it should return the largest decimal numbers", () => { + expect(findMax([2.7, 2.01, 4.4, 5.2])).toEqual(5.2); +}); -// 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 an array a mix of non-numeric values and numeric values and it should return the largest from only the numeric values and ignore the non-numeric ones", () => { + expect(findMax([2, "a", 8, "12", 8.1])).toEqual(8.1); +}); -// 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 an array with only non-numeric values and it should return -Infinity", () => { + expect(findMax(["a", "e", "I", "o", "U"])).toEqual(-Infinity); +}); diff --git a/Sprint-1/implement/sum.js b/Sprint-1/implement/sum.js index 9062aafe3..764f1cf00 100644 --- a/Sprint-1/implement/sum.js +++ b/Sprint-1/implement/sum.js @@ -1,4 +1,10 @@ function sum(elements) { + let total = 0; + elements = elements.filter((x) => typeof x === "number"); + for (let i = 0; i < elements.length; i++) { + total += elements[i]; + } + return total; } module.exports = sum; diff --git a/Sprint-1/implement/sum.test.js b/Sprint-1/implement/sum.test.js index dd0a090ca..57e6903eb 100644 --- a/Sprint-1/implement/sum.test.js +++ b/Sprint-1/implement/sum.test.js @@ -1,36 +1,25 @@ -/* 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") +test("given an empty array, it returns an empty array", () => { + 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 an array with just one number to the sum function Then it should return that number", () => { + expect(sum([3])).toEqual(3); +}); -// Given an array containing negative numbers -// When passed to the sum function -// Then it should still return the correct total sum +test("given an array containing negative numbers to the sum function then it should return the correct total", () => { + expect(sum([1, -1, -2, -3])).toEqual(-5); +}); -// Given an array with decimal/float numbers -// When passed to the sum function -// Then it should return the correct total sum +test("given an array with decimal/float numbers should return the correct total sum", () => { + expect(sum([2, 2.5])).toEqual(4.5); +}); -// 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 an array non-number value should return the correct total of only the numeric ones", () => { + expect(sum([2, "2", "a", "b", 3])).toEqual(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 an array non-number value should return 0", () => { + expect(sum(["a", "c", "f", "3"])).toEqual(0); +});