// Check first whether the letter is a single character. // If letter is a single character, count how many times a letter has occurred in a given sentence then return count. // If letter is invalid, return undefined. function countLetter(letter, sentence) { if (letter.length !== 1) { return undefined; // Return undefined if letter is not a single character } const cleanedLetter = letter.toLowerCase(); // Convert letter to lowercase for case insensitivity const cleanedSentence = sentence.toLowerCase(); // Convert sentence to lowercase for case insensitivity let count = 0; for (const char of cleanedSentence) { if (char === cleanedLetter) { count++; } } return count; } function isIsogram(text) { // An isogram is a word where there are no repeating letters. // The function should disregard text casing before doing anything else. // If the function finds a repeating letter, return false. Otherwise, return true. // Convert the text to lowercase for case insensitivity function isIsogram(text) { const cleanedText = text.toLowerCase(); // Convert text to lowercase for case insensitivity const uniqueLetters = new Set(); for (const letter of cleanedText) { if (letter !== ' ') { if (uniqueLetters.has(letter)) { return false; // Found a repeating letter } else { uniqueLetters.add(letter); } } } return true; // No repeating letters found } function purchase(age, price) { // Return undefined for people aged below 13. // Return the discounted price (rounded off) for students aged 13 to 21 and senior citizens. (20% discount) // Return the rounded off price for people aged 22 to 64. // The returned value should be a string. function purchase(age, price) { if (age < 13) { return undefined; } else if (age >= 13 && age <= 21 || age >= 65) { // Apply 20% discount for students aged 13 to 21 and senior citizens const discountedPrice = Math.round(price * 0.8); return discountedPrice.toString(); } else { // For people aged 22 to 64, return the rounded off price return Math.round(price).toString(); } } function findHotCategories(items) { // Find categories that has no more stocks. // The hot categories must be unique; no repeating categories. // The passed items array from the test are the following: { 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' } // The expected output after processing the items array is ['toiletries', 'gadgets']. // Only putting return ['toiletries', 'gadgets'] will not be counted as a passing test during manual checking of codes. // Use a Set to keep track of unique categories const uniqueCategories = new Set(); // Iterate through the items for (const item of items) { if (item.stocks === 0) { uniqueCategories.add(item.category); } } // Convert the Set to an array and return it return Array.from(uniqueCategories); } } function findFlyingVoters(candidateA, candidateB) { // Find voters who voted for both candidate A and candidate B. // The passed values from the test are the following: candidateA: ['LIWf1l', 'V2hjZH', 'rDmZns', 'PvaRBI', 'i7Xw6C', 'NPhm2m'] candidateB: ['kcUtuu', 'LLeUTl', 'r04Zsl', '84EqYo', 'V2hjZH', 'LIWf1l'] The expected output after processing the candidates array is ['LIWf1l', 'V2hjZH']. Only putting return ['LIWf1l', 'V2hjZH'] will not be counted as a passing test during manual checking of codes. } module.exports = { countLetter, isIsogram, purchase, findHotCategories, findFlyingVoters };