generated from nhcarrigan/template
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { fizzBuzz } from "./main.js";
|
||||
|
||||
describe("fizzBuzz", () => {
|
||||
it("should return the correct FizzBuzz array", () => {
|
||||
expect(fizzBuzz(2)).toStrictEqual([ 1, 2 ]);
|
||||
expect(fizzBuzz(4)).toStrictEqual([ 1, 2, "Fizz", 4 ]);
|
||||
expect(fizzBuzz(8)).
|
||||
toStrictEqual([ 1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8 ]);
|
||||
expect(fizzBuzz(20)).toStrictEqual([
|
||||
1,
|
||||
2,
|
||||
"Fizz",
|
||||
4,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
7,
|
||||
8,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
11,
|
||||
"Fizz",
|
||||
13,
|
||||
14,
|
||||
"FizzBuzz",
|
||||
16,
|
||||
17,
|
||||
"Fizz",
|
||||
19,
|
||||
"Buzz",
|
||||
]);
|
||||
expect(fizzBuzz(50)).toStrictEqual([
|
||||
1,
|
||||
2,
|
||||
"Fizz",
|
||||
4,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
7,
|
||||
8,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
11,
|
||||
"Fizz",
|
||||
13,
|
||||
14,
|
||||
"FizzBuzz",
|
||||
16,
|
||||
17,
|
||||
"Fizz",
|
||||
19,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
22,
|
||||
23,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
26,
|
||||
"Fizz",
|
||||
28,
|
||||
29,
|
||||
"FizzBuzz",
|
||||
31,
|
||||
32,
|
||||
"Fizz",
|
||||
34,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
37,
|
||||
38,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
41,
|
||||
"Fizz",
|
||||
43,
|
||||
44,
|
||||
"FizzBuzz",
|
||||
46,
|
||||
47,
|
||||
"Fizz",
|
||||
49,
|
||||
"Buzz",
|
||||
]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
const getString = (number: number): string | number => {
|
||||
if (number % 3 === 0 && number % 5 === 0) {
|
||||
return "FizzBuzz";
|
||||
}
|
||||
if (number % 3 === 0) {
|
||||
return "Fizz";
|
||||
}
|
||||
if (number % 5 === 0) {
|
||||
return "Buzz";
|
||||
}
|
||||
return number;
|
||||
};
|
||||
|
||||
/**
|
||||
* Given an integer (n), return an array of integers from 1 to n (inclusive), replacing numbers that are multiple of.
|
||||
* @param n - The integer to generate the FizzBuzz array for.
|
||||
* @returns An array of integers from 1 to n (inclusive), replacing numbers that are multiple of 3 with "Fizz", numbers that are multiple of 5 with "Buzz", and numbers that are multiple of both 3 and 5 with "FizzBuzz".
|
||||
* @see https://www.freecodecamp.org/learn/daily-coding-challenge/2025-11-25
|
||||
*/
|
||||
export const fizzBuzz = (
|
||||
n: number,
|
||||
): Array<string | number> => {
|
||||
return Array.from({ length: n }, (_, index) => {
|
||||
return getString(index + 1);
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,124 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { isFizzBuzz } from "./main.js";
|
||||
|
||||
describe("isFizzBuzz", () => {
|
||||
it("should return the correct result", () => {
|
||||
expect(isFizzBuzz([ 1, 2, "Fizz", 4 ])).toBe(true);
|
||||
expect(isFizzBuzz([ 1, 2, 3, 4 ])).toBe(false);
|
||||
expect(isFizzBuzz([ 1, 2, "Fizz", 4, "Buzz", 7 ])).toBe(false);
|
||||
expect(
|
||||
isFizzBuzz([
|
||||
1,
|
||||
2,
|
||||
"Fizz",
|
||||
4,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
7,
|
||||
8,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
11,
|
||||
"Fizz",
|
||||
13,
|
||||
"FizzBuzz",
|
||||
]),
|
||||
).toBe(false);
|
||||
expect(
|
||||
isFizzBuzz([
|
||||
1,
|
||||
2,
|
||||
"Fizz",
|
||||
4,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
7,
|
||||
8,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
11,
|
||||
"Fizz",
|
||||
13,
|
||||
"Fizz",
|
||||
]),
|
||||
).toBe(false);
|
||||
expect(
|
||||
isFizzBuzz([
|
||||
1,
|
||||
2,
|
||||
"Fizz",
|
||||
4,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
7,
|
||||
8,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
11,
|
||||
"Fizz",
|
||||
13,
|
||||
"Buzz",
|
||||
]),
|
||||
).toBe(false);
|
||||
expect(
|
||||
isFizzBuzz([
|
||||
1,
|
||||
2,
|
||||
"Fizz",
|
||||
4,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
7,
|
||||
8,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
11,
|
||||
"Fizz",
|
||||
13,
|
||||
14,
|
||||
"FizzBuzz",
|
||||
16,
|
||||
17,
|
||||
"Fizz",
|
||||
19,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
22,
|
||||
23,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
26,
|
||||
"Fizz",
|
||||
28,
|
||||
29,
|
||||
"FizzBuzz",
|
||||
31,
|
||||
32,
|
||||
"Fizz",
|
||||
34,
|
||||
"Buzz",
|
||||
"Fizz",
|
||||
37,
|
||||
38,
|
||||
"Fizz",
|
||||
"Buzz",
|
||||
41,
|
||||
"Fizz",
|
||||
43,
|
||||
44,
|
||||
"FizzBuzz",
|
||||
46,
|
||||
47,
|
||||
"Fizz",
|
||||
49,
|
||||
"Buzz",
|
||||
]),
|
||||
).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
const getString = (number: number): string | number => {
|
||||
if (number % 3 === 0 && number % 5 === 0) {
|
||||
return "FizzBuzz";
|
||||
}
|
||||
if (number % 3 === 0) {
|
||||
return "Fizz";
|
||||
}
|
||||
if (number % 5 === 0) {
|
||||
return "Buzz";
|
||||
}
|
||||
return number;
|
||||
};
|
||||
|
||||
/**
|
||||
* Given an array, determine if it is a correct FizzBuzz sequence from 1 to the last item in the array.
|
||||
* @param array - The array to check if it is a correct FizzBuzz sequence.
|
||||
* @returns True if the array is a correct FizzBuzz sequence, false otherwise.
|
||||
* @see https://www.freecodecamp.org/learn/daily-coding-challenge/2025-11-26
|
||||
*/
|
||||
export const isFizzBuzz = (
|
||||
array: Array<string | number>,
|
||||
): boolean => {
|
||||
return array.every((item, index) => {
|
||||
return item === getString(index + 1);
|
||||
});
|
||||
};
|
||||
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
/**
|
||||
* 1. CalculateAge("2000-11-20") should return 25.
|
||||
* 2. CalculateAge("2000-12-01") should return 24.
|
||||
* 3. CalculateAge("2014-10-25") should return 11.
|
||||
* 4. CalculateAge("1994-01-06") should return 31.
|
||||
* 5. CalculateAge("1994-12-14") should return 30.
|
||||
*/
|
||||
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { calculateAge } from "./main.js";
|
||||
|
||||
describe("calculateAge", () => {
|
||||
it("should return the correct result", () => {
|
||||
expect(calculateAge("2000-11-20")).toBe(25);
|
||||
expect(calculateAge("2000-12-01")).toBe(24);
|
||||
expect(calculateAge("2014-10-25")).toBe(11);
|
||||
expect(calculateAge("1994-01-06")).toBe(31);
|
||||
expect(calculateAge("1994-12-14")).toBe(30);
|
||||
});
|
||||
|
||||
it("should throw an error if the birthday date is invalid", () => {
|
||||
expect(() => {
|
||||
return calculateAge("");
|
||||
}).toThrow(TypeError);
|
||||
expect(() => {
|
||||
return calculateAge("2000");
|
||||
}).toThrow(TypeError);
|
||||
expect(() => {
|
||||
return calculateAge("2000-11");
|
||||
}).toThrow(TypeError);
|
||||
expect(() => {
|
||||
return calculateAge("a-11-11");
|
||||
}).toThrow(TypeError);
|
||||
expect(() => {
|
||||
return calculateAge("11-b-11");
|
||||
}).toThrow(TypeError);
|
||||
expect(() => {
|
||||
return calculateAge("11-11-c");
|
||||
}).toThrow(TypeError);
|
||||
expect(() => {
|
||||
return calculateAge("11-11-11-dfjdalkjfs");
|
||||
}).toThrow(TypeError);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,51 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
/**
|
||||
* Given the date of someone's birthday in the format YYYY-MM-DD, return the person's age as of November 27th, 2025.
|
||||
* @param birthday - The date of someone's birthday in the format YYYY-MM-DD.
|
||||
* @returns The person's age as of November 27th, 2025.
|
||||
* @throws {TypeError} If the birthday date is invalid.
|
||||
* @see https://www.freecodecamp.org/learn/daily-coding-challenge/2025-11-27
|
||||
*/
|
||||
export const calculateAge = (birthday: string): number => {
|
||||
const [ year, month, day ] = birthday.split("-").map(Number);
|
||||
if (
|
||||
year === undefined
|
||||
|| month === undefined
|
||||
|| day === undefined
|
||||
|| Number.isNaN(year)
|
||||
|| Number.isNaN(month)
|
||||
|| Number.isNaN(day)
|
||||
) {
|
||||
throw new TypeError("Invalid birthday date");
|
||||
}
|
||||
|
||||
const parsed = new Date(`${birthday}T00:00:00Z`);
|
||||
if (
|
||||
Number.isNaN(parsed.getTime())
|
||||
|| parsed.getUTCFullYear() !== year
|
||||
|| parsed.getUTCMonth() + 1 !== month
|
||||
|| parsed.getUTCDate() !== day
|
||||
) {
|
||||
throw new TypeError("Invalid birthday date");
|
||||
}
|
||||
|
||||
const referenceYear = 2025;
|
||||
const referenceMonth = 11;
|
||||
const referenceDay = 27;
|
||||
|
||||
const isLaterMonth = month > referenceMonth;
|
||||
const isSameMonth = month === referenceMonth;
|
||||
const isLaterDay = day > referenceDay;
|
||||
const isLaterDayInSameMonth = isSameMonth && isLaterDay;
|
||||
const hasUpcomingBirthday = isLaterMonth || isLaterDayInSameMonth;
|
||||
const birthdayAdjustment = hasUpcomingBirthday
|
||||
? 1
|
||||
: 0;
|
||||
|
||||
return referenceYear - year - birthdayAdjustment;
|
||||
};
|
||||
Reference in New Issue
Block a user