From 4c97776ee7ac860ded87d39ff3cdcfa3b99752b3 Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Wed, 8 Jul 2026 14:58:52 +0100 Subject: [PATCH 1/9] fix implementation for calculating median --- Sprint-1/fix/median.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Sprint-1/fix/median.js b/Sprint-1/fix/median.js index b22590bc6..5c7294b2e 100644 --- a/Sprint-1/fix/median.js +++ b/Sprint-1/fix/median.js @@ -6,9 +6,15 @@ // 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]; + if (!Array.isArray(list)) { + return null; + } + const numbers = list.filter((item) => typeof item === "number"); + const copy = Array.from(numbers); + const newArray = copy.sort(); + + const middleIndex = Math.floor(newArray.length / 2); + const median = newArray.splice(middleIndex, 1)[0]; return median; } - module.exports = calculateMedian; From d4a5843c96f2f3fa29d265b624e29a53dec18af5 Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Fri, 10 Jul 2026 01:21:17 +0100 Subject: [PATCH 2/9] implement dedupe function and tests --- Sprint-1/implement/dedupe.js | 11 +++++- Sprint-1/implement/dedupe.test.js | 60 ++++++++++++++++++------------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/Sprint-1/implement/dedupe.js b/Sprint-1/implement/dedupe.js index 781e8718a..76aff5714 100644 --- a/Sprint-1/implement/dedupe.js +++ b/Sprint-1/implement/dedupe.js @@ -1 +1,10 @@ -function dedupe() {} +function dedupe(array) { + const result = []; + if (array.length === 0) { + return result; + } + 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); + } + ); +}); From df692dd0b01944e8c70e4af6aefe1f57dcea2d5d Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Fri, 10 Jul 2026 12:26:28 +0100 Subject: [PATCH 3/9] implement function and tests for max number --- Sprint-1/implement/max.js | 10 +++++- Sprint-1/implement/max.test.js | 58 ++++++++++++++-------------------- 2 files changed, 32 insertions(+), 36 deletions(-) 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); + }); +}); From 4680671f8f1a189b1fc61c52439657a36dcaf37e Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Fri, 10 Jul 2026 13:13:05 +0100 Subject: [PATCH 4/9] implement sum function and tests --- Sprint-1/implement/sum.js | 9 ++++++- Sprint-1/implement/sum.test.js | 49 ++++++++++++++-------------------- 2 files changed, 28 insertions(+), 30 deletions(-) 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); + }); +}); From 4a2cb1aa4effe7c65b6e12f89aeadeceabe35558 Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Fri, 10 Jul 2026 20:50:48 +0100 Subject: [PATCH 5/9] refactored function using for...of loop --- Sprint-1/refactor/includes.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Sprint-1/refactor/includes.js b/Sprint-1/refactor/includes.js index 29dad81f0..a5e2d5b12 100644 --- a/Sprint-1/refactor/includes.js +++ b/Sprint-1/refactor/includes.js @@ -1,8 +1,6 @@ -// 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; } From e78408c819b3bb6f7bd0086f08a96eae0f96d8dc Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Fri, 10 Jul 2026 20:54:52 +0100 Subject: [PATCH 6/9] refactored function using for...of loop --- Sprint-1/refactor/includes.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Sprint-1/refactor/includes.js b/Sprint-1/refactor/includes.js index a5e2d5b12..7010de4e9 100644 --- a/Sprint-1/refactor/includes.js +++ b/Sprint-1/refactor/includes.js @@ -1,4 +1,3 @@ - function includes(list, target) { for (const element of list) { if (element === target) { From 5b49ae1a0819601674ce486ea83c5bd092dc49f0 Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Mon, 13 Jul 2026 02:15:49 +0100 Subject: [PATCH 7/9] solved frequency for input.txt --- Sprint-1/stretch/aoc-2018-day1/solution.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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 From 540f170e8ee4f968ddd67b95c1fae3515dfcc250 Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Mon, 27 Jul 2026 01:36:40 +0100 Subject: [PATCH 8/9] modified the function --- Sprint-1/implement/dedupe.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sprint-1/implement/dedupe.js b/Sprint-1/implement/dedupe.js index 76aff5714..d4e3353fa 100644 --- a/Sprint-1/implement/dedupe.js +++ b/Sprint-1/implement/dedupe.js @@ -1,10 +1,10 @@ function dedupe(array) { - const result = []; if (array.length === 0) { - return result; + return []; } const set = new Set(array); const newArray = Array.from(set); return newArray; } + module.exports = dedupe; From e6a240191be48549ef9cb90c9e875be81c7305c5 Mon Sep 17 00:00:00 2001 From: Dipa-Sarker Date: Mon, 27 Jul 2026 11:31:37 +0100 Subject: [PATCH 9/9] completed median.js for all tests --- Sprint-1/fix/median.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Sprint-1/fix/median.js b/Sprint-1/fix/median.js index 5c7294b2e..f9f06f3f8 100644 --- a/Sprint-1/fix/median.js +++ b/Sprint-1/fix/median.js @@ -9,12 +9,25 @@ function calculateMedian(list) { if (!Array.isArray(list)) { return null; } - const numbers = list.filter((item) => typeof item === "number"); - const copy = Array.from(numbers); - const newArray = copy.sort(); + const allNumbers = list.filter((item) => typeof item === "number"); + if (allNumbers.length === 0) { + return null; + } - const middleIndex = Math.floor(newArray.length / 2); - const median = newArray.splice(middleIndex, 1)[0]; - return median; + 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;