Files
wehub-resource-sync dde272c4b8
i18n - Build Validation / Validate i18n Builds (24) (push) Has been cancelled
CI - Node.js / Lint (24) (push) Has been cancelled
CI - Node.js / Build (24) (push) Has been cancelled
CI - Node.js / Test (24) (push) Has been cancelled
CI - Node.js / Test - Upcoming Changes (24) (push) Has been cancelled
CI - Node.js / Test - i18n (italian, 24) (push) Has been cancelled
CI - Node.js / Test - i18n (portuguese, 24) (push) Has been cancelled
CD - Docker - GHCR Images / Build and Push Images (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:55:53 +08:00

2.8 KiB

id, title, challengeType, dashedName
id title challengeType dashedName
68ffb91507a5b645769328c4 Challenge 101: Markdown Heading Converter 29 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 "<h1>My level 1 heading</h1>".

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 "<h1>My level 1 heading</h1>".

({test: () => { runPython(`
from unittest import TestCase
TestCase().assertEqual(convert("# My level 1 heading"), "<h1>My level 1 heading</h1>")`)
}})

convert("My heading") should return "Invalid format".

({test: () => { runPython(`
from unittest import TestCase
TestCase().assertEqual(convert("My heading"), "Invalid format")`)
}})

convert("##### My level 5 heading") should return "<h5>My level 5 heading</h5>".

({test: () => { runPython(`
from unittest import TestCase
TestCase().assertEqual(convert("##### My level 5 heading"), "<h5>My level 5 heading</h5>")`)
}})

convert("#My heading") should return "Invalid format".

({test: () => { runPython(`
from unittest import TestCase
TestCase().assertEqual(convert("#My heading"), "Invalid format")`)
}})

convert(" ### My level 3 heading") should return "<h3>My level 3 heading</h3>".

({test: () => { runPython(`
from unittest import TestCase
TestCase().assertEqual(convert("  ###  My level 3 heading"), "<h3>My level 3 heading</h3>")`)
}})

convert("####### My level 7 heading") should return "Invalid format".

({test: () => { runPython(`
from unittest import TestCase
TestCase().assertEqual(convert("####### My level 7 heading"), "Invalid format")`)
}})

convert("## My #2 heading") should return "<h2>My #2 heading</h2>".

({test: () => { runPython(`
from unittest import TestCase
TestCase().assertEqual(convert("## My #2 heading"), "<h2>My #2 heading</h2>")`)
}})

--seed--

--seed-contents--

def convert(heading):

    return heading

--solutions--

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"<h{hash_count}>{text}</h{hash_count}>"