Added S62

master
Ron Reciproco 10 months ago
parent d52fa7f45e
commit 151a35c28f

@ -0,0 +1 @@
/node_modules

@ -0,0 +1,10 @@
image: node:latest
stages:
- test
test:
stage: test
script:
- npm install
- npm test

@ -0,0 +1,5 @@
To start using the built-in tests, run <code>npm install</code> first then issue the <code>npm test</code> at the root directory of this project.
WARNING: Do not change any code inside <code>test.js</code>.
[Link to Solution](https://gitlab.com/zuitt-coding-bootcamp-curricula/courses/wdc028v1.5a/-/tree/main/fullstack/s52-solution)

@ -0,0 +1,86 @@
function countLetter(letter, sentence) {
let result = 0;
if (typeof letter !== 'string' || letter.length !== 1) {
return undefined;
}
for (let i = 0; i < sentence.length; i++) {
if (sentence[i] === letter) {
result++;
}
}
return result;
}
function isIsogram(text) {
// Convert the text to lowercase to disregard casing.
text = text.toLowerCase();
let seenLetters = {};
for (let char of text) {
if (seenLetters[char]) {
return false;
}
seenLetters[char] = true;
}
return true;
}
function purchase(age, price) {
if (age < 13) {
return undefined;
}
if (age >= 13 && age <= 21 || age >= 65) {
let discountedPrice = price * 0.8;
return discountedPrice.toFixed(2);
}
return price.toFixed(2);
}
function findHotCategories(items) {
let hotCategories = {};
for (let item of items) {
if (item.stocks === 0) {
hotCategories[item.category] = true;
}
}
let result = Object.keys(hotCategories);
return result;
}
function findFlyingVoters(candidateA, candidateB) {
let setA = new Set(candidateA);
let setB = new Set(candidateB);
let commonVoters = [...setA].filter(voter => setB.has(voter));
return commonVoters;
}
module.exports = {
countLetter,
isIsogram,
purchase,
findHotCategories,
findFlyingVoters
};

File diff suppressed because it is too large Load Diff

@ -0,0 +1,14 @@
{
"name": "s52",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest"
},
"author": "",
"license": "ISC",
"dependencies": {
"jest": "^26.6.3"
}
}

@ -0,0 +1,87 @@
// This is the file to check whether your answer is correct or wrong.
// Do not change anything in this file.
const assert = require('assert');
const source = require('./index');
describe('[1] Count letters in a sentence.', function() {
const validLetter = 'o';
const invalidLetter = 'abc';
const sentence = 'The quick brown fox jumps over the lazy dog';
it('Invalid letter returns undefined.', function() {
const result = source.countLetter(invalidLetter, sentence);
expect(result).toBeUndefined();
});
it('Valid letter returns number of occurrence.', function() {
const result = source.countLetter(validLetter, sentence);
expect(result).toEqual(4);
});
});
describe('[2] Check isogram.', function() {
const isogram = 'Machine';
const notIsogram = 'Hello';
it('Returns true if a word is an isogram.', function() {
const result = source.isIsogram(isogram);
expect(result).toEqual(true);
});
it('Returns false if a word is not an isogram.', function() {
const result = source.isIsogram(notIsogram);
expect(result).toEqual(false);
});
});
describe('[3] Purchase goods.', function() {
const price = 109.4356;
const discountedPrice = price * 0.8;
const roundedPrice = discountedPrice.toFixed(2);
it('Returns undefined for students aged below 13.', function() {
const result = source.purchase(12, price);
expect(result).toBeUndefined();
});
it('Returns discounted price (rounded off) for students aged 13 to 21.', function() {
const result = source.purchase(15, price);
expect(result).toEqual(roundedPrice);
});
it('Returns discounted price (rounded off) for senior citizens.', function() {
const result = source.purchase(72, price);
expect(result).toEqual(roundedPrice);
});
it('Returns price (rounded off) for people aged 22 to 64.', function() {
const result = source.purchase(34, price);
expect(result).toEqual(price.toFixed(2));
});
});
describe('[4] Find hot categories.', function() {
const items = [
{ id: 'tltry001', name: 'soap', stocks: 14, category: 'toiletries' },
{ id: 'tltry002', name: 'shampoo', stocks: 8, category: 'toiletries' },
{ id: 'tltry003', name: 'tissues', stocks: 0, category: 'toiletries' },
{ id: 'gdgt001', name: 'phone', stocks: 0, category: 'gadgets' },
{ id: 'gdgt002', name: 'monitor', stocks: 0, category: 'gadgets' }
];
it('Returns item categories without stocks.', function() {
const result = source.findHotCategories(items);
expect(result).toEqual(['toiletries', 'gadgets']);
});
});
describe('[5] Find flying voters.', function() {
const candidateA = ['LIWf1l', 'V2hjZH', 'rDmZns', 'PvaRBI', 'i7Xw6C', 'NPhm2m'];
const candidateB = ['kcUtuu', 'LLeUTl', 'r04Zsl', '84EqYo', 'V2hjZH', 'LIWf1l'];
it('Returns the array of flying voters.', function() {
const result = source.findFlyingVoters(candidateA, candidateB);
expect(result).toEqual(['LIWf1l', 'V2hjZH']);
});
});

@ -1 +0,0 @@
Subproject commit a9253e2e4f52925478c882822da78456d1526540
Loading…
Cancel
Save