Skip to content
45 changes: 42 additions & 3 deletions Sprint-1/fix/median.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,49 @@
// 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;
// }

// Ignore this Commit
// It is not my solution I got help with AI. I confess I need to undestand more those 3 methodos to think
//and get to this solution
// I will come back to it later.

function calculateMedian(list) {
const middleIndex = Math.floor(list.length / 2);
const median = list.splice(middleIndex, 1)[0];
return median;
// non-array or empty inputs
if (!Array.isArray(list) || list.length === 0) {
return null;
}

//Filter non-numeric values and create a new array of only numbers

const numericList = list.filter(
(item) => typeof item === "number" && Number.isFinite(item)
);

// If after filtering, there are no numbers left, return null
if (numericList.length === 0) {
return null;
}

//Sort the numeric list
const sortedList = [...numericList].sort((a, b) => a - b);

const middleIndex = Math.floor(sortedList.length / 2);

//Calculate the median based on list length (odd or even)
if (sortedList.length % 2 === 1) {
// Odd number of elements: return the middle element
return sortedList[middleIndex];
} else {
// Even number of elements: return the average of the two middle elements
const mid1 = sortedList[middleIndex - 1];
const mid2 = sortedList[middleIndex];
return (mid1 + mid2) / 2;
}
}

module.exports = calculateMedian;
14 changes: 13 additions & 1 deletion Sprint-1/implement/dedupe.js
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
function dedupe() {}
function dedupe(arr) {
const result = [];
for (const item of arr) {
if (!result.includes(item)) {
result.push(item);
}
}
return result;
}

console.log(dedupe(["a", "a", "a", "b", "b", "c"]));

module.exports = dedupe;
16 changes: 15 additions & 1 deletion Sprint-1/implement/dedupe.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,26 @@ E.g. dedupe([1, 2, 1]) target output: [1, 2]
// 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("dedupe an empty array returns an empty array", () =>{
const inputEmpty = [];
const result = dedupe(inputEmpty);
expect(result).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", () => {
const inputNoDuplicates = ["a", "b", "c" ];
const result = dedupe(inputNoDuplicates);
expect(result).toEqual(["a", "b", "c"]);
});

// 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(" Given an array with no duplicates", () => {
const inputMix = [1,1,2,2,3,3,4,4,5,5];
const result = dedupe(inputMix);
expect(result).toEqual([1,2,3,4,5]);
});
7 changes: 6 additions & 1 deletion Sprint-1/implement/max.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
function findMax(elements) {
function findMax(numbersList) {
let onlyNumbers = numbersList.filter((item) => typeof item === "number");
let currentMax = Math.max(...onlyNumbers);
return currentMax;
}

console.log(findMax([1, "apple", 5, 0, "banana", 3]));

module.exports = findMax;
39 changes: 38 additions & 1 deletion Sprint-1/implement/max.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,65 @@ const findMax = require("./max.js");
// 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");
// This one is good to go!
test("given an empty array, returns -Infinity",() => {
const input = [];
const result = findMax(input);
expect(result).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 1 number, it returns the number ",() => {;
const inputMax1 = [3];
const result = findMax(inputMax1);
expect(result).toEqual(3);
});


// Given an array with both positive and negative numbers
// When passed to the max function
// Then it should return the largest number overall
test("give 2 positive numbers return the largest nunber",() => {
const inputMax2= [5,8];
const result = findMax(inputMax2);
expect(result).toEqual(8);
});

// 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 just negative numbers return colest to Zero",() =>{
const inputMax3= [-5,-3];
const result = findMax(inputMax3);
expect (result).toEqual(-3);
});

// 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, should return the largest decimal number",() => {
const inputMax4= [2.4,3.5];
const result= findMax(inputMax4);
expect(result).toEqual(3.5);
});

// 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 with non-number values,it should return the max and ignore non-numeric values ",() => {
const inputMax5 = [2, "apple", 5, "banana", 8, "watermelon"];
const result= findMax(inputMax5);
expect(result).toEqual(8);
});

// 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-number values,it should return the least surprising value given how it behaves for all other inputs ", () => {
const inputMax6= [ "computer", "bike", "car", "ball"];
const result= findMax(inputMax6);
expect(result).toEqual(-Infinity);
});

18 changes: 17 additions & 1 deletion Sprint-1/implement/sum.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
function sum(elements) {
function sum(theArray) {
const onlyNumbers = theArray.filter((item) => typeof item === "number");
const theFinalSum = onlyNumbers.reduce((runningTotal, currentNumber) => {
return runningTotal + currentNumber;
}, 0);
return theFinalSum;
}

console.log(sum(["hey", 10, "hi", 60, 10]));

module.exports = sum;

//numbersList.filter((item) => typeof item === "number");
/* 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)
*/
33 changes: 32 additions & 1 deletion Sprint-1/implement/sum.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,55 @@ const sum = require("./sum.js");
// 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", () => {
const inputNumber = [];
const result = sum(inputNumber);
expect(result).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 1 number, it returns the sum number", () => {
const inputNumber = [34];
const result = sum(inputNumber);
expect(result).toEqual(34);
});

