generated from nhcarrigan/template
This commit is contained in:
@@ -8,6 +8,7 @@ export default [
|
|||||||
"max-depth": "off",
|
"max-depth": "off",
|
||||||
"max-statements": "off",
|
"max-statements": "off",
|
||||||
"complexity": "off",
|
"complexity": "off",
|
||||||
|
"unicorn/no-array-reduce": "off",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* @copyright NHCarrigan
|
||||||
|
* @license Naomi's Public License
|
||||||
|
* @author Naomi Carrigan
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { mutation } from "./main.js";
|
||||||
|
|
||||||
|
describe("mutation", () => {
|
||||||
|
it("should return the correct result", () => {
|
||||||
|
expect(mutation([ "hello", "hey" ])).toBe(false);
|
||||||
|
expect(mutation([ "hello", "Hello" ])).toBe(true);
|
||||||
|
expect(mutation([ "zyxwvutsrqponmlkjihgfedcba", "qrstu" ])).toBe(true);
|
||||||
|
expect(mutation([ "Mary", "Army" ])).toBe(true);
|
||||||
|
expect(mutation([ "Mary", "Aarmy" ])).toBe(true);
|
||||||
|
expect(mutation([ "Alien", "line" ])).toBe(true);
|
||||||
|
expect(mutation([ "floor", "for" ])).toBe(true);
|
||||||
|
expect(mutation([ "hello", "neo" ])).toBe(false);
|
||||||
|
expect(mutation([ "voodoo", "no" ])).toBe(false);
|
||||||
|
expect(mutation([ "ate", "date" ])).toBe(false);
|
||||||
|
expect(mutation([ "Tiger", "Zebra" ])).toBe(false);
|
||||||
|
expect(mutation([ "Noel", "Ole" ])).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* @copyright NHCarrigan
|
||||||
|
* @license Naomi's Public License
|
||||||
|
* @author Naomi Carrigan
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the second string can be constructed from only the letters found in the first string.
|
||||||
|
* @param array - An array containing two strings.
|
||||||
|
* @param array."0" - The first string.
|
||||||
|
* @param array."1" - The second string.
|
||||||
|
* @returns True if the second string can be constructed from only the letters found in the first string, false otherwise.
|
||||||
|
* @see https://www.freecodecamp.org/learn/javascript-v9/lab-mutations/implement-the-mutations-algorithm
|
||||||
|
*/
|
||||||
|
export const mutation = ([ first, second ]: [ string, string ]): boolean => {
|
||||||
|
return [ ...second.
|
||||||
|
toLowerCase() ].
|
||||||
|
every((letter) => {
|
||||||
|
return first.toLowerCase().includes(letter);
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* @copyright NHCarrigan
|
||||||
|
* @license Naomi's Public License
|
||||||
|
* @author Naomi Carrigan
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { countCharacters } from "./main.js";
|
||||||
|
|
||||||
|
describe("countCharacters", () => {
|
||||||
|
it("should return the correct count of characters", () => {
|
||||||
|
expect(countCharacters("hello world")).toStrictEqual([
|
||||||
|
"d 1",
|
||||||
|
"e 1",
|
||||||
|
"h 1",
|
||||||
|
"l 3",
|
||||||
|
"o 2",
|
||||||
|
"r 1",
|
||||||
|
"w 1",
|
||||||
|
]);
|
||||||
|
expect(countCharacters("I love coding challenges!")).toStrictEqual([
|
||||||
|
"a 1",
|
||||||
|
"c 2",
|
||||||
|
"d 1",
|
||||||
|
"e 3",
|
||||||
|
"g 2",
|
||||||
|
"h 1",
|
||||||
|
"i 2",
|
||||||
|
"l 3",
|
||||||
|
"n 2",
|
||||||
|
"o 2",
|
||||||
|
"s 1",
|
||||||
|
"v 1",
|
||||||
|
]);
|
||||||
|
expect(
|
||||||
|
countCharacters("// TODO: Complete this challenge ASAP!"),
|
||||||
|
).toStrictEqual([
|
||||||
|
"a 3",
|
||||||
|
"c 2",
|
||||||
|
"d 1",
|
||||||
|
"e 4",
|
||||||
|
"g 1",
|
||||||
|
"h 2",
|
||||||
|
"i 1",
|
||||||
|
"l 3",
|
||||||
|
"m 1",
|
||||||
|
"n 1",
|
||||||
|
"o 3",
|
||||||
|
"p 2",
|
||||||
|
"s 2",
|
||||||
|
"t 3",
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* @copyright NHCarrigan
|
||||||
|
* @license Naomi's Public License
|
||||||
|
* @author Naomi Carrigan
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a sentence string, return an array with a count of each character in alphabetical order.
|
||||||
|
* @param sentence - The sentence to count the characters in.
|
||||||
|
* @returns An object with the number of characters in the sentence.
|
||||||
|
* @see https://www.freecodecamp.org/learn/daily-coding-challenge/2025-11-23
|
||||||
|
*/
|
||||||
|
export const countCharacters = (sentence: string): Array<string> => {
|
||||||
|
return Object.entries([ ...sentence.toLowerCase().replaceAll(/[^a-z]/g, "") ].
|
||||||
|
reduce((accumulator, char): Record<string, number> => {
|
||||||
|
accumulator[char] = (accumulator[char] ?? 0) + 1;
|
||||||
|
return accumulator;
|
||||||
|
}, {})).
|
||||||
|
map(([ char, count ]) => {
|
||||||
|
return `${char} ${count.toString()}`;
|
||||||
|
}).
|
||||||
|
sort((a, b) => {
|
||||||
|
return a.localeCompare(b);
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* @copyright NHCarrigan
|
||||||
|
* @license Naomi's Public License
|
||||||
|
* @author Naomi Carrigan
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { validateMessage } from "./main.js";
|
||||||
|
|
||||||
|
describe("validateMessage", () => {
|
||||||
|
it("should return the correct validation result", () => {
|
||||||
|
expect(validateMessage("hello world", "hw")).toBe(true);
|
||||||
|
expect(validateMessage("ALL CAPITAL LETTERS", "acl")).toBe(true);
|
||||||
|
expect(validateMessage("Coding challenge are boring.", "cca")).toBe(false);
|
||||||
|
expect(
|
||||||
|
validateMessage(
|
||||||
|
"The quick brown fox jumps over the lazy dog.",
|
||||||
|
"TQBFJOTLD",
|
||||||
|
),
|
||||||
|
).toBe(true);
|
||||||
|
expect(
|
||||||
|
validateMessage(
|
||||||
|
"The quick brown fox jumps over the lazy dog.",
|
||||||
|
"TQBFJOTLDT",
|
||||||
|
),
|
||||||
|
).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* @copyright NHCarrigan
|
||||||
|
* @license Naomi's Public License
|
||||||
|
* @author Naomi Carrigan
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a message string and a validation string, determine if the message is valid.
|
||||||
|
* @param message - The message to validate.
|
||||||
|
* @param validator - The validator to use.
|
||||||
|
* @returns True if the message is valid, false otherwise.
|
||||||
|
* @see https://www.freecodecamp.org/learn/daily-coding-challenge/2025-11-24
|
||||||
|
*/
|
||||||
|
export const validateMessage = (
|
||||||
|
message: string,
|
||||||
|
validator: string,
|
||||||
|
): boolean => {
|
||||||
|
const messageLetters = message.
|
||||||
|
toLowerCase().
|
||||||
|
split(/\s+/g).
|
||||||
|
map((word) => {
|
||||||
|
return word[0];
|
||||||
|
});
|
||||||
|
const validatorLetters = [ ...validator.toLowerCase() ];
|
||||||
|
return messageLetters.every((letter, index) => {
|
||||||
|
return letter === validatorLetters[index];
|
||||||
|
}) && messageLetters.length === validatorLetters.length;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user