From b4e3fb41fef6978e3669c2a6a2099ee3a2f5c16c Mon Sep 17 00:00:00 2001 From: Ihor Taradaiko Date: Tue, 3 Mar 2026 11:56:33 +0000 Subject: [PATCH 1/5] median --- Sprint-1/fix/median.js | 19 ++++++++++++++++--- Sprint-1/package-lock.json | 2 ++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Sprint-1/fix/median.js b/Sprint-1/fix/median.js index b22590bc6..f226fa237 100644 --- a/Sprint-1/fix/median.js +++ b/Sprint-1/fix/median.js @@ -2,13 +2,26 @@ // 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 + // 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). + 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 numbers = list.filter(item => typeof item === 'number'); + if (numbers.length === 0) return null; + + numbers.sort((a, b) => a - b); + const middleIndex = Math.floor(numbers.length / 2); + + if (numbers.length % 2 === 1) { + return numbers[middleIndex]; + } + return (numbers[middleIndex - 1] + numbers[middleIndex]) / 2; } module.exports = calculateMedian; + diff --git a/Sprint-1/package-lock.json b/Sprint-1/package-lock.json index 83e427d0b..b52480af5 100644 --- a/Sprint-1/package-lock.json +++ b/Sprint-1/package-lock.json @@ -56,6 +56,7 @@ "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.25.7", @@ -1368,6 +1369,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001663", "electron-to-chromium": "^1.5.28", From e048d7b93f054e39c849a918617c1c4ac2970518 Mon Sep 17 00:00:00 2001 From: Ihor Taradaiko Date: Tue, 3 Mar 2026 11:58:36 +0000 Subject: [PATCH 2/5] dedupe --- Sprint-1/implement/dedupe.js | 6 +++++- Sprint-1/implement/dedupe.test.js | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Sprint-1/implement/dedupe.js b/Sprint-1/implement/dedupe.js index 781e8718a..884881c16 100644 --- a/Sprint-1/implement/dedupe.js +++ b/Sprint-1/implement/dedupe.js @@ -1 +1,5 @@ -function dedupe() {} +function dedupe(arr) { + return [...new Set(arr)]; +} + +module.exports = dedupe; diff --git a/Sprint-1/implement/dedupe.test.js b/Sprint-1/implement/dedupe.test.js index 23e0f8638..1c517e84f 100644 --- a/Sprint-1/implement/dedupe.test.js +++ b/Sprint-1/implement/dedupe.test.js @@ -1,4 +1,5 @@ const dedupe = require("./dedupe.js"); + /* Dedupe Array @@ -11,17 +12,31 @@ E.g. dedupe([5, 1, 1, 2, 3, 2, 5, 8]) target output: [5, 1, 2, 3, 8] E.g. dedupe([1, 2, 1]) target output: [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"); +test("given an empty array, it returns an empty array", () => { + expect(dedupe([])).toEqual([]); +}); + // Given an array with no duplicates // When passed to the dedupe function // Then it should return a copy of the original array +test("given an array with no duplicates, it returns a copy of the original array", () => { + expect(dedupe([1, 2, 3])).toEqual([1, 2, 3]); +}); + // Given an array with strings or numbers // When passed to the dedupe function // Then it should remove the duplicate values, preserving the first occurence of each element +test("removes duplicate values, preserving first occurrence", () => { + expect(dedupe(['a', 'a', 'a', 'b', 'b', 'c'])).toEqual(['a', 'b', 'c']); + expect(dedupe([5, 1, 1, 2, 3, 2, 5, 8])).toEqual([5, 1, 2, 3, 8]); + expect(dedupe([1, 2, 1])).toEqual([1, 2]); +}); From 096c21a4a01eba0dddace1165af5db61a19734d5 Mon Sep 17 00:00:00 2001 From: Ihor Taradaiko Date: Tue, 3 Mar 2026 13:32:27 +0000 Subject: [PATCH 3/5] max --- Sprint-1/implement/max.js | 4 +++- Sprint-1/implement/max.test.js | 33 +++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Sprint-1/implement/max.js b/Sprint-1/implement/max.js index 6dd76378e..b2c7438c0 100644 --- a/Sprint-1/implement/max.js +++ b/Sprint-1/implement/max.js @@ -1,4 +1,6 @@ -function findMax(elements) { +function findMax(arr) { + const numbers = arr.filter(item => typeof item === 'number'); + return Math.max(...numbers); } module.exports = findMax; diff --git a/Sprint-1/implement/max.test.js b/Sprint-1/implement/max.test.js index 82f18fd88..e886dae94 100644 --- a/Sprint-1/implement/max.test.js +++ b/Sprint-1/implement/max.test.js @@ -1,4 +1,5 @@ -/* Find the maximum element of an array of numbers +/* +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. @@ -9,35 +10,59 @@ 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 empty array, returns -Infinity", () => { + expect(findMax([])).toBe(-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, returns that number", () => { + expect(findMax([42])).toBe(42); +}); + // 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 positive and negative numbers, returns the largest", () => { + expect(findMax([-10, 5, -3, 20, 1])).toBe(20); +}); + // Given an array with just negative numbers // When passed to the max function // Then it should return the closest one to zero +test("given only negative numbers, returns the closest to zero", () => { + expect(findMax([-5, -1, -3, -2])).toBe(-1); +}); + // Given an array with decimal numbers // When passed to the max function // Then it should return the largest decimal number +test("given decimal numbers, returns the largest decimal", () => { + expect(findMax([1.5, 2.7, 0.3, 2.1])).toBe(2.7); +}); + // 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 mixed values, ignores non-numbers and returns the max", () => { + expect(findMax(['hey', 10, 'hi', 60, 10])).toBe(60); +}); + // 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 only non-number values, returns -Infinity", () => { + expect(findMax(['hey', 'hi', 'hello'])).toBe(-Infinity); +}); From ab407bae850d45037759d7f561e34a5330290420 Mon Sep 17 00:00:00 2001 From: Ihor Taradaiko Date: Tue, 3 Mar 2026 13:34:31 +0000 Subject: [PATCH 4/5] sum --- Sprint-1/implement/sum.js | 5 ++++- Sprint-1/implement/sum.test.js | 27 ++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Sprint-1/implement/sum.js b/Sprint-1/implement/sum.js index 9062aafe3..3e67676c5 100644 --- a/Sprint-1/implement/sum.js +++ b/Sprint-1/implement/sum.js @@ -1,4 +1,7 @@ -function sum(elements) { +function sum(arr) { + return arr + .filter(item => typeof item === 'number') + .reduce((total, num) => total + num, 0); } module.exports = sum; diff --git a/Sprint-1/implement/sum.test.js b/Sprint-1/implement/sum.test.js index dd0a090ca..7dbbc15c5 100644 --- a/Sprint-1/implement/sum.test.js +++ b/Sprint-1/implement/sum.test.js @@ -6,31 +6,56 @@ 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, returns 0", () => { + expect(sum([])).toBe(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 one number, returns that number", () => { + expect(sum([42])).toBe(42); +}); + // Given an array containing negative numbers // When passed to the sum function // Then it should still return the correct total sum +test("given negative numbers, returns the correct total sum", () => { + expect(sum([-10, -20, 30])).toBe(0); +}); + // Given an array with decimal/float numbers // When passed to the sum function // Then it should return the correct total sum +test("given decimal numbers, returns the correct total sum", () => { + expect(sum([1.5, 2.5, 3.0])).toBe(7); +}); + // 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 mixed values, ignores non-numbers and returns the sum", () => { + expect(sum(['hey', 10, 'hi', 60, 10])).toBe(80); +}); + // 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 only non-number values, returns 0", () => { + expect(sum(['hey', 'hi', 'hello'])).toBe(0); +}); From 6ef5104d8a97fd128247bbe8954aec8c139c805d Mon Sep 17 00:00:00 2001 From: Ihor Taradaiko Date: Tue, 3 Mar 2026 13:36:16 +0000 Subject: [PATCH 5/5] includes --- Sprint-1/refactor/includes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sprint-1/refactor/includes.js b/Sprint-1/refactor/includes.js index 29dad81f0..07a0e6877 100644 --- a/Sprint-1/refactor/includes.js +++ b/Sprint-1/refactor/includes.js @@ -1,8 +1,7 @@ // 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; } @@ -11,3 +10,4 @@ function includes(list, target) { } module.exports = includes; +