From 4c07a4e21973de5c917004e9a7196faa4978764c Mon Sep 17 00:00:00 2001
From: Tom <20648924+moT01@users.noreply.github.com>
Date: Wed, 5 Nov 2025 14:58:25 -0600
Subject: [PATCH] feat(curriculum): daily challenges 100-109 (#63406)
---
.../68ffb91507a5b645769328c3.md | 65 ++++++++++
.../68ffb91507a5b645769328c4.md | 95 ++++++++++++++
.../68ffb91507a5b645769328c5.md | 82 +++++++++++++
.../68ffb91507a5b645769328c6.md | 71 +++++++++++
.../68ffb91507a5b645769328c7.md | 66 ++++++++++
.../68ffb91507a5b645769328c8.md | 65 ++++++++++
.../68ffb91507a5b645769328c9.md | 75 +++++++++++
.../68ffb91507a5b645769328ca.md | 77 ++++++++++++
.../68ffb91507a5b645769328cb.md | 86 +++++++++++++
.../68ffb91507a5b645769328cc.md | 78 ++++++++++++
.../68ffb91507a5b645769328c3.md | 76 ++++++++++++
.../68ffb91507a5b645769328c4.md | 116 ++++++++++++++++++
.../68ffb91507a5b645769328c5.md | 97 +++++++++++++++
.../68ffb91507a5b645769328c6.md | 83 +++++++++++++
.../68ffb91507a5b645769328c7.md | 84 +++++++++++++
.../68ffb91507a5b645769328c8.md | 67 ++++++++++
.../68ffb91507a5b645769328c9.md | 87 +++++++++++++
.../68ffb91507a5b645769328ca.md | 88 +++++++++++++
.../68ffb91507a5b645769328cb.md | 108 ++++++++++++++++
.../68ffb91507a5b645769328cc.md | 87 +++++++++++++
.../daily-coding-challenges-javascript.json | 40 ++++++
.../daily-coding-challenges-python.json | 40 ++++++
.../daily-challenges/seed-daily-challenges.ts | 2 +-
23 files changed, 1734 insertions(+), 1 deletion(-)
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c3.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c4.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c5.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c6.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c7.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c8.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c9.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328ca.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328cb.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328cc.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c3.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c4.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c5.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c6.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c7.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c8.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c9.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328ca.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328cb.md
create mode 100644 curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328cc.md
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c3.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c3.md
new file mode 100644
index 00000000000..027458d96c1
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c3.md
@@ -0,0 +1,65 @@
+---
+id: 68ffb91507a5b645769328c3
+title: "Challenge 100: 100 Characters"
+challengeType: 28
+dashedName: challenge-100
+---
+
+# --description--
+
+Welcome to the 100th Daily Coding Challenge!
+
+Given a string, repeat its characters until the result is exactly 100 characters long. If your repetitions go over 100 characters, trim the extra so it's exactly 100.
+
+# --hints--
+
+`oneHundred("One hundred ")` should return `"One hundred One hundred One hundred One hundred One hundred One hundred One hundred One hundred One "`.
+
+```js
+assert.equal(oneHundred("One hundred "), "One hundred One hundred One hundred One hundred One hundred One hundred One hundred One hundred One ");
+```
+
+`oneHundred("freeCodeCamp ")` should return `"freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeC"`.
+
+```js
+assert.equal(oneHundred("freeCodeCamp "), "freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeC");
+```
+
+`oneHundred("daily challenges ")` should return `"daily challenges daily challenges daily challenges daily challenges daily challenges daily challenge"`.
+
+```js
+assert.equal(oneHundred("daily challenges "), "daily challenges daily challenges daily challenges daily challenges daily challenges daily challenge");
+```
+
+`oneHundred("!")` should return `"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"`.
+
+```js
+assert.equal(oneHundred("!"), "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function oneHundred(chars) {
+
+ return chars;
+}
+```
+
+# --solutions--
+
+```js
+function oneHundred(chars) {
+ let result = "";
+ let i = 0;
+
+ while (result.length < 100) {
+ result += chars[i % chars.length];
+ i++;
+ }
+
+ return result.slice(0, 100);
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c4.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c4.md
new file mode 100644
index 00000000000..9e8b1a1a9d9
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c4.md
@@ -0,0 +1,95 @@
+---
+id: 68ffb91507a5b645769328c4
+title: "Challenge 101: Markdown Heading Converter"
+challengeType: 28
+dashedName: challenge-101
+---
+
+# --description--
+
+Given a string representing a Markdown heading, return the equivalent HTML heading.
+
+A valid Markdown heading must:
+
+- Start with zero or more spaces, followed by
+- 1 to 6 hash characters (`#`) in a row, then
+- At least one space. And finally,
+- The heading text.
+
+The number of hash symbols determines the heading level. For example, one hash symbol corresponds to an `h1` tag, and six hash symbols correspond to an `h6` tag.
+
+If the given string doesn't have the exact format above, return `"Invalid format"`.
+
+For example, given `"# My level 1 heading"`, return `"
My level 1 heading
"`.
+
+Note: The console may not display HTML tags in strings when logging messages. Check the browser console to see logs with tags included.
+
+# --hints--
+
+`convert("# My level 1 heading")` should return `"My level 1 heading
"`.
+
+```js
+assert.equal(convert("# My level 1 heading"), "My level 1 heading
");
+```
+
+`convert("My heading")` should return `"Invalid format"`.
+
+```js
+assert.equal(convert("My heading"), "Invalid format");
+```
+
+`convert("##### My level 5 heading")` should return `"My level 5 heading
"`.
+
+```js
+assert.equal(convert("##### My level 5 heading"), "My level 5 heading
");
+```
+
+`convert("#My heading")` should return `"Invalid format"`.
+
+```js
+assert.equal(convert("#My heading"), "Invalid format");
+```
+
+`convert(" ### My level 3 heading")` should return `"My level 3 heading
"`.
+
+```js
+assert.equal(convert(" ### My level 3 heading"), "My level 3 heading
");
+```
+
+`convert("####### My level 7 heading")` should return `"Invalid format"`.
+
+```js
+assert.equal(convert("####### My level 7 heading"), "Invalid format");
+```
+
+`convert("## My #2 heading")` should return `"My #2 heading
"`.
+
+```js
+assert.equal(convert("## My #2 heading"), "My #2 heading
");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function convert(heading) {
+
+ return heading;
+}
+```
+
+# --solutions--
+
+```js
+function convert(heading) {
+ const trimmed = heading.trim()
+
+ if (!/^#{1,6}\s+\S+/.test(trimmed)) return "Invalid format"
+
+ const hashCount = trimmed.indexOf(' ');
+ const text = trimmed.slice(hashCount).trimStart();
+
+ return `${text}`;
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c5.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c5.md
new file mode 100644
index 00000000000..77d3ee12943
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c5.md
@@ -0,0 +1,82 @@
+---
+id: 68ffb91507a5b645769328c5
+title: "Challenge 102: Longest Word"
+challengeType: 28
+dashedName: challenge-102
+---
+
+# --description--
+
+Given a sentence string, return the longest word in the sentence.
+
+- Words are separated by a single space.
+- Only letters (`a-z`, case-insensitive) count toward the word's length.
+- If there are multiple words with the same length, return the first one that appears.
+- Return the word as it appears in the given string, with punctuation removed.
+
+# --hints--
+
+`longestWord("The quick red fox")` should return `"quick"`.
+
+```js
+assert.equal(longestWord("The quick red fox"), "quick");
+```
+
+`longestWord("Hello coding challenge.")` should return `"challenge"`.
+
+```js
+assert.equal(longestWord("Hello coding challenge."), "challenge");
+```
+
+`longestWord("Do Try This At Home.")` should return `"This"`.
+
+```js
+assert.equal(longestWord("Do Try This At Home."), "This");
+```
+
+`longestWord("This sentence... has commas, ellipses, and an exlamation point!")` should return `"exlamation"`.
+
+```js
+assert.equal(longestWord("This sentence... has commas, ellipses, and an exlamation point!"), "exlamation");
+```
+
+`longestWord("A tie? No way!")` should return `"tie"`.
+
+```js
+assert.equal(longestWord("A tie? No way!"), "tie");
+```
+
+`longestWord("Wouldn't you like to know.")` should return `"Wouldnt"`.
+
+```js
+assert.equal(longestWord("Wouldn't you like to know."), "Wouldnt");
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function longestWord(sentence) {
+
+ return sentence;
+}
+```
+
+# --solutions--
+
+```js
+function longestWord(sentence) {
+ const words = sentence.split(" ");
+ let longest = "";
+
+ for (let word of words) {
+ const cleaned = word.replace(/[^a-z]/gi, "");
+ if (cleaned.length > longest.length) {
+ longest = cleaned;
+ }
+ }
+
+ return longest;
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c6.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c6.md
new file mode 100644
index 00000000000..8044f8ad7f0
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c6.md
@@ -0,0 +1,71 @@
+---
+id: 68ffb91507a5b645769328c6
+title: "Challenge 103: LCM"
+challengeType: 28
+dashedName: challenge-103
+---
+
+# --description--
+
+Given two integers, return the least common multiple (LCM) of the two numbers.
+
+The LCM of two numbers is the smallest positive integer that is a multiple of both numbers. For example, given `4` and `6`, return `12` because:
+
+- Multiples of `4` are `4`, `8`, `12` and so on.
+- Multplies of `6` are `6`, `12`, `18` and so on.
+- `12` is the smallest number that is a multiple of both.
+
+# --hints--
+
+`lcm(4, 6)` should return `12`.
+
+```js
+assert.equal(lcm(4, 6), 12);
+```
+
+`lcm(9, 6)` should return `18`.
+
+```js
+assert.equal(lcm(9, 6), 18);
+```
+
+`lcm(10, 100)` should return `100`.
+
+```js
+assert.equal(lcm(10, 100), 100);
+```
+
+`lcm(13, 17)` should return `221`.
+
+```js
+assert.equal(lcm(13, 17), 221);
+```
+
+`lcm(45, 70)` should return `630`.
+
+```js
+assert.equal(lcm(45, 70), 630);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function lcm(a, b) {
+
+ return a;
+}
+```
+
+# --solutions--
+
+```js
+function lcm(a, b) {
+ function gcd(x, y) {
+ return y === 0 ? x : gcd(y, x % y);
+ }
+
+ return Math.abs(a * b) / gcd(a, b);
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c7.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c7.md
new file mode 100644
index 00000000000..0c3bd5d16bf
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c7.md
@@ -0,0 +1,66 @@
+---
+id: 68ffb91507a5b645769328c7
+title: "Challenge 104: Recipe Scaler"
+challengeType: 28
+dashedName: challenge-104
+---
+
+# --description--
+
+Given an array of recipe ingredients and a number to scale the recipe, return a an array with the quantities scaled accordingly.
+
+- Each item in the given array will be a string in the format: `"quantity unit ingredient"`. For example `"2 C Flour"`.
+- Scale the quantity by the given number. Do not include any trailing zeros and do not convert any units.
+- Return the scaled items in the same order they are given.
+
+# --hints--
+
+`scaleRecipe(["2 C Flour", "1.5 T Sugar"], 2)` should return `["4 C Flour", "3 T Sugar"]`.
+
+```js
+assert.deepEqual(scaleRecipe(["2 C Flour", "1.5 T Sugar"], 2), ["4 C Flour", "3 T Sugar"]);
+```
+
+`scaleRecipe(["4 T Flour", "1 C Milk", "2 T Oil"], 1.5)` should return `["6 T Flour", "1.5 C Milk", "3 T Oil"]`.
+
+```js
+assert.deepEqual(scaleRecipe(["4 T Flour", "1 C Milk", "2 T Oil"], 1.5), ["6 T Flour", "1.5 C Milk", "3 T Oil"]);
+```
+
+`scaleRecipe(["3 C Milk", "2 C Oats"], 0.5)` should return `["1.5 C Milk", "1 C Oats"]`.
+
+```js
+assert.deepEqual(scaleRecipe(["3 C Milk", "2 C Oats"], 0.5), ["1.5 C Milk", "1 C Oats"]);
+```
+
+`scaleRecipe(["2 C All-purpose Flour", "1 t Baking Soda", "1 t Salt", "1 C Butter", "0.5 C Sugar", "0.5 C Brown Sugar", "1 t Vanilla Extract", "2 C Chocolate Chips"], 2.5)` should return `["5 C All-purpose Flour", "2.5 t Baking Soda", "2.5 t Salt", "2.5 C Butter", "1.25 C Sugar", "1.25 C Brown Sugar", "2.5 t Vanilla Extract", "5 C Chocolate Chips"]`.
+
+```js
+assert.deepEqual(scaleRecipe(["2 C All-purpose Flour", "1 t Baking Soda", "1 t Salt", "1 C Butter", "0.5 C Sugar", "0.5 C Brown Sugar", "1 t Vanilla Extract", "2 C Chocolate Chips"], 2.5), ["5 C All-purpose Flour", "2.5 t Baking Soda", "2.5 t Salt", "2.5 C Butter", "1.25 C Sugar", "1.25 C Brown Sugar", "2.5 t Vanilla Extract", "5 C Chocolate Chips"]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function scaleRecipe(ingredients, scale) {
+
+ return ingredients;
+}
+```
+
+# --solutions--
+
+```js
+function scaleRecipe(ingredients, scale) {
+ return ingredients.map(item => {
+ const [quantityStr, unit, ...rest] = item.split(" ");
+ const ingredientName = rest.join(" ");
+
+ const quantity = parseFloat(quantityStr) * scale;
+
+ return `${quantity} ${unit} ${ingredientName}`;
+ });
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c8.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c8.md
new file mode 100644
index 00000000000..7be5b9dc7db
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c8.md
@@ -0,0 +1,65 @@
+---
+id: 68ffb91507a5b645769328c8
+title: "Challenge 105: Character Count"
+challengeType: 28
+dashedName: challenge-105
+---
+
+# --description--
+
+Given a sentence string, return an array with a count of each character in alphabetical order.
+
+- Treat upper and lowercase letters as the same letter when counting.
+- Ignore numbers, spaces, punctuation, etc.
+- Return the count and letter in the format `"letter count"`. For instance, `"a 3"`.
+- All returned letters should be lowercase.
+- Do not return a count of letters that are not in the given string.
+
+# --hints--
+
+`countCharacters("hello world")` should return `["d 1", "e 1", "h 1", "l 3", "o 2", "r 1", "w 1"]`.
+
+```js
+assert.deepEqual(countCharacters("hello world"), ["d 1", "e 1", "h 1", "l 3", "o 2", "r 1", "w 1"]);
+```
+
+`countCharacters("I love coding challenges!")` should return `["a 1", "c 2", "d 1", "e 3", "g 2", "h 1", "i 2", "l 3", "n 2", "o 2", "s 1", "v 1"]`.
+
+```js
+assert.deepEqual(countCharacters("I love coding challenges!"), ["a 1", "c 2", "d 1", "e 3", "g 2", "h 1", "i 2", "l 3", "n 2", "o 2", "s 1", "v 1"]);
+```
+
+`countCharacters("// TODO: Complete this challenge ASAP!")` should return `["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"]`.
+
+```js
+assert.deepEqual(countCharacters("// TODO: Complete this challenge ASAP!"), ["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"]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function countCharacters(sentence) {
+
+ return sentence;
+}
+```
+
+# --solutions--
+
+```js
+function countCharacters(sentence) {
+ const counts = {};
+
+ for (let char of sentence.toLowerCase()) {
+ if (char >= "a" && char <= "z") {
+ counts[char] = (counts[char] || 0) + 1;
+ }
+ }
+
+ return Object.keys(counts)
+ .sort()
+ .map(letter => `${letter} ${counts[letter]}`);
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c9.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c9.md
new file mode 100644
index 00000000000..f8624f82433
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328c9.md
@@ -0,0 +1,75 @@
+---
+id: 68ffb91507a5b645769328c9
+title: "Challenge 106: Message Validator"
+challengeType: 28
+dashedName: challenge-106
+---
+
+# --description--
+
+Given a message string and a validation string, determine if the message is valid.
+
+- A message is valid if each word in the message starts with the corresponding letter in the validation string, in order.
+- Letters are case-insensitive.
+- Words in the message are separated by single spaces.
+
+# --hints--
+
+`isValidMessage("hello world", "hw")` should return `true`.
+
+```js
+assert.isTrue(isValidMessage("hello world", "hw"));
+```
+
+`isValidMessage("ALL CAPITAL LETTERS", "acl")` should return `true`.
+
+```js
+assert.isTrue(isValidMessage("ALL CAPITAL LETTERS", "acl"));
+```
+
+`isValidMessage("Coding challenge are boring.", "cca")` should return `false`.
+
+```js
+assert.isFalse(isValidMessage("Coding challenge are boring.", "cca"));
+```
+
+`isValidMessage("The quick brown fox jumps over the lazy dog.", "TQBFJOTLD")` should return `true`.
+
+```js
+assert.isTrue(isValidMessage("The quick brown fox jumps over the lazy dog.", "TQBFJOTLD"));
+```
+
+`isValidMessage("The quick brown fox jumps over the lazy dog.", "TQBFJOTLDT")` should return `false`.
+
+```js
+assert.isFalse(isValidMessage("The quick brown fox jumps over the lazy dog.", "TQBFJOTLDT"));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function isValidMessage(message, validator) {
+
+ return message;
+}
+```
+
+# --solutions--
+
+```js
+function isValidMessage(message, validation) {
+ const words = message.split(" ");
+
+ if (words.length !== validation.length) return false;
+
+ for (let i = 0; i < words.length; i++) {
+ if (words[i][0].toLowerCase() !== validation[i].toLowerCase()) {
+ return false;
+ }
+ }
+
+ return true;
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328ca.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328ca.md
new file mode 100644
index 00000000000..6f4bbb71f44
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328ca.md
@@ -0,0 +1,77 @@
+---
+id: 68ffb91507a5b645769328ca
+title: "Challenge 107: FizzBuzz"
+challengeType: 28
+dashedName: challenge-107
+---
+
+# --description--
+
+Given an integer (`n`), return an array of integers from `1` to `n` (inclusive), replacing numbers that a multiple of:
+
+- 3 with `"Fizz"`.
+- 5 with `"Buzz"`.
+- 3 and 5 with `"FizzBuzz"`.
+
+# --hints--
+
+`fizzBuzz(2)` should return `[1, 2]`.
+
+```js
+assert.deepEqual(fizzBuzz(2), [1, 2]);
+```
+
+`fizzBuzz(4)` should return `[1, 2, "Fizz", 4]`.
+
+```js
+assert.deepEqual(fizzBuzz(4), [1, 2, "Fizz", 4]);
+```
+
+`fizzBuzz(8)` should return `[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8]`.
+
+```js
+assert.deepEqual(fizzBuzz(8), [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8]);
+```
+
+`fizzBuzz(20)` should return `[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"]`.
+
+```js
+assert.deepEqual(fizzBuzz(20), [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"]);
+```
+
+`fizzBuzz(50)` should return `[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"]`.
+
+```js
+assert.deepEqual(fizzBuzz(50), [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"]);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function fizzBuzz(n) {
+
+ return n;
+}
+```
+
+# --solutions--
+
+```js
+function fizzBuzz(n) {
+ const result = [];
+ for (let i = 1; i <= n; i++) {
+ if (i % 15 === 0) {
+ result.push("FizzBuzz");
+ } else if (i % 3 === 0) {
+ result.push("Fizz");
+ } else if (i % 5 === 0) {
+ result.push("Buzz");
+ } else {
+ result.push(i);
+ }
+ }
+ return result;
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328cb.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328cb.md
new file mode 100644
index 00000000000..c6baf34a80c
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328cb.md
@@ -0,0 +1,86 @@
+---
+id: 68ffb91507a5b645769328cb
+title: "Challenge 108: BuzzFizz"
+challengeType: 28
+dashedName: challenge-108
+---
+
+# --description--
+
+Given an array, determine if it is a correct FizzBuzz sequence from 1 to the last item in the array. A sequence is correct if:
+
+- Numbers that are multiples of 3 are replaced with "Fizz"
+- Numbers that are multiples of 5 are replaced with "Buzz"
+- Numbers that are multiples of both 3 and 5 are replaced with "FizzBuzz"
+- All other numbers remain as integers in ascending order, starting from 1.
+- The array must start at 1 and have no missing or extra elements.
+
+# --hints--
+
+`isFizzBuzz([1, 2, "Fizz", 4])` should return `true`.
+
+```js
+assert.isTrue(isFizzBuzz([1, 2, "Fizz", 4]));
+```
+
+`isFizzBuzz([1, 2, 3, 4])` should return `false`.
+
+```js
+assert.isFalse(isFizzBuzz([1, 2, 3, 4]));
+```
+
+`isFizzBuzz([1, 2, "Fizz", 4, "Buzz", 7])` should return `false`.
+
+```js
+assert.isFalse(isFizzBuzz([1, 2, "Fizz", 4, "Buzz", 7]));
+```
+
+`isFizzBuzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "FizzBuzz"])` should return `false`.
+
+```js
+assert.isFalse(isFizzBuzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "FizzBuzz"]));
+```
+
+`isFizzBuzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "Fizz"])` should return `false`.
+
+```js
+assert.isFalse(isFizzBuzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "Fizz"]));
+```
+
+`isFizzBuzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "Buzz"])` should return `false`.
+
+```js
+assert.isFalse(isFizzBuzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "Buzz"]));
+```
+
+`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"])` should return `true`.
+
+```js
+assert.isTrue(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"]));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function isFizzBuzz(sequence) {
+
+ return sequence;
+}
+```
+
+# --solutions--
+
+```js
+function isFizzBuzz(sequence) {
+ for (let i = 0; i < sequence.length; i++) {
+ const n = i + 1;
+ if (n % 15 === 0 && sequence[i] !== "FizzBuzz") return false;
+ if (n % 3 === 0 && n % 5 !== 0 && sequence[i] !== "Fizz") return false;
+ if (n % 5 === 0 && n % 3 !== 0 && sequence[i] !== "Buzz") return false;
+ if (n % 3 !== 0 && n % 5 !== 0 && sequence[i] !== n) return false;
+ }
+ return true;
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328cc.md b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328cc.md
new file mode 100644
index 00000000000..cfcb725527a
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-javascript/68ffb91507a5b645769328cc.md
@@ -0,0 +1,78 @@
+---
+id: 68ffb91507a5b645769328cc
+title: "Challenge 109: What's My Age Again?"
+challengeType: 28
+dashedName: challenge-109
+---
+
+# --description--
+
+Given the date of someone's birthday in the format `YYYY-MM-DD`, return the person's age as of November 27th, 2025.
+
+- Assume all birthdays are valid dates before November 27th, 2025.
+- Return the age as an integer.
+- Be sure to account for whether the person has already had their birthday in 2025.
+
+# --hints--
+
+`calculateAge("2000-11-20")` should return `25`.
+
+```js
+assert.equal(calculateAge("2000-11-20"), 25);
+```
+
+`calculateAge("2000-12-01")` should return `24`.
+
+```js
+assert.equal(calculateAge("2000-12-01"), 24);
+```
+
+`calculateAge("2014-10-25")` should return `11`.
+
+```js
+assert.equal(calculateAge("2014-10-25"), 11);
+```
+
+`calculateAge("1994-01-06")` should return `31`.
+
+```js
+assert.equal(calculateAge("1994-01-06"), 31);
+```
+
+`calculateAge("1994-12-14")` should return `30`.
+
+```js
+assert.equal(calculateAge("1994-12-14"), 30);
+```
+
+# --seed--
+
+## --seed-contents--
+
+```js
+function calculateAge(birthday) {
+
+ return birthday;
+}
+```
+
+# --solutions--
+
+```js
+function calculateAge(birthday) {
+ const today = new Date("2025-11-27");
+ const [year, month, day] = birthday.split("-").map(Number);
+ const birthDate = new Date(year, month - 1, day);
+
+ let age = today.getFullYear() - birthDate.getFullYear();
+
+ if (
+ today.getMonth() < birthDate.getMonth() ||
+ (today.getMonth() === birthDate.getMonth() && today.getDate() < birthDate.getDate())
+ ) {
+ age--;
+ }
+
+ return age;
+}
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c3.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c3.md
new file mode 100644
index 00000000000..e88a928dd94
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c3.md
@@ -0,0 +1,76 @@
+---
+id: 68ffb91507a5b645769328c3
+title: "Challenge 100: 100 Characters"
+challengeType: 29
+dashedName: challenge-100
+---
+
+# --description--
+
+Welcome to the 100th Daily Coding Challenge!
+
+Given a string, repeat its characters until the result is exactly 100 characters long. If your repetitions go over 100 characters, trim the extra so it's exactly 100.
+
+# --hints--
+
+`one_hundred("One hundred ")` should return `"One hundred One hundred One hundred One hundred One hundred One hundred One hundred One hundred One "`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(one_hundred("One hundred "), "One hundred One hundred One hundred One hundred One hundred One hundred One hundred One hundred One ")`)
+}})
+```
+
+`one_hundred("freeCodeCamp ")` should return `"freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeC"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(one_hundred("freeCodeCamp "), "freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeCamp freeCodeC")`)
+}})
+```
+
+`one_hundred("daily challenges ")` should return `"daily challenges daily challenges daily challenges daily challenges daily challenges daily challenge"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(one_hundred("daily challenges "), "daily challenges daily challenges daily challenges daily challenges daily challenges daily challenge")`)
+}})
+```
+
+`one_hundred("!")` should return `"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(one_hundred("!"), "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")`)
+}})
+```
+
+
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def one_hundred(chars):
+
+ return chars
+```
+
+# --solutions--
+
+```py
+def one_hundred(chars):
+ result = ""
+ i = 0
+
+ while len(result) < 100:
+ result += chars[i % len(chars)]
+ i += 1
+
+ return result[:100]
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c4.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c4.md
new file mode 100644
index 00000000000..387eb339420
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c4.md
@@ -0,0 +1,116 @@
+---
+id: 68ffb91507a5b645769328c4
+title: "Challenge 101: Markdown Heading Converter"
+challengeType: 29
+dashedName: challenge-101
+---
+
+# --description--
+
+Given a string representing a Markdown heading, return the equivalent HTML heading.
+
+A valid Markdown heading must:
+
+- Start with zero or more spaces, followed by
+- 1 to 6 hash characters (`#`) in a row, then
+- At least one space. And finally,
+- The heading text.
+
+The number of hash symbols determines the heading level. For example, one hash symbol corresponds to an `h1` tag, and six hash symbols correspond to an `h6` tag.
+
+If the given string doesn't have the exact format above, return `"Invalid format"`.
+
+For example, given `"# My level 1 heading"`, return `"My level 1 heading
"`.
+
+Note: The console may not display HTML tags in strings when logging messages. Check the browser console to see logs with tags included.
+
+# --hints--
+
+`convert("# My level 1 heading")` should return `"My level 1 heading
"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(convert("# My level 1 heading"), "My level 1 heading
")`)
+}})
+```
+
+`convert("My heading")` should return `"Invalid format"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(convert("My heading"), "Invalid format")`)
+}})
+```
+
+`convert("##### My level 5 heading")` should return `"My level 5 heading
"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(convert("##### My level 5 heading"), "My level 5 heading
")`)
+}})
+```
+
+`convert("#My heading")` should return `"Invalid format"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(convert("#My heading"), "Invalid format")`)
+}})
+```
+
+`convert(" ### My level 3 heading")` should return `"My level 3 heading
"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(convert(" ### My level 3 heading"), "My level 3 heading
")`)
+}})
+```
+
+`convert("####### My level 7 heading")` should return `"Invalid format"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(convert("####### My level 7 heading"), "Invalid format")`)
+}})
+```
+
+`convert("## My #2 heading")` should return `"My #2 heading
"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(convert("## My #2 heading"), "My #2 heading
")`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def convert(heading):
+
+ return heading
+```
+
+# --solutions--
+
+```py
+import re
+def convert(heading):
+ trimmed = heading.strip()
+
+ if not re.match(r'^#{1,6}\s+\S+', trimmed):
+ return "Invalid format"
+
+ hash_count = trimmed.find(' ')
+ text = trimmed[hash_count:].lstrip()
+
+ return f"{text}"
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c5.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c5.md
new file mode 100644
index 00000000000..82541a23877
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c5.md
@@ -0,0 +1,97 @@
+---
+id: 68ffb91507a5b645769328c5
+title: "Challenge 102: Longest Word"
+challengeType: 29
+dashedName: challenge-102
+---
+
+# --description--
+
+Given a sentence string, return the longest word in the sentence.
+
+- Words are separated by a single space.
+- Only letters (`a-z`, case-insensitive) count toward the word's length.
+- If there are multiple words with the same length, return the first one that appears.
+- Return the word as it appears in the given string, with punctuation removed.
+
+# --hints--
+
+`longest_word("The quick red fox")` should return `"quick"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(longest_word("The quick red fox"), "quick")`)
+}})
+```
+
+`longest_word("Hello coding challenge.")` should return `"challenge"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(longest_word("Hello coding challenge."), "challenge")`)
+}})
+```
+
+`longest_word("Do Try This At Home.")` should return `"This"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(longest_word("Do Try This At Home."), "This")`)
+}})
+```
+
+`longest_word("This sentence... has commas, ellipses, and an exlamation point!")` should return `"exlamation"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(longest_word("This sentence... has commas, ellipses, and an exlamation point!"), "exlamation")`)
+}})
+```
+
+`longest_word("A tie? No way!")` should return `"tie"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(longest_word("A tie? No way!"), "tie")`)
+}})
+```
+
+`longest_word("Wouldn't you like to know.")` should return `"Wouldnt"`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(longest_word("Wouldn't you like to know."), "Wouldnt")`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def longest_word(sentence):
+
+ return sentence
+```
+
+# --solutions--
+
+```py
+import re
+def longest_word(sentence):
+ words = sentence.split(" ")
+ longest = ""
+
+ for word in words:
+ cleaned = re.sub(r'[^a-zA-Z]', '', word)
+ if len(cleaned) > len(longest):
+ longest = cleaned
+
+ return longest
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c6.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c6.md
new file mode 100644
index 00000000000..f782013cf33
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c6.md
@@ -0,0 +1,83 @@
+---
+id: 68ffb91507a5b645769328c6
+title: "Challenge 103: LCM"
+challengeType: 29
+dashedName: challenge-103
+---
+
+# --description--
+
+Given two integers, return the least common multiple (LCM) of the two numbers.
+
+The LCM of two numbers is the smallest positive integer that is a multiple of both numbers. For example, given `4` and `6`, return `12` because:
+
+- Multiples of `4` are `4`, `8`, `12` and so on.
+- Multplies of `6` are `6`, `12`, `18` and so on.
+- `12` is the smallest number that is a multiple of both.
+
+# --hints--
+
+`lcm(4, 6)` should return `12`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(lcm(4, 6), 12)`)
+}})
+```
+
+`lcm(9, 6)` should return `18`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(lcm(9, 6), 18)`)
+}})
+```
+
+`lcm(10, 100)` should return `100`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(lcm(10, 100), 100)`)
+}})
+```
+
+`lcm(13, 17)` should return `221`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(lcm(13, 17), 221)`)
+}})
+```
+
+`lcm(45, 70)` should return `630`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(lcm(45, 70), 630)`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def lcm(a, b):
+
+ return a
+```
+
+# --solutions--
+
+```py
+def lcm(a, b):
+ def gcd(x, y):
+ return x if y == 0 else gcd(y, x % y)
+
+ return abs(a * b) // gcd(a, b)
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c7.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c7.md
new file mode 100644
index 00000000000..c66138a143c
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c7.md
@@ -0,0 +1,84 @@
+---
+id: 68ffb91507a5b645769328c7
+title: "Challenge 104: Recipe Scaler"
+challengeType: 29
+dashedName: challenge-104
+---
+
+# --description--
+
+Given an array of recipe ingredients and a number to scale the recipe, return a an array with the quantities scaled accordingly.
+
+- Each item in the given array will be a string in the format: `"quantity unit ingredient"`. For example `"2 C Flour"`.
+- Scale the quantity by the given number. Do not include any trailing zeros and do not convert any units.
+- Return the scaled items in the same order they are given.
+
+# --hints--
+
+`scale_recipe(["2 C Flour", "1.5 T Sugar"], 2)` should return `["4 C Flour", "3 T Sugar"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(scale_recipe(["2 C Flour", "1.5 T Sugar"], 2), ["4 C Flour", "3 T Sugar"])`)
+}})
+```
+
+`scale_recipe(["4 T Flour", "1 C Milk", "2 T Oil"], 1.5)` should return `["6 T Flour", "1.5 C Milk", "3 T Oil"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(scale_recipe(["4 T Flour", "1 C Milk", "2 T Oil"], 1.5), ["6 T Flour", "1.5 C Milk", "3 T Oil"])`)
+}})
+```
+
+`scale_recipe(["3 C Milk", "2 C Oats"], 0.5)` should return `["1.5 C Milk", "1 C Oats"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(scale_recipe(["3 C Milk", "2 C Oats"], 0.5), ["1.5 C Milk", "1 C Oats"])`)
+}})
+```
+
+`scale_recipe(["2 C All-purpose Flour", "1 t Baking Soda", "1 t Salt", "1 C Butter", "0.5 C Sugar", "0.5 C Brown Sugar", "1 t Vanilla Extract", "2 C Chocolate Chips"], 2.5)` should return `["5 C All-purpose Flour", "2.5 t Baking Soda", "2.5 t Salt", "2.5 C Butter", "1.25 C Sugar", "1.25 C Brown Sugar", "2.5 t Vanilla Extract", "5 C Chocolate Chips"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(scale_recipe(["2 C All-purpose Flour", "1 t Baking Soda", "1 t Salt", "1 C Butter", "0.5 C Sugar", "0.5 C Brown Sugar", "1 t Vanilla Extract", "2 C Chocolate Chips"], 2.5), ["5 C All-purpose Flour", "2.5 t Baking Soda", "2.5 t Salt", "2.5 C Butter", "1.25 C Sugar", "1.25 C Brown Sugar", "2.5 t Vanilla Extract", "5 C Chocolate Chips"])`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def scale_recipe(ingredients, scale):
+
+ return ingredients
+```
+
+# --solutions--
+
+```py
+def scale_recipe(ingredients, scale):
+ scaled = []
+
+ for item in ingredients:
+ parts = item.split(" ")
+ quantity = float(parts[0]) * scale
+ unit = parts[1]
+ ingredient_name = " ".join(parts[2:])
+
+ if quantity.is_integer():
+ quantity_str = str(int(quantity))
+ else:
+ quantity_str = str(quantity)
+
+ scaled.append(f"{quantity_str} {unit} {ingredient_name}")
+
+ return scaled
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c8.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c8.md
new file mode 100644
index 00000000000..9bbbc3dadc2
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c8.md
@@ -0,0 +1,67 @@
+---
+id: 68ffb91507a5b645769328c8
+title: "Challenge 105: Character Count"
+challengeType: 29
+dashedName: challenge-105
+---
+
+# --description--
+
+Given a sentence string, return an array with a count of each character in alphabetical order.
+
+- Treat upper and lowercase letters as the same letter when counting.
+- Ignore numbers, spaces, punctuation, etc.
+- Return the count and letter in the format `"letter count"`. For instance, `"a 3"`.
+- All returned letters should be lowercase.
+- Do not return a count of letters that are not in the given string.
+
+# --hints--
+
+`count_characters("hello world")` should return `["d 1", "e 1", "h 1", "l 3", "o 2", "r 1", "w 1"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(count_characters("hello world"), ["d 1", "e 1", "h 1", "l 3", "o 2", "r 1", "w 1"])`)
+}})
+```
+
+`count_characters("I love coding challenges!")` should return `["a 1", "c 2", "d 1", "e 3", "g 2", "h 1", "i 2", "l 3", "n 2", "o 2", "s 1", "v 1"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(count_characters("I love coding challenges!"), ["a 1", "c 2", "d 1", "e 3", "g 2", "h 1", "i 2", "l 3", "n 2", "o 2", "s 1", "v 1"])`)
+}})
+```
+
+`count_characters("// TODO: Complete this challenge ASAP!")` should return `["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"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(count_characters("// TODO: Complete this challenge ASAP!"), ["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"])`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def count_characters(sentence):
+
+ return sentence
+```
+
+# --solutions--
+
+```py
+def count_characters(sentence):
+ from collections import Counter
+
+ letters = [c.lower() for c in sentence if c.isalpha()]
+ counts = Counter(letters)
+
+ return [f"{letter} {counts[letter]}" for letter in sorted(counts)]
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c9.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c9.md
new file mode 100644
index 00000000000..f1232f893f0
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328c9.md
@@ -0,0 +1,87 @@
+---
+id: 68ffb91507a5b645769328c9
+title: "Challenge 106: Message Validator"
+challengeType: 29
+dashedName: challenge-106
+---
+
+# --description--
+
+Given a message string and a validation string, determine if the message is valid.
+
+- A message is valid if each word in the message starts with the corresponding letter in the validation string, in order.
+- Letters are case-insensitive.
+- Words in the message are separated by single spaces.
+
+# --hints--
+
+`is_valid_message("hello world", "hw")` should return `True`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_valid_message("hello world", "hw"), True)`)
+}})
+```
+
+`is_valid_message("ALL CAPITAL LETTERS", "acl")` should return `True`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_valid_message("ALL CAPITAL LETTERS", "acl"), True)`)
+}})
+```
+
+`is_valid_message("Coding challenge are boring.", "cca")` should return `False`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_valid_message("Coding challenge are boring.", "cca"), False)`)
+}})
+```
+
+`is_valid_message("The quick brown fox jumps over the lazy dog.", "TQBFJOTLD")` should return `True`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_valid_message("The quick brown fox jumps over the lazy dog.", "TQBFJOTLD"), True)`)
+}})
+```
+
+`is_valid_message("The quick brown fox jumps over the lazy dog.", "TQBFJOTLDT")` should return `False`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_valid_message("The quick brown fox jumps over the lazy dog.", "TQBFJOTLDT"), False)`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def is_valid_message(message, validation):
+
+ return message
+```
+
+# --solutions--
+
+```py
+def is_valid_message(message, validation):
+ words = message.split()
+
+ if len(words) != len(validation):
+ return False
+
+ for word, val_letter in zip(words, validation):
+ if word[0].lower() != val_letter.lower():
+ return False
+
+ return True
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328ca.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328ca.md
new file mode 100644
index 00000000000..af0c86a0f24
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328ca.md
@@ -0,0 +1,88 @@
+---
+id: 68ffb91507a5b645769328ca
+title: "Challenge 107: FizzBuzz"
+challengeType: 29
+dashedName: challenge-107
+---
+
+# --description--
+
+Given an integer (`n`), return an array of integers from `1` to `n` (inclusive), replacing numbers that a multiple of:
+
+- 3 with `"Fizz"`.
+- 5 with `"Buzz"`.
+- 3 and 5 with `"FizzBuzz"`.
+
+# --hints--
+
+`fizz_buzz(2)` should return `[1, 2]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(fizz_buzz(2), [1, 2])`)
+}})
+```
+
+`fizz_buzz(4)` should return `[1, 2, "Fizz", 4]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(fizz_buzz(4), [1, 2, "Fizz", 4])`)
+}})
+```
+
+`fizz_buzz(8)` should return `[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(fizz_buzz(8), [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8])`)
+}})
+```
+
+`fizz_buzz(20)` should return `[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(fizz_buzz(20), [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16, 17, "Fizz", 19, "Buzz"])`)
+}})
+```
+
+`fizz_buzz(50)` should return `[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"]`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(fizz_buzz(50), [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"])`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def fizz_buzz(n):
+
+ return n
+```
+
+# --solutions--
+
+```py
+def fizz_buzz(n):
+ result = []
+ for i in range(1, n+1):
+ if i % 15 == 0:
+ result.append("FizzBuzz")
+ elif i % 3 == 0:
+ result.append("Fizz")
+ elif i % 5 == 0:
+ result.append("Buzz")
+ else:
+ result.append(i)
+ return result
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328cb.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328cb.md
new file mode 100644
index 00000000000..a754f17a2e6
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328cb.md
@@ -0,0 +1,108 @@
+---
+id: 68ffb91507a5b645769328cb
+title: "Challenge 108: BuzzFizz"
+challengeType: 29
+dashedName: challenge-108
+---
+
+# --description--
+
+Given an array, determine if it is a correct FizzBuzz sequence from 1 to the last item in the array. A sequence is correct if:
+
+- Numbers that are multiples of 3 are replaced with "Fizz"
+- Numbers that are multiples of 5 are replaced with "Buzz"
+- Numbers that are multiples of both 3 and 5 are replaced with "FizzBuzz"
+- All other numbers remain as integers in ascending order, starting from 1.
+- The array must start at 1 and have no missing or extra elements.
+
+# --hints--
+
+`is_fizz_buzz([1, 2, "Fizz", 4])` should return `True`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_fizz_buzz([1, 2, "Fizz", 4]), True)`)
+}})
+```
+
+`is_fizz_buzz([1, 2, 3, 4])` should return `False`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_fizz_buzz([1, 2, 3, 4]), False)`)
+}})
+```
+
+`is_fizz_buzz([1, 2, "Fizz", 4, "Buzz", 7])` should return `False`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_fizz_buzz([1, 2, "Fizz", 4, "Buzz", 7]), False)`)
+}})
+```
+
+`is_fizz_buzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "FizzBuzz"])` should return `False`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_fizz_buzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "FizzBuzz"]), False)`)
+}})
+```
+
+`is_fizz_buzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "Fizz"])` should return `False`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_fizz_buzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "Fizz"]), False)`)
+}})
+```
+
+`is_fizz_buzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "Buzz"])` should return `False`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_fizz_buzz([1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, "Buzz"]), False)`)
+}})
+```
+
+`is_fizz_buzz([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"])` should return `True`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertIs(is_fizz_buzz([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"]), True)`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def is_fizz_buzz(sequence):
+
+ return sequence
+```
+
+# --solutions--
+
+```py
+def is_fizz_buzz(sequence):
+ for i, val in enumerate(sequence):
+ n = i + 1
+ if n % 15 == 0 and val != "FizzBuzz":
+ return False
+ if n % 3 == 0 and n % 5 != 0 and val != "Fizz":
+ return False
+ if n % 5 == 0 and n % 3 != 0 and val != "Buzz":
+ return False
+ if n % 3 != 0 and n % 5 != 0 and val != n:
+ return False
+ return True
+```
diff --git a/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328cc.md b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328cc.md
new file mode 100644
index 00000000000..5df95de8825
--- /dev/null
+++ b/curriculum/challenges/english/blocks/daily-coding-challenges-python/68ffb91507a5b645769328cc.md
@@ -0,0 +1,87 @@
+---
+id: 68ffb91507a5b645769328cc
+title: "Challenge 109: What's My Age Again?"
+challengeType: 29
+dashedName: challenge-109
+---
+
+# --description--
+
+Given the date of someone's birthday in the format `YYYY-MM-DD`, return the person's age as of November 27th, 2025.
+
+- Assume all birthdays are valid dates before November 27th, 2025.
+- Return the age as an integer.
+- Be sure to account for whether the person has already had their birthday in 2025.
+
+# --hints--
+
+`calculate_age("2000-11-20")` should return `25`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(calculate_age("2000-11-20"), 25)`)
+}})
+```
+
+`calculate_age("2000-12-01")` should return `24`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(calculate_age("2000-12-01"), 24)`)
+}})
+```
+
+`calculate_age("2014-10-25")` should return `11`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(calculate_age("2014-10-25"), 11)`)
+}})
+```
+
+`calculate_age("1994-01-06")` should return `31`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(calculate_age("1994-01-06"), 31)`)
+}})
+```
+
+`calculate_age("1994-12-14")` should return `30`.
+
+```js
+({test: () => { runPython(`
+from unittest import TestCase
+TestCase().assertEqual(calculate_age("1994-12-14"), 30)`)
+}})
+```
+
+# --seed--
+
+## --seed-contents--
+
+```py
+def calculate_age(birthday):
+
+ return birthday
+```
+
+# --solutions--
+
+```py
+from datetime import datetime
+def calculate_age(birthday):
+ today = datetime(2025, 11, 27)
+ birth_date = datetime.strptime(birthday, "%Y-%m-%d")
+
+ age = today.year - birth_date.year
+
+ if (today.month, today.day) < (birth_date.month, birth_date.day):
+ age -= 1
+
+ return age
+```
diff --git a/curriculum/structure/blocks/daily-coding-challenges-javascript.json b/curriculum/structure/blocks/daily-coding-challenges-javascript.json
index 4b094571ed4..efa83179cfc 100644
--- a/curriculum/structure/blocks/daily-coding-challenges-javascript.json
+++ b/curriculum/structure/blocks/daily-coding-challenges-javascript.json
@@ -402,6 +402,46 @@
{
"id": "68f6587287ad1f4ad39b0c85",
"title": "Challenge 99: Fingerprint Test"
+ },
+ {
+ "id": "68ffb91507a5b645769328c3",
+ "title": "Challenge 100: 100 Characters"
+ },
+ {
+ "id": "68ffb91507a5b645769328c4",
+ "title": "Challenge 101: Markdown Heading Converter"
+ },
+ {
+ "id": "68ffb91507a5b645769328c5",
+ "title": "Challenge 102: Longest Word"
+ },
+ {
+ "id": "68ffb91507a5b645769328c6",
+ "title": "Challenge 103: LCM"
+ },
+ {
+ "id": "68ffb91507a5b645769328c7",
+ "title": "Challenge 104: Recipe Scaler"
+ },
+ {
+ "id": "68ffb91507a5b645769328c8",
+ "title": "Challenge 105: Character Count"
+ },
+ {
+ "id": "68ffb91507a5b645769328c9",
+ "title": "Challenge 106: Message Validator"
+ },
+ {
+ "id": "68ffb91507a5b645769328ca",
+ "title": "Challenge 107: FizzBuzz"
+ },
+ {
+ "id": "68ffb91507a5b645769328cb",
+ "title": "Challenge 108: BuzzFizz"
+ },
+ {
+ "id": "68ffb91507a5b645769328cc",
+ "title": "Challenge 109: What's My Age Again?"
}
]
}
diff --git a/curriculum/structure/blocks/daily-coding-challenges-python.json b/curriculum/structure/blocks/daily-coding-challenges-python.json
index 3802430272f..49da83fc496 100644
--- a/curriculum/structure/blocks/daily-coding-challenges-python.json
+++ b/curriculum/structure/blocks/daily-coding-challenges-python.json
@@ -401,6 +401,46 @@
{
"id": "68f6587287ad1f4ad39b0c85",
"title": "Challenge 99: Fingerprint Test"
+ },
+ {
+ "id": "68ffb91507a5b645769328c3",
+ "title": "Challenge 100: 100 Characters"
+ },
+ {
+ "id": "68ffb91507a5b645769328c4",
+ "title": "Challenge 101: Markdown Heading Converter"
+ },
+ {
+ "id": "68ffb91507a5b645769328c5",
+ "title": "Challenge 102: Longest Word"
+ },
+ {
+ "id": "68ffb91507a5b645769328c6",
+ "title": "Challenge 103: LCM"
+ },
+ {
+ "id": "68ffb91507a5b645769328c7",
+ "title": "Challenge 104: Recipe Scaler"
+ },
+ {
+ "id": "68ffb91507a5b645769328c8",
+ "title": "Challenge 105: Character Count"
+ },
+ {
+ "id": "68ffb91507a5b645769328c9",
+ "title": "Challenge 106: Message Validator"
+ },
+ {
+ "id": "68ffb91507a5b645769328ca",
+ "title": "Challenge 107: FizzBuzz"
+ },
+ {
+ "id": "68ffb91507a5b645769328cb",
+ "title": "Challenge 108: BuzzFizz"
+ },
+ {
+ "id": "68ffb91507a5b645769328cc",
+ "title": "Challenge 109: What's My Age Again?"
}
]
}
diff --git a/tools/daily-challenges/seed-daily-challenges.ts b/tools/daily-challenges/seed-daily-challenges.ts
index 81a6d501b1f..b78a95b8780 100644
--- a/tools/daily-challenges/seed-daily-challenges.ts
+++ b/tools/daily-challenges/seed-daily-challenges.ts
@@ -13,7 +13,7 @@ const { MONGOHQ_URL } = process.env;
// Number challenges in the dev-playground blocks
// Update this if the number of challenges changes
-const EXPECTED_CHALLENGE_COUNT = 99;
+const EXPECTED_CHALLENGE_COUNT = 109;
// Date to set for the first challenge, second challenge will be one day later, etc...
// **DO NOT CHANGE THIS AFTER RELEASE (if seeding production - okay for local dev)**