From 020d0827eb155125a6d1402b9ecd9b4fbd350e3b Mon Sep 17 00:00:00 2001 From: Eric Willigers Date: Wed, 3 Jul 2024 19:56:48 +1000 Subject: [PATCH] Add micro-blog exercise --- config.json | 8 +++ .../practice/micro-blog/.docs/instructions.md | 37 ++++++++++++++ .../practice/micro-blog/.meta/config.json | 17 +++++++ .../practice/micro-blog/.meta/tests.toml | 46 +++++++++++++++++ exercises/practice/micro-blog/dub.sdl | 2 + .../practice/micro-blog/example/micro_blog.d | 10 ++++ .../practice/micro-blog/source/micro_blog.d | 50 +++++++++++++++++++ 7 files changed, 170 insertions(+) create mode 100644 exercises/practice/micro-blog/.docs/instructions.md create mode 100644 exercises/practice/micro-blog/.meta/config.json create mode 100644 exercises/practice/micro-blog/.meta/tests.toml create mode 100644 exercises/practice/micro-blog/dub.sdl create mode 100644 exercises/practice/micro-blog/example/micro_blog.d create mode 100644 exercises/practice/micro-blog/source/micro_blog.d diff --git a/config.json b/config.json index e9c5dac..3d3b815 100644 --- a/config.json +++ b/config.json @@ -336,6 +336,14 @@ "error_handling" ] }, + { + "slug": "micro-blog", + "name": "Micro Blog", + "uuid": "8d36d22e-f33f-4753-9d10-486159a256ab", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "resistor-color", "name": "Resistor Color", diff --git a/exercises/practice/micro-blog/.docs/instructions.md b/exercises/practice/micro-blog/.docs/instructions.md new file mode 100644 index 0000000..d6c6cf6 --- /dev/null +++ b/exercises/practice/micro-blog/.docs/instructions.md @@ -0,0 +1,37 @@ +# Instructions + +You have identified a gap in the social media market for very very short posts. +Now that Twitter allows 280 character posts, people wanting quick social media updates aren't being served. +You decide to create your own social media network. + +To make your product noteworthy, you make it extreme and only allow posts of 5 or less characters. +Any posts of more than 5 characters should be truncated to 5. + +To allow your users to express themselves fully, you allow Emoji and other Unicode. + +The task is to truncate input strings to 5 characters. + +## Text Encodings + +Text stored digitally has to be converted to a series of bytes. +There are 3 ways to map characters to bytes in common use. + +- **ASCII** can encode English language characters. + All characters are precisely 1 byte long. +- **UTF-8** is a Unicode text encoding. + Characters take between 1 and 4 bytes. +- **UTF-16** is a Unicode text encoding. + Characters are either 2 or 4 bytes long. + +UTF-8 and UTF-16 are both Unicode encodings which means they're capable of representing a massive range of characters including: + +- Text in most of the world's languages and scripts +- Historic text +- Emoji + +UTF-8 and UTF-16 are both variable length encodings, which means that different characters take up different amounts of space. + +Consider the letter 'a' and the emoji 'πŸ˜›'. +In UTF-16 the letter takes 2 bytes but the emoji takes 4 bytes. + +The trick to this exercise is to use APIs designed around Unicode characters (codepoints) instead of Unicode codeunits. diff --git a/exercises/practice/micro-blog/.meta/config.json b/exercises/practice/micro-blog/.meta/config.json new file mode 100644 index 0000000..e3b98b8 --- /dev/null +++ b/exercises/practice/micro-blog/.meta/config.json @@ -0,0 +1,17 @@ +{ + "authors": [ + "keiravillekode" + ], + "files": { + "solution": [ + "source/micro_blog.d" + ], + "test": [ + "source/micro_blog.d" + ], + "example": [ + "example/micro_blog.d" + ] + }, + "blurb": "Given an input string, truncate it to 5 characters." +} diff --git a/exercises/practice/micro-blog/.meta/tests.toml b/exercises/practice/micro-blog/.meta/tests.toml new file mode 100644 index 0000000..f23ff0b --- /dev/null +++ b/exercises/practice/micro-blog/.meta/tests.toml @@ -0,0 +1,46 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[b927b57f-7c98-42fd-8f33-fae091dc1efc] +description = "English language short" + +[a3fcdc5b-0ed4-4f49-80f5-b1a293eac2a0] +description = "English language long" + +[01910864-8e15-4007-9c7c-ac956c686e60] +description = "German language short (broth)" + +[f263e488-aefb-478f-a671-b6ba99722543] +description = "German language long (bear carpet β†’ beards)" + +[0916e8f1-41d7-4402-a110-b08aa000342c] +description = "Bulgarian language short (good)" + +[bed6b89c-03df-4154-98e6-a61a74f61b7d] +description = "Greek language short (health)" + +[485a6a70-2edb-424d-b999-5529dbc8e002] +description = "Maths short" + +[8b4b7b51-8f48-4fbe-964e-6e4e6438be28] +description = "Maths long" + +[71f4a192-0566-4402-a512-fe12878be523] +description = "English and emoji short" + +[6f0f71f3-9806-4759-a844-fa182f7bc203] +description = "Emoji short" + +[ce71fb92-5214-46d0-a7f8-d5ba56b4cc6e] +description = "Emoji long" + +[5dee98d2-d56e-468a-a1f2-121c3f7c5a0b] +description = "Royal Flush?" diff --git a/exercises/practice/micro-blog/dub.sdl b/exercises/practice/micro-blog/dub.sdl new file mode 100644 index 0000000..53efa61 --- /dev/null +++ b/exercises/practice/micro-blog/dub.sdl @@ -0,0 +1,2 @@ +name "micro-blog" +buildRequirements "disallowDeprecations" diff --git a/exercises/practice/micro-blog/example/micro_blog.d b/exercises/practice/micro-blog/example/micro_blog.d new file mode 100644 index 0000000..0a2c3bd --- /dev/null +++ b/exercises/practice/micro-blog/example/micro_blog.d @@ -0,0 +1,10 @@ +module micro_blog; + +import std.algorithm : min; +import std.conv : to; + +pure string truncate(immutable string phrase) +{ + dstring str = phrase.to!dstring; + return str[0..min(5, str.length)].to!string; +} diff --git a/exercises/practice/micro-blog/source/micro_blog.d b/exercises/practice/micro-blog/source/micro_blog.d new file mode 100644 index 0000000..7f9bd69 --- /dev/null +++ b/exercises/practice/micro-blog/source/micro_blog.d @@ -0,0 +1,50 @@ +module micro_blog; + +pure string truncate(immutable string phrase) +{ + // implement this function +} + +unittest +{ + immutable int allTestsEnabled = 0; + + // English language short + assert(truncate("Hi") == "Hi"); + + static if (allTestsEnabled) + { + // English language long + assert(truncate("Hello there") == "Hello"); + + // German language short (broth) + assert(truncate("brΓΌhe") == "brΓΌhe"); + + // German language long (bear carpet β†’ beards) + assert(truncate("BΓ€rteppich") == "BΓ€rte"); + + // Bulgarian language short (good) + assert(truncate("Π”ΠΎΠ±ΡŠΡ€") == "Π”ΠΎΠ±ΡŠΡ€"); + + // Greek language short (health) + assert(truncate("υγΡιά") == "υγΡιά"); + + // Maths short + assert(truncate("a=Ο€rΒ²") == "a=Ο€rΒ²"); + + // Maths long + assert(truncate("βˆ…βŠŠβ„•βŠŠβ„€βŠŠβ„šβŠŠβ„βŠŠβ„‚") == "βˆ…βŠŠβ„•βŠŠβ„€"); + + // English and emoji short + assert(truncate("Fly πŸ›«") == "Fly πŸ›«"); + + // Emoji short + assert(truncate("πŸ’‡") == "πŸ’‡"); + + // Emoji long + assert(truncate("β„πŸŒ‘πŸ€§πŸ€’πŸ₯πŸ•°πŸ˜€") == "β„πŸŒ‘πŸ€§πŸ€’πŸ₯"); + + // Royal Flush? + assert(truncate("πŸƒŽπŸ‚ΈπŸƒ…πŸƒ‹πŸƒπŸƒπŸƒŠ") == "πŸƒŽπŸ‚ΈπŸƒ…πŸƒ‹πŸƒ"); + } +}