// 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",() => {
const inputNegative = [10, -5, 20, -15];
const result= sum(inputNegative )
expect (result).toEqual(10);
});

// 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", () => {
const inputFloat = [10.2, 10.3];
const result = sum(inputFloat);
expect (result).toEqual(20.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 containing non-number values", () => {
const inputNonNumbers = [1, "apple", 2, true, 3];
const result = sum(inputNonNumbers);
expect (result).toEqual(6)
});

// 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 with only non-number values" , () =>{
const nonNumbers = ["helo", "hi"];
const result = sum(nonNumbers);
expect (result).toEqual(0)
});
15 changes: 12 additions & 3 deletions Sprint-1/refactor/includes.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
// 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];
// if (element === target) {
// return true;
// }
// }
// return false;
// }

function includes(list, target) {
for (let index = 0; index < list.length; index++) {
const element = list[index];
if (element === target) {
for (const value of list) {
if (value === target) {
return true;
}
}
Expand Down
10 changes: 9 additions & 1 deletion Sprint-2/implement/contains.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
function contains() {}
function contains(someObject, propertyName) {
let whatTheRobotFound = someObject[propertyName];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's this variable for?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I realize now that I’m not actually using this variable, so I’ll remove it to keep the code clean.

if (someObject[propertyName] === undefined) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can store the value undefined in objects. What would you expect to be returned in this case? What does your code do?

contains({"name": undefined}, "name");

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see...my code returns false even if the property exists but is set to undefined. I’ll use the in operator to fix this so it checks for the property instead of its value

return false;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should never have to write:

if (something) {
    return true;
} else {
    return false;
}

Because the condition in an if statement evaluates to a boolean, you can just return it directly:

return something;

which does the same. If you need to negate it, you can

return !something;

} else {
return true;
}
}

module.exports = contains;

25 changes: 24 additions & 1 deletion Sprint-2/implement/contains.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,39 @@ as the object doesn't contains a key of 'c'
// Given an empty object
// When passed to contains
// Then it should return false
test.todo("contains on empty object returns false");
test("contains on empty object returns false", () => {
const inputEmpty = [];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't an empty object, it's an array. It may be interesting to test what happens when passed an array, but it's not quite what the test name describes.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I used the symbol for an array [] by mistake. I’ll change it to {}

const result = contains(inputEmpty);
expect(result).toEqual(false);
});

// Given an object with properties
// When passed to contains with an existing property name
// Then it should return true
test("Given an object with properties when pass to contains it returns true", () => {
const myObject = {
name: "Alice",
age: 30,
city: "London",
};
const result = contains(myObject, "name");
expect(result).toEqual(true);
});

// Given an object with properties
// When passed to contains with a non-existent property name
// Then it should return false
test("give a object with proprieties when pass contains with non-exist proprity name it should return false", () => {
const inputProprieties2 = ["f", "g", "h"];
const result = contains(inputProprieties2);
expect(result).toEqual(false);
});
Comment on lines +45 to +49
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not quite sure what this test description is trying to convey, or what the test is trying to test... Can you explain?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I meant to pass an object (like {a: 1}) and a property name to check if it exists. I error used an array instead


// Given invalid parameters like an array
// When passed to contains
// Then it should return false or throw an error
test("invalid parameters should return false or throw an error", () => {
const invalidParameters = ("f", "g", "h");
const result = contains(invalidParameters);
Comment on lines +55 to +56
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not specifying a second parameter is an interesting case here, but the test name isn't very descriptive of this... Also, what is the type of invalidParameters here?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is a string. Because I used () instead of square brackets, JavaScript only looks at the last item. I also forgot the second parameter. I’ll fix it to be a proper test

expect(result).toEqual(false);
});
13 changes: 11 additions & 2 deletions Sprint-2/implement/lookup.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
function createLookup() {
// implementation here
function createLookup(countryCurrencyPairs) {
const lookup = {};

for (let i = 0; i < countryCurrencyPairs.length; i++) {
const countryCode = countryCurrencyPairs[i][0];
Comment on lines +4 to +5
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works, but probably isn't the most clear way of iterating across this array.

Can you think how other looping constructs, or destructuring, could help you make this more clear and easy to read?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i ffor...of loop would work better there.

const currencyCode = countryCurrencyPairs[i][1];

lookup[countryCode] = currencyCode;
}

return lookup;
}

module.exports = createLookup;
16 changes: 15 additions & 1 deletion Sprint-2/implement/lookup.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@

const createLookup = require("./lookup.js");

test.todo("creates a country currency code lookup for multiple codes");
test("creates a country currency code lookup for multiple codes", () => {
const input = [
["US", "USD"],
["CA", "CAD"],
];

const result = createLookup(input);

const expected = {
US: "USD",
CA: "CAD",
};

expect(result).toEqual(expected);
});
/*

Create a lookup object of key value pairs from an array of code pairs
Expand Down
Loading
Loading