From 8176dbabd73350a03619fc0dbdf982165b48b04f Mon Sep 17 00:00:00 2001 From: Dagim-Daniel Date: Sat, 25 Jul 2026 09:38:03 +0100 Subject: [PATCH 1/5] i have done tasks under fix in Sprint 1 exercise. --- Sprint-1/fix/median.js | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) 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; } From 24f3b14740123e26d1474d61f765a96354e0b57b Mon Sep 17 00:00:00 2001 From: Dagim-Daniel Date: Sun, 26 Jul 2026 17:24:55 +0100 Subject: [PATCH 2/5] all tasks under sprint 1 implement part is done --- Sprint-1/implement/dedupe.js | 7 +++- Sprint-1/implement/dedupe.test.js | 35 ++++++------------ Sprint-1/implement/max.js | 2 ++ Sprint-1/implement/max.test.js | 60 +++++++++++++------------------ Sprint-1/implement/sum.js | 6 ++++ Sprint-1/implement/sum.test.js | 47 ++++++++++-------------- 6 files changed, 68 insertions(+), 89 deletions(-) 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); +}); From 4fe9c3a19df86701227a7a867b5f94550bd9206e Mon Sep 17 00:00:00 2001 From: Dagim-Daniel Date: Sun, 26 Jul 2026 17:36:49 +0100 Subject: [PATCH 3/5] sprint1 refractor exercise is done --- Sprint-1/refactor/includes.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sprint-1/refactor/includes.js b/Sprint-1/refactor/includes.js index 29dad81f0..8c9ae2e66 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; } From 9d50109d0af70f5487b047cfd43375561eade98d Mon Sep 17 00:00:00 2001 From: Dagim-Daniel Date: Sun, 26 Jul 2026 18:08:21 +0100 Subject: [PATCH 4/5] Sprint 2 coursework debug section is done --- Sprint-2/debug/address.js | 4 ++-- Sprint-2/debug/author.js | 6 +++--- Sprint-2/debug/recipe.js | 8 ++++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Sprint-2/debug/address.js b/Sprint-2/debug/address.js index 940a6af83..65c3b5ecd 100644 --- a/Sprint-2/debug/address.js +++ b/Sprint-2/debug/address.js @@ -1,5 +1,5 @@ // Predict and explain first... - +// i think its because the address is not used as an array but as an object // This code should log out the houseNumber from the address object // but it isn't working... // Fix anything that isn't working @@ -12,4 +12,4 @@ const address = { postcode: "XYZ 123", }; -console.log(`My house number is ${address[0]}`); +console.log(`My house number is ${address.houseNumber}`); diff --git a/Sprint-2/debug/author.js b/Sprint-2/debug/author.js index 8c2125977..2a37e796d 100644 --- a/Sprint-2/debug/author.js +++ b/Sprint-2/debug/author.js @@ -1,8 +1,8 @@ // Predict and explain first... - +//i think its because value is not used as a parameter of an object, and author is an object not an ordered list Array. // This program attempts to log out all the property values in the object. // But it isn't working. Explain why first and then fix the problem - +// i found that object literals are not iterative because they have no orders const author = { firstName: "Zadie", lastName: "Smith", @@ -11,6 +11,6 @@ const author = { alive: true, }; -for (const value of author) { +for (const value of Object.values(author)) { console.log(value); } diff --git a/Sprint-2/debug/recipe.js b/Sprint-2/debug/recipe.js index 6cbdd22cd..60d1da454 100644 --- a/Sprint-2/debug/recipe.js +++ b/Sprint-2/debug/recipe.js @@ -1,5 +1,9 @@ // Predict and explain first... - +/* +console.log(`${recipe.title} serves ${recipe.serves} + ingredients: +${recipe}`);// here it misses recipe.ingredients + */ // This program should log out the title, how many it serves and the ingredients. // Each ingredient should be logged on a new line // How can you fix it? @@ -12,4 +16,4 @@ const recipe = { console.log(`${recipe.title} serves ${recipe.serves} ingredients: -${recipe}`); +${recipe.ingredients.join("\n")}`); // this make the list to be logged on a new line - not predicted at first From ddbfe0742333284ac5f57218dc0fff63fc660831 Mon Sep 17 00:00:00 2001 From: Dagim-Daniel Date: Sun, 26 Jul 2026 20:23:52 +0100 Subject: [PATCH 5/5] sprint 2 interpret task is done. --- Sprint-2/interpret/invert.js | 28 ++++++++++++++++++++++------ Sprint-2/interpret/invert.test.js | 8 ++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 Sprint-2/interpret/invert.test.js diff --git a/Sprint-2/interpret/invert.js b/Sprint-2/interpret/invert.js index bb353fb1f..c93f8c653 100644 --- a/Sprint-2/interpret/invert.js +++ b/Sprint-2/interpret/invert.js @@ -10,20 +10,36 @@ function invert(obj) { const invertedObj = {}; for (const [key, value] of Object.entries(obj)) { - invertedObj.key = value; + //invertedObj.key = value; + invertedObj[value] = key; } return invertedObj; } +/* +console.log(invert({ a: 1 })); // {1:a} +console.log(invert({ a: 1, b: 2 })); +console.log(invert({ a: 1, b: 2 })); +*/ // a) What is the current return value when invert is called with { a : 1 } - +/* + { + key: 1; +} + */ // b) What is the current return value when invert is called with { a: 1, b: 2 } - +/* + { + key: 2; +} + */ // c) What is the target return value when invert is called with {a : 1, b: 2} - +// {"1":"a", "2":"b"} // c) What does Object.entries return? Why is it needed in this program? - +//object.entries takes an objecet and returns an array of its key-value pairs. // d) Explain why the current return value is different from the target output - +//because we use .key notation we are setting a property named "key" on our Object. // e) Fix the implementation of invert (and write tests to prove it's fixed!) + +module.exports = invert; diff --git a/Sprint-2/interpret/invert.test.js b/Sprint-2/interpret/invert.test.js new file mode 100644 index 000000000..2b0afa7c5 --- /dev/null +++ b/Sprint-2/interpret/invert.test.js @@ -0,0 +1,8 @@ +const invert = require("./invert.js"); +test("invert the key and values", () => { + expect(invert({ a: 1 })).toEqual({ 1: "a" }); +}); + +test("invert the key and values", () => { + expect(invert({ a: 1, b: 2 })).toEqual({ 1: "a", 2: b }); +});